From c11c3b6c1125c8de1f86ea4d41eb88728d8e0b48 Mon Sep 17 00:00:00 2001 From: Antoine GIRARD Date: Fri, 15 Jan 2016 19:24:03 +0100 Subject: [PATCH 1/4] Near ready --- models/branch.go | 43 +++++++++++++++++++++++++ models/repo.go | 14 +++++++++ routers/api/v1/api.go | 5 ++- routers/api/v1/convert/convert.go | 21 +++++++++++++ routers/api/v1/repo/branch.go | 52 +++++++++++++++++++++++++++++++ 5 files changed, 134 insertions(+), 1 deletion(-) create mode 100644 models/branch.go create mode 100644 routers/api/v1/repo/branch.go diff --git a/models/branch.go b/models/branch.go new file mode 100644 index 0000000000..08b5b7c31d --- /dev/null +++ b/models/branch.go @@ -0,0 +1,43 @@ +package models + +import ( + "github.com/gogits/git-module" +) + +type Branch struct { + Path string + Name string +} + +func GetBranchesByPath(path string) ([]*Branch, error) { + gitRepo, err := git.OpenRepository(path) + if err != nil { + return nil, err + } + + brs, err := gitRepo.GetBranches() + if err != nil { + return nil, err + } + + Branches := make([]*Branch, len(brs)) + for i := range brs { + Branches[i] = &Branch{ + Path: path, + Name: brs[i], + } + } + return Branches, nil +} + +func GetBranchesByRepo(user,repo string) ([]*Branch, error) { + return GetBranchesByPath(RepoPath(user, repo)) +} + +func (br *Branch) GetCommit() (*git.Commit, error) { + gitRepo, err := git.OpenRepository(br.Path) + if err != nil { + return nil, err + } + return gitRepo.GetBranchCommit(br.Name) +} diff --git a/models/repo.go b/models/repo.go index 8ce1f7190c..82fea00a6c 100644 --- a/models/repo.go +++ b/models/repo.go @@ -288,6 +288,20 @@ func (repo *Repository) GetMirror() (err error) { return err } +func (repo *Repository) GetBranch(br string) (_ *Branch, err error) { + if(!git.IsBranchExist(repo.RepoPath(), br)){ + return nil, errors.New("Branch do not exist"); + } + return &Branch{ + Path: repo.RepoPath(), + Name: br, + },nil +} + +func (repo *Repository) GetBranches() (_ []*Branch, err error) { + return GetBranchesByPath(repo.RepoPath()) +} + func (repo *Repository) GetBaseRepo() (err error) { if !repo.IsFork { return nil diff --git a/routers/api/v1/api.go b/routers/api/v1/api.go index 6fe11a07e8..0152eec29a 100644 --- a/routers/api/v1/api.go +++ b/routers/api/v1/api.go @@ -183,7 +183,10 @@ func RegisterRoutes(m *macaron.Macaron) { m.Patch("/hooks/:id:int", bind(api.EditHookOption{}), repo.EditHook) m.Get("/raw/*", middleware.RepoRef(), repo.GetRawFile) m.Get("/archive/*", repo.GetArchive) - + m.Group("/branches", func() { + m.Get("",repo.ListBranches) + m.Get("/:id",repo.GetBranch) + }) m.Group("/keys", func() { m.Combo("").Get(repo.ListDeployKeys). Post(bind(api.CreateKeyOption{}), repo.CreateDeployKey) diff --git a/routers/api/v1/convert/convert.go b/routers/api/v1/convert/convert.go index b91abbdd39..d20732bfd6 100644 --- a/routers/api/v1/convert/convert.go +++ b/routers/api/v1/convert/convert.go @@ -10,11 +10,32 @@ import ( "github.com/Unknwon/com" api "github.com/gogits/go-gogs-client" + "github.com/gogits/git-module" "github.com/gogits/gogs/models" "github.com/gogits/gogs/modules/setting" ) +// ToApiBranch converts user to its API format. +func ToApiBranch(b *models.Branch,c *git.Commit) *api.Branch { + return &api.Branch{ + Name: b.Name, + Commit: ToApiCommit(c), + } +} +// ToApiCommit converts user to its API format. +func ToApiCommit(c *git.Commit) *api.PayloadCommit { + return &api.PayloadCommit{ + ID: c.ID.String(), + Message: c.Message(), + URL: "Not implemented", + Author: &api.PayloadAuthor{ + Name: c.Committer.Name, + Email: c.Committer.Email, + /* UserName: c.Committer.UserName, */ + }, + } +} // ToApiUser converts user to its API format. func ToApiUser(u *models.User) *api.User { return &api.User{ diff --git a/routers/api/v1/repo/branch.go b/routers/api/v1/repo/branch.go new file mode 100644 index 0000000000..ceff669656 --- /dev/null +++ b/routers/api/v1/repo/branch.go @@ -0,0 +1,52 @@ +// 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 ( + //TODO change for merge + api "github.com/gogits/go-gogs-client" + + "github.com/gogits/gogs/modules/middleware" + "github.com/gogits/gogs/routers/api/v1/convert" +) + +//TODO add to github.com/gogits/go-gogs-client +// https://github.com/gogits/go-gogs-client/wiki/Repositories#get-branch +func GetBranch(ctx *middleware.Context) { + branch, err := ctx.Repo.Repository.GetBranch(ctx.Params(":id")) + if err != nil { + //TODO handle error + return + } + c, err := branch.GetCommit() + if err != nil { + //TODO handle error + return + } + ctx.JSON(200, convert.ToApiBranch(branch,c)) +} + +//TODO add to github.com/gogits/go-gogs-client +// https://github.com/gogits/go-gogs-client/wiki/Repositories#list-branches +func ListBranches(ctx *middleware.Context) { + + + Branches, err := ctx.Repo.Repository.GetBranches() + if err != nil { + //TODO handle error + return + } + apiBranches := make([]*api.Branch, len(Branches)) + for i := range Branches { + c, err := Branches[i].GetCommit() + if err != nil { + //TODO handle error + continue + } + apiBranches[i] = convert.ToApiBranch(Branches[i],c) + } + + ctx.JSON(200, &apiBranches) +} From 303d091ea9d633f6e754aa33a7f6fe54b45fa73b Mon Sep 17 00:00:00 2001 From: Antoine GIRARD Date: Sat, 16 Jan 2016 10:28:59 +0100 Subject: [PATCH 2/4] Update link for documentation (Temporary https://gist.github.com/sapk/df64347ff218baf4a277) [ci skip] --- routers/api/v1/repo/branch.go | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/routers/api/v1/repo/branch.go b/routers/api/v1/repo/branch.go index ceff669656..7b745de5ff 100644 --- a/routers/api/v1/repo/branch.go +++ b/routers/api/v1/repo/branch.go @@ -5,15 +5,14 @@ package repo import ( - //TODO change for merge api "github.com/gogits/go-gogs-client" "github.com/gogits/gogs/modules/middleware" "github.com/gogits/gogs/routers/api/v1/convert" ) -//TODO add to github.com/gogits/go-gogs-client -// https://github.com/gogits/go-gogs-client/wiki/Repositories#get-branch +// Temporary: https://gist.github.com/sapk/df64347ff218baf4a277#get-a-branch +// https://github.com/gogits/go-gogs-client/wiki/Repositories-Branches#get-a-branch func GetBranch(ctx *middleware.Context) { branch, err := ctx.Repo.Repository.GetBranch(ctx.Params(":id")) if err != nil { @@ -28,11 +27,9 @@ func GetBranch(ctx *middleware.Context) { ctx.JSON(200, convert.ToApiBranch(branch,c)) } -//TODO add to github.com/gogits/go-gogs-client -// https://github.com/gogits/go-gogs-client/wiki/Repositories#list-branches +// Temporary: https://gist.github.com/sapk/df64347ff218baf4a277#list-branches +// https://github.com/gogits/go-gogs-client/wiki/Repositories-Branches#list-branches func ListBranches(ctx *middleware.Context) { - - Branches, err := ctx.Repo.Repository.GetBranches() if err != nil { //TODO handle error From 81e5722bcc80e560f4e50874a9319f5c5fd3c0f3 Mon Sep 17 00:00:00 2001 From: Antoine GIRARD Date: Sat, 16 Jan 2016 10:36:16 +0100 Subject: [PATCH 3/4] Handling error for the API request and add commments [ci skip] --- routers/api/v1/repo/branch.go | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/routers/api/v1/repo/branch.go b/routers/api/v1/repo/branch.go index 7b745de5ff..2f4c36f751 100644 --- a/routers/api/v1/repo/branch.go +++ b/routers/api/v1/repo/branch.go @@ -14,36 +14,42 @@ import ( // Temporary: https://gist.github.com/sapk/df64347ff218baf4a277#get-a-branch // https://github.com/gogits/go-gogs-client/wiki/Repositories-Branches#get-a-branch func GetBranch(ctx *middleware.Context) { + //Getting the branch requested branch, err := ctx.Repo.Repository.GetBranch(ctx.Params(":id")) if err != nil { - //TODO handle error + ctx.APIError(500, "Repository.GetBranch", err) return } + //Getting the last commit of the branch c, err := branch.GetCommit() if err != nil { - //TODO handle error + ctx.APIError(500, "Branch.GetCommit", err) return } + //Converting to API format and send payload ctx.JSON(200, convert.ToApiBranch(branch,c)) } // Temporary: https://gist.github.com/sapk/df64347ff218baf4a277#list-branches // https://github.com/gogits/go-gogs-client/wiki/Repositories-Branches#list-branches func ListBranches(ctx *middleware.Context) { + //Listing of branches Branches, err := ctx.Repo.Repository.GetBranches() if err != nil { - //TODO handle error + ctx.APIError(500, "Repository.GetBranches", err) return } + //Getting the last commit of each branch apiBranches := make([]*api.Branch, len(Branches)) for i := range Branches { c, err := Branches[i].GetCommit() if err != nil { - //TODO handle error - continue + ctx.APIError(500, "Branch.GetCommit", err) + return } + //Converting to API format apiBranches[i] = convert.ToApiBranch(Branches[i],c) } - + //Sending the payload ctx.JSON(200, &apiBranches) } From b7b30cd85e5cabd9d643013ffb10dafd133b18ea Mon Sep 17 00:00:00 2001 From: Antoine GIRARD Date: Thu, 28 Jan 2016 20:49:05 +0100 Subject: [PATCH 4/4] Corrections following recommendations --- models/repo.go | 6 ++-- models/{branch.go => repo_branch.go} | 8 +++--- routers/api/v1/api.go | 2 +- routers/api/v1/convert/convert.go | 42 +++++++++++++++------------- routers/api/v1/repo/branch.go | 18 ++++++------ 5 files changed, 39 insertions(+), 37 deletions(-) rename models/{branch.go => repo_branch.go} (80%) diff --git a/models/repo.go b/models/repo.go index 82fea00a6c..a0074a2953 100644 --- a/models/repo.go +++ b/models/repo.go @@ -288,9 +288,9 @@ func (repo *Repository) GetMirror() (err error) { return err } -func (repo *Repository) GetBranch(br string) (_ *Branch, err error) { +func (repo *Repository) GetBranch(br string) (*Branch, error) { if(!git.IsBranchExist(repo.RepoPath(), br)){ - return nil, errors.New("Branch do not exist"); + return nil, fmt.Errorf("Branch does not exist: %s", br); } return &Branch{ Path: repo.RepoPath(), @@ -298,7 +298,7 @@ func (repo *Repository) GetBranch(br string) (_ *Branch, err error) { },nil } -func (repo *Repository) GetBranches() (_ []*Branch, err error) { +func (repo *Repository) GetBranches() ([]*Branch, error) { return GetBranchesByPath(repo.RepoPath()) } diff --git a/models/branch.go b/models/repo_branch.go similarity index 80% rename from models/branch.go rename to models/repo_branch.go index 08b5b7c31d..b784f7d537 100644 --- a/models/branch.go +++ b/models/repo_branch.go @@ -1,3 +1,7 @@ +// Copyright 2016 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 models import ( @@ -30,10 +34,6 @@ func GetBranchesByPath(path string) ([]*Branch, error) { return Branches, nil } -func GetBranchesByRepo(user,repo string) ([]*Branch, error) { - return GetBranchesByPath(RepoPath(user, repo)) -} - func (br *Branch) GetCommit() (*git.Commit, error) { gitRepo, err := git.OpenRepository(br.Path) if err != nil { diff --git a/routers/api/v1/api.go b/routers/api/v1/api.go index 0152eec29a..04b392fc9b 100644 --- a/routers/api/v1/api.go +++ b/routers/api/v1/api.go @@ -185,7 +185,7 @@ func RegisterRoutes(m *macaron.Macaron) { m.Get("/archive/*", repo.GetArchive) m.Group("/branches", func() { m.Get("",repo.ListBranches) - m.Get("/:id",repo.GetBranch) + m.Get("/:branchname",repo.GetBranch) }) m.Group("/keys", func() { m.Combo("").Get(repo.ListDeployKeys). diff --git a/routers/api/v1/convert/convert.go b/routers/api/v1/convert/convert.go index d20732bfd6..57b3d44e2c 100644 --- a/routers/api/v1/convert/convert.go +++ b/routers/api/v1/convert/convert.go @@ -16,26 +16,6 @@ import ( "github.com/gogits/gogs/modules/setting" ) -// ToApiBranch converts user to its API format. -func ToApiBranch(b *models.Branch,c *git.Commit) *api.Branch { - return &api.Branch{ - Name: b.Name, - Commit: ToApiCommit(c), - } -} -// ToApiCommit converts user to its API format. -func ToApiCommit(c *git.Commit) *api.PayloadCommit { - return &api.PayloadCommit{ - ID: c.ID.String(), - Message: c.Message(), - URL: "Not implemented", - Author: &api.PayloadAuthor{ - Name: c.Committer.Name, - Email: c.Committer.Email, - /* UserName: c.Committer.UserName, */ - }, - } -} // ToApiUser converts user to its API format. func ToApiUser(u *models.User) *api.User { return &api.User{ @@ -71,6 +51,28 @@ func ToApiRepository(owner *models.User, repo *models.Repository, permission api } } +// ToApiBranch converts user to its API format. +func ToApiBranch(b *models.Branch,c *git.Commit) *api.Branch { + return &api.Branch{ + Name: b.Name, + Commit: ToApiCommit(c), + } +} + +// ToApiCommit converts user to its API format. +func ToApiCommit(c *git.Commit) *api.PayloadCommit { + return &api.PayloadCommit{ + ID: c.ID.String(), + Message: c.Message(), + URL: "Not implemented", + Author: &api.PayloadAuthor{ + Name: c.Committer.Name, + Email: c.Committer.Email, + /* UserName: c.Committer.UserName, */ + }, + } +} + // ToApiPublicKey converts public key to its API format. func ToApiPublicKey(apiLink string, key *models.PublicKey) *api.PublicKey { return &api.PublicKey{ diff --git a/routers/api/v1/repo/branch.go b/routers/api/v1/repo/branch.go index 2f4c36f751..d322b6b592 100644 --- a/routers/api/v1/repo/branch.go +++ b/routers/api/v1/repo/branch.go @@ -1,4 +1,4 @@ -// Copyright 2014 The Gogs Authors. All rights reserved. +// Copyright 2016 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. @@ -14,32 +14,32 @@ import ( // Temporary: https://gist.github.com/sapk/df64347ff218baf4a277#get-a-branch // https://github.com/gogits/go-gogs-client/wiki/Repositories-Branches#get-a-branch func GetBranch(ctx *middleware.Context) { - //Getting the branch requested - branch, err := ctx.Repo.Repository.GetBranch(ctx.Params(":id")) + // Getting the branch requested + branch, err := ctx.Repo.Repository.GetBranch(ctx.Params(":branchname")) if err != nil { ctx.APIError(500, "Repository.GetBranch", err) return } - //Getting the last commit of the branch + // Getting the last commit of the branch c, err := branch.GetCommit() if err != nil { ctx.APIError(500, "Branch.GetCommit", err) return } - //Converting to API format and send payload + // Converting to API format and send payload ctx.JSON(200, convert.ToApiBranch(branch,c)) } // Temporary: https://gist.github.com/sapk/df64347ff218baf4a277#list-branches // https://github.com/gogits/go-gogs-client/wiki/Repositories-Branches#list-branches func ListBranches(ctx *middleware.Context) { - //Listing of branches + // Listing of branches Branches, err := ctx.Repo.Repository.GetBranches() if err != nil { ctx.APIError(500, "Repository.GetBranches", err) return } - //Getting the last commit of each branch + // Getting the last commit of each branch apiBranches := make([]*api.Branch, len(Branches)) for i := range Branches { c, err := Branches[i].GetCommit() @@ -47,9 +47,9 @@ func ListBranches(ctx *middleware.Context) { ctx.APIError(500, "Branch.GetCommit", err) return } - //Converting to API format + // Converting to API format apiBranches[i] = convert.ToApiBranch(Branches[i],c) } - //Sending the payload + // Sending the payload ctx.JSON(200, &apiBranches) }