diff options
author | Patrick Steinhardt <psteinhardt@gitlab.com> | 2020-12-16 15:30:13 +0300 |
---|---|---|
committer | Patrick Steinhardt <psteinhardt@gitlab.com> | 2020-12-16 16:51:58 +0300 |
commit | 3bd9cc8b8be5bca1bebda939e660f6025b8fabc4 (patch) | |
tree | 889399d8b66f1612178c48358325109f5431b80f | |
parent | d62b7f5de0be99b5dda4510c611ad5146175d5b0 (diff) |
ref: Use repository abstraction to list existing references
When determining which references to delete for the DeleteRefs RPC, we
shell out to git-for-each-ref(1) to determine which references match a
given set of prefixes. We do have a higher-level abstraction around to
list references via git-for-each-ref(1) though in our LocalRepository
interface.
Convert the code to use `LocalReposiory.GetReferences()` to have one
less moving part where we manually invoke git.
-rw-r--r-- | internal/gitaly/service/ref/delete_refs.go | 29 |
1 files changed, 9 insertions, 20 deletions
diff --git a/internal/gitaly/service/ref/delete_refs.go b/internal/gitaly/service/ref/delete_refs.go index aee81e227..3153440f6 100644 --- a/internal/gitaly/service/ref/delete_refs.go +++ b/internal/gitaly/service/ref/delete_refs.go @@ -1,7 +1,6 @@ package ref import ( - "bufio" "context" "errors" "fmt" @@ -47,41 +46,31 @@ func (s *server) DeleteRefs(ctx context.Context, in *gitalypb.DeleteRefsRequest) } func refsToRemove(ctx context.Context, req *gitalypb.DeleteRefsRequest) ([]string, error) { - var refs []string if len(req.Refs) > 0 { - refs = make([]string, len(req.Refs)) + refs := make([]string, len(req.Refs)) for i, ref := range req.Refs { refs[i] = string(ref) } return refs, nil } - cmd, err := git.SafeCmd(ctx, req.GetRepository(), nil, git.SubCmd{ - Name: "for-each-ref", - Flags: []git.Option{git.Flag{Name: "--format=%(refname)"}}, - }) - if err != nil { - return nil, fmt.Errorf("error setting up for-each-ref command: %v", err) - } - prefixes := make([]string, len(req.ExceptWithPrefix)) for i, prefix := range req.ExceptWithPrefix { prefixes[i] = string(prefix) } - scanner := bufio.NewScanner(cmd) - for scanner.Scan() { - refName := scanner.Text() + existingRefs, err := git.NewRepository(req.GetRepository()).GetReferences(ctx, "") + if err != nil { + return nil, err + } - if hasAnyPrefix(refName, prefixes) { + var refs []string + for _, existingRef := range existingRefs { + if hasAnyPrefix(existingRef.Name, prefixes) { continue } - refs = append(refs, refName) - } - - if err != nil { - return nil, fmt.Errorf("error listing refs: %v", cmd.Wait()) + refs = append(refs, existingRef.Name) } return refs, nil |