| @@ -20,7 +20,7 @@ import ( | |||
| // Test that go1.2 tag above is included in builds. main.go refers to this definition. | |||
| const go12tag = true | |||
| const APP_VER = "0.1.5.0322.2" | |||
| const APP_VER = "0.1.6.0323.1" | |||
| func init() { | |||
| base.AppVer = APP_VER | |||
| @@ -88,7 +88,6 @@ func CommitRepoAction(userId int64, userName string, | |||
| return err | |||
| } | |||
| repo.IsBare = false | |||
| repo.Updated = time.Now() | |||
| if err = UpdateRepository(repo); err != nil { | |||
| return err | |||
| } | |||
| @@ -4,16 +4,127 @@ | |||
| package models | |||
| import ( | |||
| "strings" | |||
| "time" | |||
| "github.com/gogits/gogs/modules/base" | |||
| ) | |||
| // Issue represents an issue or pull request of repository. | |||
| type Issue struct { | |||
| Id int64 | |||
| RepoId int64 `xorm:"index"` | |||
| PosterId int64 | |||
| Id int64 | |||
| Index int64 // Index in one repository. | |||
| Name string | |||
| RepoId int64 `xorm:"index"` | |||
| PosterId int64 | |||
| MilestoneId int64 | |||
| AssigneeId int64 | |||
| IsPull bool // Indicates whether is a pull request or not. | |||
| IsClosed bool | |||
| Labels string | |||
| Mentions string | |||
| Content string | |||
| NumComments int | |||
| Created time.Time `xorm:"created"` | |||
| Updated time.Time `xorm:"updated"` | |||
| } | |||
| // CreateIssue creates new issue for repository. | |||
| func CreateIssue(userId, repoId, milestoneId, assigneeId int64, name, labels, mentions, content string, isPull bool) error { | |||
| count, err := GetIssueCount(repoId) | |||
| if err != nil { | |||
| return err | |||
| } | |||
| _, err = orm.Insert(&Issue{ | |||
| Index: count + 1, | |||
| Name: name, | |||
| RepoId: repoId, | |||
| PosterId: userId, | |||
| MilestoneId: milestoneId, | |||
| AssigneeId: assigneeId, | |||
| IsPull: isPull, | |||
| Labels: labels, | |||
| Mentions: mentions, | |||
| Content: content, | |||
| }) | |||
| return err | |||
| } | |||
| type PullRequest struct { | |||
| Id int64 | |||
| // GetIssueCount returns count of issues in the repository. | |||
| func GetIssueCount(repoId int64) (int64, error) { | |||
| return orm.Count(&Issue{RepoId: repoId}) | |||
| } | |||
| // GetIssues returns a list of issues by given conditions. | |||
| func GetIssues(userId, repoId, posterId, milestoneId int64, page int, isClosed, isMention bool, labels, sortType string) ([]Issue, error) { | |||
| sess := orm.Limit(20, (page-1)*20).Where("repo_id=?", repoId).And("is_closed=?", isClosed) | |||
| if userId > 0 { | |||
| sess = sess.And("assignee_id=?", userId) | |||
| } else if posterId > 0 { | |||
| sess = sess.And("poster_id=?", posterId) | |||
| } else if isMention { | |||
| sess = sess.And("mentions like '%$" + base.ToStr(userId) + "|%'") | |||
| } | |||
| if milestoneId > 0 { | |||
| sess = sess.And("milestone_id=?", milestoneId) | |||
| } | |||
| if len(labels) > 0 { | |||
| for _, label := range strings.Split(labels, ",") { | |||
| sess = sess.And("mentions like '%$" + label + "|%'") | |||
| } | |||
| } | |||
| switch sortType { | |||
| case "oldest": | |||
| sess = sess.Asc("created") | |||
| case "recentupdate": | |||
| sess = sess.Desc("updated") | |||
| case "leastupdate": | |||
| sess = sess.Asc("updated") | |||
| case "mostcomment": | |||
| sess = sess.Desc("num_comments") | |||
| case "leastcomment": | |||
| sess = sess.Asc("num_comments") | |||
| default: | |||
| sess = sess.Desc("created") | |||
| } | |||
| var issues []Issue | |||
| err := sess.Find(&issues) | |||
| return issues, err | |||
| } | |||
| // Label represents a list of labels of repository for issues. | |||
| type Label struct { | |||
| Id int64 | |||
| RepoId int64 `xorm:"index"` | |||
| Names string | |||
| Colors string | |||
| } | |||
| // Milestone represents a milestone of repository. | |||
| type Milestone struct { | |||
| Id int64 | |||
| Name string | |||
| RepoId int64 `xorm:"index"` | |||
| IsClosed bool | |||
| Content string | |||
| NumIssues int | |||
| DueDate time.Time | |||
| Created time.Time `xorm:"created"` | |||
| } | |||
| // Comment represents a comment in commit and issue page. | |||
| type Comment struct { | |||
| Id int64 | |||
| Id int64 | |||
| PosterId int64 | |||
| IssueId int64 | |||
| CommitId int64 | |||
| Line int | |||
| Content string | |||
| Created time.Time `xorm:"created"` | |||
| } | |||
| @@ -72,7 +72,7 @@ func setEngine() { | |||
| func NewEngine() { | |||
| setEngine() | |||
| if err := orm.Sync(new(User), new(PublicKey), new(Repository), new(Watch), | |||
| new(Action), new(Access)); err != nil { | |||
| new(Action), new(Access), new(Issue)); err != nil { | |||
| fmt.Printf("sync database struct error: %v\n", err) | |||
| os.Exit(2) | |||
| } | |||
| @@ -0,0 +1,30 @@ | |||
| // Copyright 2014 The Gogs Authors. All rights reserved. | |||
| // Use of this source code is governed by a MIT-style | |||
| // license that can be found in the LICENSE file. | |||
| package repo | |||
| import ( | |||
| "github.com/codegangsta/martini" | |||
| "github.com/gogits/gogs/models" | |||
| "github.com/gogits/gogs/modules/base" | |||
| "github.com/gogits/gogs/modules/middleware" | |||
| ) | |||
| func Issues(ctx *middleware.Context, params martini.Params) { | |||
| ctx.Data["IsRepoToolbarIssues"] = true | |||
| milestoneId, _ := base.StrTo(params["milestone"]).Int() | |||
| page, _ := base.StrTo(params["page"]).Int() | |||
| var err error | |||
| ctx.Data["Issues"], err = models.GetIssues(0, ctx.Repo.Repository.Id, 0, | |||
| int64(milestoneId), page, params["state"] == "closed", false, params["labels"], params["sortType"]) | |||
| if err != nil { | |||
| ctx.Handle(200, "issue.Issues: %v", err) | |||
| return | |||
| } | |||
| ctx.HTML(200, "repo/issues") | |||
| } | |||
| @@ -5,8 +5,17 @@ | |||
| package repo | |||
| import ( | |||
| "path" | |||
| "strings" | |||
| "github.com/codegangsta/martini" | |||
| "github.com/gogits/git" | |||
| "github.com/gogits/webdav" | |||
| "github.com/gogits/gogs/models" | |||
| "github.com/gogits/gogs/modules/auth" | |||
| "github.com/gogits/gogs/modules/base" | |||
| "github.com/gogits/gogs/modules/log" | |||
| "github.com/gogits/gogs/modules/middleware" | |||
| ) | |||
| @@ -61,3 +70,288 @@ func SettingPost(ctx *middleware.Context) { | |||
| log.Trace("%s Repository deleted: %s/%s", ctx.Req.RequestURI, ctx.User.LowerName, ctx.Repo.Repository.LowerName) | |||
| ctx.Redirect("/", 302) | |||
| } | |||
| func Branches(ctx *middleware.Context, params martini.Params) { | |||
| if !ctx.Repo.IsValid { | |||
| return | |||
| } | |||
| brs, err := models.GetBranches(params["username"], params["reponame"]) | |||
| if err != nil { | |||
| ctx.Handle(200, "repo.Branches", err) | |||
| return | |||
| } else if len(brs) == 0 { | |||
| ctx.Error(404) | |||
| return | |||
| } | |||
| ctx.Data["Username"] = params["username"] | |||
| ctx.Data["Reponame"] = params["reponame"] | |||
| ctx.Data["Branchname"] = brs[0] | |||
| ctx.Data["Branches"] = brs | |||
| ctx.Data["IsRepoToolbarBranches"] = true | |||
| ctx.HTML(200, "repo/branches") | |||
| } | |||
| func Single(ctx *middleware.Context, params martini.Params) { | |||
| if !ctx.Repo.IsValid { | |||
| return | |||
| } | |||
| if len(params["branchname"]) == 0 { | |||
| params["branchname"] = "master" | |||
| } | |||
| // Get tree path | |||
| treename := params["_1"] | |||
| if len(treename) > 0 && treename[len(treename)-1] == '/' { | |||
| ctx.Redirect("/"+ctx.Repo.Owner.LowerName+"/"+ | |||
| ctx.Repo.Repository.Name+"/src/"+params["branchname"]+"/"+treename[:len(treename)-1], 302) | |||
| return | |||
| } | |||
| ctx.Data["IsRepoToolbarSource"] = true | |||
| // Branches. | |||
| brs, err := models.GetBranches(params["username"], params["reponame"]) | |||
| if err != nil { | |||
| log.Error("repo.Single(GetBranches): %v", err) | |||
| ctx.Error(404) | |||
| return | |||
| } else if ctx.Repo.Repository.IsBare { | |||
| ctx.Data["IsBareRepo"] = true | |||
| ctx.HTML(200, "repo/single") | |||
| return | |||
| } | |||
| ctx.Data["Branches"] = brs | |||
| repoFile, err := models.GetTargetFile(params["username"], params["reponame"], | |||
| params["branchname"], params["commitid"], treename) | |||
| if err != nil && err != models.ErrRepoFileNotExist { | |||
| log.Error("repo.Single(GetTargetFile): %v", err) | |||
| ctx.Error(404) | |||
| return | |||
| } | |||
| branchLink := "/" + ctx.Repo.Owner.LowerName + "/" + ctx.Repo.Repository.Name + "/src/" + params["branchname"] | |||
| if len(treename) != 0 && repoFile == nil { | |||
| ctx.Error(404) | |||
| return | |||
| } | |||
| if repoFile != nil && repoFile.IsFile() { | |||
| if repoFile.Size > 1024*1024 || repoFile.Filemode != git.FileModeBlob { | |||
| ctx.Data["FileIsLarge"] = true | |||
| } else if blob, err := repoFile.LookupBlob(); err != nil { | |||
| log.Error("repo.Single(repoFile.LookupBlob): %v", err) | |||
| ctx.Error(404) | |||
| } else { | |||
| ctx.Data["IsFile"] = true | |||
| ctx.Data["FileName"] = repoFile.Name | |||
| ext := path.Ext(repoFile.Name) | |||
| if len(ext) > 0 { | |||
| ext = ext[1:] | |||
| } | |||
| ctx.Data["FileExt"] = ext | |||
| readmeExist := base.IsMarkdownFile(repoFile.Name) || base.IsReadmeFile(repoFile.Name) | |||
| ctx.Data["ReadmeExist"] = readmeExist | |||
| if readmeExist { | |||
| ctx.Data["FileContent"] = string(base.RenderMarkdown(blob.Contents(), "")) | |||
| } else { | |||
| ctx.Data["FileContent"] = string(blob.Contents()) | |||
| } | |||
| } | |||
| } else { | |||
| // Directory and file list. | |||
| files, err := models.GetReposFiles(params["username"], params["reponame"], | |||
| params["branchname"], params["commitid"], treename) | |||
| if err != nil { | |||
| log.Error("repo.Single(GetReposFiles): %v", err) | |||
| ctx.Error(404) | |||
| return | |||
| } | |||
| ctx.Data["Files"] = files | |||
| var readmeFile *models.RepoFile | |||
| for _, f := range files { | |||
| if !f.IsFile() || !base.IsReadmeFile(f.Name) { | |||
| continue | |||
| } else { | |||
| readmeFile = f | |||
| break | |||
| } | |||
| } | |||
| if readmeFile != nil { | |||
| ctx.Data["ReadmeExist"] = true | |||
| // if file large than 1M not show it | |||
| if readmeFile.Size > 1024*1024 || readmeFile.Filemode != git.FileModeBlob { | |||
| ctx.Data["FileIsLarge"] = true | |||
| } else if blob, err := readmeFile.LookupBlob(); err != nil { | |||
| log.Error("repo.Single(readmeFile.LookupBlob): %v", err) | |||
| ctx.Error(404) | |||
| return | |||
| } else { | |||
| // current repo branch link | |||
| ctx.Data["FileName"] = readmeFile.Name | |||
| ctx.Data["FileContent"] = string(base.RenderMarkdown(blob.Contents(), branchLink)) | |||
| } | |||
| } | |||
| } | |||
| ctx.Data["Username"] = params["username"] | |||
| ctx.Data["Reponame"] = params["reponame"] | |||
| ctx.Data["Branchname"] = params["branchname"] | |||
| var treenames []string | |||
| Paths := make([]string, 0) | |||
| if len(treename) > 0 { | |||
| treenames = strings.Split(treename, "/") | |||
| for i, _ := range treenames { | |||
| Paths = append(Paths, strings.Join(treenames[0:i+1], "/")) | |||
| } | |||
| ctx.Data["HasParentPath"] = true | |||
| if len(Paths)-2 >= 0 { | |||
| ctx.Data["ParentPath"] = "/" + Paths[len(Paths)-2] | |||
| } | |||
| } | |||
| // Get latest commit according username and repo name | |||
| commit, err := models.GetCommit(params["username"], params["reponame"], | |||
| params["branchname"], params["commitid"]) | |||
| if err != nil { | |||
| log.Error("repo.Single(GetCommit): %v", err) | |||
| ctx.Error(404) | |||
| return | |||
| } | |||
| ctx.Data["LastCommit"] = commit | |||
| ctx.Data["Paths"] = Paths | |||
| ctx.Data["Treenames"] = treenames | |||
| ctx.Data["BranchLink"] = branchLink | |||
| ctx.HTML(200, "repo/single") | |||
| } | |||
| func Http(ctx *middleware.Context, params martini.Params) { | |||
| /*if !ctx.Repo.IsValid { | |||
| return | |||
| }*/ | |||
| // TODO: access check | |||
| username := params["username"] | |||
| reponame := params["reponame"] | |||
| if strings.HasSuffix(reponame, ".git") { | |||
| reponame = reponame[:len(reponame)-4] | |||
| } | |||
| prefix := path.Join("/", username, params["reponame"]) | |||
| server := &webdav.Server{ | |||
| Fs: webdav.Dir(models.RepoPath(username, reponame)), | |||
| TrimPrefix: prefix, | |||
| Listings: true, | |||
| } | |||
| server.ServeHTTP(ctx.ResponseWriter, ctx.Req) | |||
| } | |||
| func Setting(ctx *middleware.Context, params martini.Params) { | |||
| if !ctx.Repo.IsOwner { | |||
| ctx.Error(404) | |||
| return | |||
| } | |||
| ctx.Data["IsRepoToolbarSetting"] = true | |||
| if ctx.Repo.Repository.IsBare { | |||
| ctx.Data["IsBareRepo"] = true | |||
| ctx.HTML(200, "repo/setting") | |||
| return | |||
| } | |||
| var title string | |||
| if t, ok := ctx.Data["Title"].(string); ok { | |||
| title = t | |||
| } | |||
| if len(params["branchname"]) == 0 { | |||
| params["branchname"] = "master" | |||
| } | |||
| ctx.Data["Branchname"] = params["branchname"] | |||
| ctx.Data["Title"] = title + " - settings" | |||
| ctx.HTML(200, "repo/setting") | |||
| } | |||
| func Commits(ctx *middleware.Context, params martini.Params) { | |||
| brs, err := models.GetBranches(params["username"], params["reponame"]) | |||
| if err != nil { | |||
| ctx.Handle(200, "repo.Commits", err) | |||
| return | |||
| } else if len(brs) == 0 { | |||
| ctx.Error(404) | |||
| return | |||
| } | |||
| ctx.Data["IsRepoToolbarCommits"] = true | |||
| commits, err := models.GetCommits(params["username"], | |||
| params["reponame"], params["branchname"]) | |||
| if err != nil { | |||
| ctx.Error(404) | |||
| return | |||
| } | |||
| ctx.Data["Username"] = params["username"] | |||
| ctx.Data["Reponame"] = params["reponame"] | |||
| ctx.Data["CommitCount"] = commits.Len() | |||
| ctx.Data["Commits"] = commits | |||
| ctx.HTML(200, "repo/commits") | |||
| } | |||
| func Pulls(ctx *middleware.Context) { | |||
| ctx.Data["IsRepoToolbarPulls"] = true | |||
| ctx.HTML(200, "repo/pulls") | |||
| } | |||
| func Action(ctx *middleware.Context, params martini.Params) { | |||
| var err error | |||
| switch params["action"] { | |||
| case "watch": | |||
| err = models.WatchRepo(ctx.User.Id, ctx.Repo.Repository.Id, true) | |||
| case "unwatch": | |||
| err = models.WatchRepo(ctx.User.Id, ctx.Repo.Repository.Id, false) | |||
| case "desc": | |||
| if !ctx.Repo.IsOwner { | |||
| ctx.Error(404) | |||
| return | |||
| } | |||
| ctx.Repo.Repository.Description = ctx.Query("desc") | |||
| ctx.Repo.Repository.Website = ctx.Query("site") | |||
| err = models.UpdateRepository(ctx.Repo.Repository) | |||
| } | |||
| if err != nil { | |||
| log.Error("repo.Action(%s): %v", params["action"], err) | |||
| ctx.JSON(200, map[string]interface{}{ | |||
| "ok": false, | |||
| "err": err.Error(), | |||
| }) | |||
| return | |||
| } | |||
| ctx.JSON(200, map[string]interface{}{ | |||
| "ok": true, | |||
| }) | |||
| } | |||
| @@ -1,301 +0,0 @@ | |||
| // Copyright 2014 The Gogs Authors. All rights reserved. | |||
| // Use of this source code is governed by a MIT-style | |||
| // license that can be found in the LICENSE file. | |||
| package repo | |||
| import ( | |||
| "path" | |||
| "strings" | |||
| "github.com/codegangsta/martini" | |||
| "github.com/gogits/git" | |||
| "github.com/gogits/webdav" | |||
| "github.com/gogits/gogs/models" | |||
| "github.com/gogits/gogs/modules/base" | |||
| "github.com/gogits/gogs/modules/log" | |||
| "github.com/gogits/gogs/modules/middleware" | |||
| ) | |||
| func Branches(ctx *middleware.Context, params martini.Params) { | |||
| if !ctx.Repo.IsValid { | |||
| return | |||
| } | |||
| brs, err := models.GetBranches(params["username"], params["reponame"]) | |||
| if err != nil { | |||
| ctx.Handle(200, "repo.Branches", err) | |||
| return | |||
| } else if len(brs) == 0 { | |||
| ctx.Error(404) | |||
| return | |||
| } | |||
| ctx.Data["Username"] = params["username"] | |||
| ctx.Data["Reponame"] = params["reponame"] | |||
| ctx.Data["Branchname"] = brs[0] | |||
| ctx.Data["Branches"] = brs | |||
| ctx.Data["IsRepoToolbarBranches"] = true | |||
| ctx.HTML(200, "repo/branches") | |||
| } | |||
| func Single(ctx *middleware.Context, params martini.Params) { | |||
| if !ctx.Repo.IsValid { | |||
| return | |||
| } | |||
| if len(params["branchname"]) == 0 { | |||
| params["branchname"] = "master" | |||
| } | |||
| // Get tree path | |||
| treename := params["_1"] | |||
| if len(treename) > 0 && treename[len(treename)-1] == '/' { | |||
| ctx.Redirect("/"+ctx.Repo.Owner.LowerName+"/"+ | |||
| ctx.Repo.Repository.Name+"/src/"+params["branchname"]+"/"+treename[:len(treename)-1], 302) | |||
| return | |||
| } | |||
| ctx.Data["IsRepoToolbarSource"] = true | |||
| // Branches. | |||
| brs, err := models.GetBranches(params["username"], params["reponame"]) | |||
| if err != nil { | |||
| log.Error("repo.Single(GetBranches): %v", err) | |||
| ctx.Error(404) | |||
| return | |||
| } else if ctx.Repo.Repository.IsBare { | |||
| ctx.Data["IsBareRepo"] = true | |||
| ctx.HTML(200, "repo/single") | |||
| return | |||
| } | |||
| ctx.Data["Branches"] = brs | |||
| repoFile, err := models.GetTargetFile(params["username"], params["reponame"], | |||
| params["branchname"], params["commitid"], treename) | |||
| if err != nil && err != models.ErrRepoFileNotExist { | |||
| log.Error("repo.Single(GetTargetFile): %v", err) | |||
| ctx.Error(404) | |||
| return | |||
| } | |||
| branchLink := "/" + ctx.Repo.Owner.LowerName + "/" + ctx.Repo.Repository.Name + "/src/" + params["branchname"] | |||
| if len(treename) != 0 && repoFile == nil { | |||
| ctx.Error(404) | |||
| return | |||
| } | |||
| if repoFile != nil && repoFile.IsFile() { | |||
| if repoFile.Size > 1024*1024 || repoFile.Filemode != git.FileModeBlob { | |||
| ctx.Data["FileIsLarge"] = true | |||
| } else if blob, err := repoFile.LookupBlob(); err != nil { | |||
| log.Error("repo.Single(repoFile.LookupBlob): %v", err) | |||
| ctx.Error(404) | |||
| } else { | |||
| ctx.Data["IsFile"] = true | |||
| ctx.Data["FileName"] = repoFile.Name | |||
| ext := path.Ext(repoFile.Name) | |||
| if len(ext) > 0 { | |||
| ext = ext[1:] | |||
| } | |||
| ctx.Data["FileExt"] = ext | |||
| readmeExist := base.IsMarkdownFile(repoFile.Name) || base.IsReadmeFile(repoFile.Name) | |||
| ctx.Data["ReadmeExist"] = readmeExist | |||
| if readmeExist { | |||
| ctx.Data["FileContent"] = string(base.RenderMarkdown(blob.Contents(), "")) | |||
| } else { | |||
| ctx.Data["FileContent"] = string(blob.Contents()) | |||
| } | |||
| } | |||
| } else { | |||
| // Directory and file list. | |||
| files, err := models.GetReposFiles(params["username"], params["reponame"], | |||
| params["branchname"], params["commitid"], treename) | |||
| if err != nil { | |||
| log.Error("repo.Single(GetReposFiles): %v", err) | |||
| ctx.Error(404) | |||
| return | |||
| } | |||
| ctx.Data["Files"] = files | |||
| var readmeFile *models.RepoFile | |||
| for _, f := range files { | |||
| if !f.IsFile() || !base.IsReadmeFile(f.Name) { | |||
| continue | |||
| } else { | |||
| readmeFile = f | |||
| break | |||
| } | |||
| } | |||
| if readmeFile != nil { | |||
| ctx.Data["ReadmeExist"] = true | |||
| // if file large than 1M not show it | |||
| if readmeFile.Size > 1024*1024 || readmeFile.Filemode != git.FileModeBlob { | |||
| ctx.Data["FileIsLarge"] = true | |||
| } else if blob, err := readmeFile.LookupBlob(); err != nil { | |||
| log.Error("repo.Single(readmeFile.LookupBlob): %v", err) | |||
| ctx.Error(404) | |||
| return | |||
| } else { | |||
| // current repo branch link | |||
| ctx.Data["FileName"] = readmeFile.Name | |||
| ctx.Data["FileContent"] = string(base.RenderMarkdown(blob.Contents(), branchLink)) | |||
| } | |||
| } | |||
| } | |||
| ctx.Data["Username"] = params["username"] | |||
| ctx.Data["Reponame"] = params["reponame"] | |||
| ctx.Data["Branchname"] = params["branchname"] | |||
| var treenames []string | |||
| Paths := make([]string, 0) | |||
| if len(treename) > 0 { | |||
| treenames = strings.Split(treename, "/") | |||
| for i, _ := range treenames { | |||
| Paths = append(Paths, strings.Join(treenames[0:i+1], "/")) | |||
| } | |||
| ctx.Data["HasParentPath"] = true | |||
| if len(Paths)-2 >= 0 { | |||
| ctx.Data["ParentPath"] = "/" + Paths[len(Paths)-2] | |||
| } | |||
| } | |||
| // Get latest commit according username and repo name | |||
| commit, err := models.GetCommit(params["username"], params["reponame"], | |||
| params["branchname"], params["commitid"]) | |||
| if err != nil { | |||
| log.Error("repo.Single(GetCommit): %v", err) | |||
| ctx.Error(404) | |||
| return | |||
| } | |||
| ctx.Data["LastCommit"] = commit | |||
| ctx.Data["Paths"] = Paths | |||
| ctx.Data["Treenames"] = treenames | |||
| ctx.Data["BranchLink"] = branchLink | |||
| ctx.HTML(200, "repo/single") | |||
| } | |||
| func Http(ctx *middleware.Context, params martini.Params) { | |||
| /*if !ctx.Repo.IsValid { | |||
| return | |||
| }*/ | |||
| // TODO: access check | |||
| username := params["username"] | |||
| reponame := params["reponame"] | |||
| if strings.HasSuffix(reponame, ".git") { | |||
| reponame = reponame[:len(reponame)-4] | |||
| } | |||
| prefix := path.Join("/", username, params["reponame"]) | |||
| server := &webdav.Server{ | |||
| Fs: webdav.Dir(models.RepoPath(username, reponame)), | |||
| TrimPrefix: prefix, | |||
| Listings: true, | |||
| } | |||
| server.ServeHTTP(ctx.ResponseWriter, ctx.Req) | |||
| } | |||
| func Setting(ctx *middleware.Context, params martini.Params) { | |||
| if !ctx.Repo.IsOwner { | |||
| ctx.Error(404) | |||
| return | |||
| } | |||
| ctx.Data["IsRepoToolbarSetting"] = true | |||
| if ctx.Repo.Repository.IsBare { | |||
| ctx.Data["IsBareRepo"] = true | |||
| ctx.HTML(200, "repo/setting") | |||
| return | |||
| } | |||
| var title string | |||
| if t, ok := ctx.Data["Title"].(string); ok { | |||
| title = t | |||
| } | |||
| if len(params["branchname"]) == 0 { | |||
| params["branchname"] = "master" | |||
| } | |||
| ctx.Data["Branchname"] = params["branchname"] | |||
| ctx.Data["Title"] = title + " - settings" | |||
| ctx.HTML(200, "repo/setting") | |||
| } | |||
| func Commits(ctx *middleware.Context, params martini.Params) { | |||
| brs, err := models.GetBranches(params["username"], params["reponame"]) | |||
| if err != nil { | |||
| ctx.Handle(200, "repo.Commits", err) | |||
| return | |||
| } else if len(brs) == 0 { | |||
| ctx.Error(404) | |||
| return | |||
| } | |||
| ctx.Data["IsRepoToolbarCommits"] = true | |||
| commits, err := models.GetCommits(params["username"], | |||
| params["reponame"], params["branchname"]) | |||
| if err != nil { | |||
| ctx.Error(404) | |||
| return | |||
| } | |||
| ctx.Data["Username"] = params["username"] | |||
| ctx.Data["Reponame"] = params["reponame"] | |||
| ctx.Data["CommitCount"] = commits.Len() | |||
| ctx.Data["Commits"] = commits | |||
| ctx.HTML(200, "repo/commits") | |||
| } | |||
| func Issues(ctx *middleware.Context) { | |||
| ctx.Data["IsRepoToolbarIssues"] = true | |||
| ctx.HTML(200, "repo/issues") | |||
| } | |||
| func Pulls(ctx *middleware.Context) { | |||
| ctx.Data["IsRepoToolbarPulls"] = true | |||
| ctx.HTML(200, "repo/pulls") | |||
| } | |||
| func Action(ctx *middleware.Context, params martini.Params) { | |||
| var err error | |||
| switch params["action"] { | |||
| case "watch": | |||
| err = models.WatchRepo(ctx.User.Id, ctx.Repo.Repository.Id, true) | |||
| case "unwatch": | |||
| err = models.WatchRepo(ctx.User.Id, ctx.Repo.Repository.Id, false) | |||
| } | |||
| if err != nil { | |||
| log.Error("repo.Action(%s): %v", params["action"], err) | |||
| ctx.JSON(200, map[string]interface{}{ | |||
| "ok": false, | |||
| "err": err.Error(), | |||
| }) | |||
| return | |||
| } | |||
| ctx.JSON(200, map[string]interface{}{ | |||
| "ok": true, | |||
| }) | |||
| } | |||