diff options
author | Jacob Vosmaer <jacob@gitlab.com> | 2018-12-18 14:34:19 +0300 |
---|---|---|
committer | Jacob Vosmaer <jacob@gitlab.com> | 2018-12-18 14:34:19 +0300 |
commit | 93c2bcc4c6dc88b73ddd94cbe1bcc165397f0840 (patch) | |
tree | ecb1265d29680a5e941ebdcff382020592155427 | |
parent | ca64e5c24c564dff5e5a68f0bf4f5759a6401ecb (diff) | |
parent | ee9f0abe06c9967cf7b0ce29749f8af3bd618f75 (diff) |
Merge branch '1293-re-implement-findbranch-in-go' into 'master'
Re-implemented FindBranch in Go
See merge request gitlab-org/gitaly!981
-rw-r--r-- | changelogs/unreleased/1293-re-implement-findbranch-in-go.yml | 5 | ||||
-rw-r--r-- | internal/service/ref/branches.go | 44 | ||||
-rw-r--r-- | ruby/lib/gitaly_server/ref_service.rb | 1 |
3 files changed, 47 insertions, 3 deletions
diff --git a/changelogs/unreleased/1293-re-implement-findbranch-in-go.yml b/changelogs/unreleased/1293-re-implement-findbranch-in-go.yml new file mode 100644 index 000000000..73adc15d6 --- /dev/null +++ b/changelogs/unreleased/1293-re-implement-findbranch-in-go.yml @@ -0,0 +1,5 @@ +--- +title: Re-implemented FindBranch in Go +merge_request: 981 +author: +type: performance diff --git a/internal/service/ref/branches.go b/internal/service/ref/branches.go index 6d03816f7..09aa25189 100644 --- a/internal/service/ref/branches.go +++ b/internal/service/ref/branches.go @@ -1,9 +1,17 @@ package ref import ( + "bufio" + "io" + "strings" + "gitlab.com/gitlab-org/gitaly-proto/go/gitalypb" + "gitlab.com/gitlab-org/gitaly/internal/git" + "gitlab.com/gitlab-org/gitaly/internal/git/log" "gitlab.com/gitlab-org/gitaly/internal/rubyserver" "golang.org/x/net/context" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" ) func (s *server) CreateBranch(ctx context.Context, req *gitalypb.CreateBranchRequest) (*gitalypb.CreateBranchResponse, error) { @@ -35,15 +43,45 @@ func (s *server) DeleteBranch(ctx context.Context, req *gitalypb.DeleteBranchReq } func (s *server) FindBranch(ctx context.Context, req *gitalypb.FindBranchRequest) (*gitalypb.FindBranchResponse, error) { - client, err := s.RefServiceClient(ctx) + refName := string(req.GetName()) + if len(refName) == 0 { + return nil, status.Errorf(codes.InvalidArgument, "Branch name cannot be empty") + } + repo := req.GetRepository() + + if strings.HasPrefix(refName, "refs/heads/") { + refName = strings.TrimPrefix(refName, "refs/heads/") + } else if strings.HasPrefix(refName, "heads/") { + refName = strings.TrimPrefix(refName, "heads/") + } + + cmd, err := git.Command(ctx, repo, "for-each-ref", "--format", "%(objectname)", "refs/heads/"+refName) if err != nil { return nil, err } - clientCtx, err := rubyserver.SetHeaders(ctx, req.GetRepository()) + reader := bufio.NewReader(cmd) + revision, _, err := reader.ReadLine() if err != nil { + if err == io.EOF { + return &gitalypb.FindBranchResponse{}, nil + } + return nil, err + } + + commit, err := log.GetCommit(ctx, repo, string(revision)) + if err != nil { + return nil, err + } + + if err := cmd.Wait(); err != nil { return nil, err } - return client.FindBranch(clientCtx, req) + return &gitalypb.FindBranchResponse{ + Branch: &gitalypb.Branch{ + Name: []byte(refName), + TargetCommit: commit, + }, + }, nil } diff --git a/ruby/lib/gitaly_server/ref_service.rb b/ruby/lib/gitaly_server/ref_service.rb index 4c0497cf9..9b3fa036c 100644 --- a/ruby/lib/gitaly_server/ref_service.rb +++ b/ruby/lib/gitaly_server/ref_service.rb @@ -44,6 +44,7 @@ module GitalyServer raise GRPC::Internal.new(e.to_s) end + # Deprecated: Will be removed in GitLab 11.8 def find_branch(request, call) branch_name = request.name raise GRPC::InvalidArgument.new("empty Name") if branch_name.empty? |