diff options
author | Shinya Maeda <shinya@gitlab.com> | 2019-06-25 11:32:31 +0300 |
---|---|---|
committer | Shinya Maeda <shinya@gitlab.com> | 2019-06-25 11:32:31 +0300 |
commit | f12dca1862b5fbe117a77ee1825d7e5bc51e44fd (patch) | |
tree | 1ac720a601b571b4715f864813e198f2436a3d0c | |
parent | 85f696729f973c0fdba553f6590c26bc2de722ec (diff) |
Create new RPC 'FindRef'create-new-rpc-find-ref
-rw-r--r-- | internal/service/ref/refs.go | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/internal/service/ref/refs.go b/internal/service/ref/refs.go index 789c3653a..ec5121066 100644 --- a/internal/service/ref/refs.go +++ b/internal/service/ref/refs.go @@ -143,6 +143,44 @@ func (s *server) FindAllTags(in *gitalypb.FindAllTagsRequest, stream gitalypb.Re return nil } +func (s *server) FindRef(ctx context.Context, req *gitalypb.FindRefRequest) (*gitalypb.FindRefResponse, error) { + refPath := string(req.GetRefPath()) + if len(refPath) == 0 { + return nil, status.Errorf(codes.InvalidArgument, "Ref path cannot be empty") + } + repo := req.GetRepository() + + cmd, err := git.Command(ctx, repo, "for-each-ref", "--format", "%(objectname)", refPath) + if err != nil { + return nil, err + } + + reader := bufio.NewReader(cmd) + revision, _, err := reader.ReadLine() + if err != nil { + if err == io.EOF { + return &gitalypb.FindRefResponse{}, 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 &gitalypb.FindRefResponse{ + Ref: &gitalypb.Ref{ + RefPath: []byte(refPath), + TargetCommit: commit, + }, + }, nil +} + func validateFindAllTagsRequest(request *gitalypb.FindAllTagsRequest) error { if request.GetRepository() == nil { return errors.New("empty Repository") |