diff options
author | Lauris BH <lauris@nix.lv> | 2018-11-27 23:52:20 +0200 |
---|---|---|
committer | techknowlogick <hello@techknowlogick.com> | 2018-11-27 16:52:20 -0500 |
commit | 08bf443016bae30690417b4835076709ef36e3b0 (patch) | |
tree | ece591d95416dd85e726dce15e0ab52872a17b06 /vendor/code.gitea.io/git | |
parent | 294904321cb6de535237a6a156d5c4ec462bc117 (diff) | |
download | gitea-08bf443016bae30690417b4835076709ef36e3b0.tar.gz gitea-08bf443016bae30690417b4835076709ef36e3b0.zip |
Implement git refs API for listing references (branches, tags and other) (#5354)
* Inital routes to git refs api
* Git refs API implementation
* Update swagger
* Fix copyright
* Make swagger happy add basic test
* Fix test
* Fix test again :)
Diffstat (limited to 'vendor/code.gitea.io/git')
-rw-r--r-- | vendor/code.gitea.io/git/ref.go | 18 | ||||
-rw-r--r-- | vendor/code.gitea.io/git/repo_branch.go | 21 | ||||
-rw-r--r-- | vendor/code.gitea.io/git/repo_ref.go | 51 |
3 files changed, 85 insertions, 5 deletions
diff --git a/vendor/code.gitea.io/git/ref.go b/vendor/code.gitea.io/git/ref.go new file mode 100644 index 0000000000..67b56ac999 --- /dev/null +++ b/vendor/code.gitea.io/git/ref.go @@ -0,0 +1,18 @@ +// Copyright 2018 The Gitea 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 git + +// Reference represents a Git ref. +type Reference struct { + Name string + repo *Repository + Object SHA1 // The id of this commit object + Type string +} + +// Commit return the commit of the reference +func (ref *Reference) Commit() (*Commit, error) { + return ref.repo.getCommit(ref.Object) +} diff --git a/vendor/code.gitea.io/git/repo_branch.go b/vendor/code.gitea.io/git/repo_branch.go index 3b50eece14..6414abbec5 100644 --- a/vendor/code.gitea.io/git/repo_branch.go +++ b/vendor/code.gitea.io/git/repo_branch.go @@ -1,4 +1,5 @@ // Copyright 2015 The Gogs Authors. All rights reserved. +// Copyright 2018 The Gitea Authors. All rights reserved. // Use of this source code is governed by a MIT-style // license that can be found in the LICENSE file. @@ -7,6 +8,9 @@ package git import ( "fmt" "strings" + + "gopkg.in/src-d/go-git.v4" + "gopkg.in/src-d/go-git.v4/plumbing" ) // BranchPrefix base dir of the branch information file store on git @@ -60,16 +64,23 @@ func (repo *Repository) SetDefaultBranch(name string) error { // GetBranches returns all branches of the repository. func (repo *Repository) GetBranches() ([]string, error) { - stdout, err := NewCommand("for-each-ref", "--format=%(refname)", BranchPrefix).RunInDir(repo.Path) + r, err := git.PlainOpen(repo.Path) if err != nil { return nil, err } - refs := strings.Split(stdout, "\n") - branches := make([]string, len(refs)-1) - for i, ref := range refs[:len(refs)-1] { - branches[i] = strings.TrimPrefix(ref, BranchPrefix) + branchIter, err := r.Branches() + if err != nil { + return nil, err } + branches := make([]string, 0) + if err = branchIter.ForEach(func(branch *plumbing.Reference) error { + branches = append(branches, branch.Name().Short()) + return nil + }); err != nil { + return nil, err + } + return branches, nil } diff --git a/vendor/code.gitea.io/git/repo_ref.go b/vendor/code.gitea.io/git/repo_ref.go new file mode 100644 index 0000000000..e1ab46e090 --- /dev/null +++ b/vendor/code.gitea.io/git/repo_ref.go @@ -0,0 +1,51 @@ +// Copyright 2018 The Gitea 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 git + +import ( + "strings" + + "gopkg.in/src-d/go-git.v4" + "gopkg.in/src-d/go-git.v4/plumbing" +) + +// GetRefs returns all references of the repository. +func (repo *Repository) GetRefs() ([]*Reference, error) { + return repo.GetRefsFiltered("") +} + +// GetRefsFiltered returns all references of the repository that matches patterm exactly or starting with. +func (repo *Repository) GetRefsFiltered(pattern string) ([]*Reference, error) { + r, err := git.PlainOpen(repo.Path) + if err != nil { + return nil, err + } + + refsIter, err := r.References() + if err != nil { + return nil, err + } + refs := make([]*Reference, 0) + if err = refsIter.ForEach(func(ref *plumbing.Reference) error { + if ref.Name() != plumbing.HEAD && !ref.Name().IsRemote() && + (pattern == "" || strings.HasPrefix(ref.Name().String(), pattern)) { + r := &Reference{ + Name: ref.Name().String(), + Object: SHA1(ref.Hash()), + Type: string(ObjectCommit), + repo: repo, + } + if ref.Name().IsTag() { + r.Type = string(ObjectTag) + } + refs = append(refs, r) + } + return nil + }); err != nil { + return nil, err + } + + return refs, nil +} |