diff options
author | James Fargher <jfargher@gitlab.com> | 2021-07-29 05:20:12 +0300 |
---|---|---|
committer | James Fargher <jfargher@gitlab.com> | 2021-07-29 05:20:12 +0300 |
commit | f37e11f0550e5ece0cefa68f0e60e79500a37366 (patch) | |
tree | fd2bd60f91dc9389dffa7eaa460f372dbbf9b9ab | |
parent | c2075811742f54cb69e67368b925c69598d76185 (diff) |
Extract show-ref command wrapper from CalculateChecksumextract_show_ref
-rw-r--r-- | internal/git/localrepo/refs.go | 33 | ||||
-rw-r--r-- | internal/gitaly/service/repository/calculate_checksum.go | 32 |
2 files changed, 47 insertions, 18 deletions
diff --git a/internal/git/localrepo/refs.go b/internal/git/localrepo/refs.go index ac9c69fd1..629f0980a 100644 --- a/internal/git/localrepo/refs.go +++ b/internal/git/localrepo/refs.go @@ -138,6 +138,39 @@ func (repo *Repo) GetBranches(ctx context.Context) ([]git.Reference, error) { return repo.GetReferences(ctx, "refs/heads/") } +// ShowRef returns all refs +func (repo *Repo) ShowRef(ctx context.Context, patterns ...string) ([]git.Reference, error) { + cmd, err := repo.Exec(ctx, git.SubCmd{ + Name: "show-ref", + Flags: []git.Option{git.Flag{Name: "--head"}}, + Args: patterns, + }) + if err != nil { + return nil, err + } + + scanner := bufio.NewScanner(cmd) + + var refs []git.Reference + for scanner.Scan() { + line := bytes.SplitN(scanner.Bytes(), []byte(" "), 2) + if len(line) != 2 { + return nil, errors.New("unexpected reference format") + } + + refs = append(refs, git.NewReference(git.ReferenceName(line[1]), string(line[0]))) + } + + if err := scanner.Err(); err != nil { + return nil, fmt.Errorf("reading standard input: %v", err) + } + if err := cmd.Wait(); err != nil { + return nil, err + } + + return refs, nil +} + // UpdateRef updates reference from oldValue to newValue. If oldValue is a // non-empty string, the update will fail it the reference is not currently at // that revision. If newValue is the ZeroOID, the reference will be deleted. diff --git a/internal/gitaly/service/repository/calculate_checksum.go b/internal/gitaly/service/repository/calculate_checksum.go index 7c2461313..059978a81 100644 --- a/internal/gitaly/service/repository/calculate_checksum.go +++ b/internal/gitaly/service/repository/calculate_checksum.go @@ -1,11 +1,11 @@ package repository import ( - "bufio" "bytes" "context" "crypto/sha1" "encoding/hex" + "fmt" "math/big" "regexp" "strings" @@ -19,35 +19,35 @@ import ( var refWhitelist = regexp.MustCompile(`HEAD|(refs/(heads|tags|keep-around|merge-requests|environments|notes)/)`) func (s *server) CalculateChecksum(ctx context.Context, in *gitalypb.CalculateChecksumRequest) (*gitalypb.CalculateChecksumResponse, error) { - repo := in.GetRepository() - - repoPath, err := s.locator.GetRepoPath(repo) + repoPath, err := s.locator.GetRepoPath(in.GetRepository()) if err != nil { return nil, err } - cmd, err := s.gitCmdFactory.New(ctx, repo, git.SubCmd{Name: "show-ref", Flags: []git.Option{git.Flag{Name: "--head"}}}) + repo := s.localrepo(in.GetRepository()) + + refs, err := repo.ShowRef(ctx) if err != nil { if _, ok := status.FromError(err); ok { return nil, err } + if s.isValidRepo(ctx, in.GetRepository()) { + return &gitalypb.CalculateChecksumResponse{Checksum: git.ZeroOID.String()}, nil + } - return nil, status.Errorf(codes.Internal, "CalculateChecksum: gitCommand: %v", err) + return nil, status.Errorf(codes.DataLoss, "CalculateChecksum: not a git repository '%s'", repoPath) } var checksum *big.Int - scanner := bufio.NewScanner(cmd) - for scanner.Scan() { - ref := scanner.Bytes() - - if !refWhitelist.Match(ref) { + for _, ref := range refs { + if !refWhitelist.MatchString(ref.Name.String()) { continue } h := sha1.New() // hash.Hash will never return an error. - _, _ = h.Write(ref) + fmt.Fprintf(h, "%s %s", ref.Target, ref.Name.String()) hash := hex.EncodeToString(h.Sum(nil)) hashIntBase16, _ := (&big.Int{}).SetString(hash, 16) @@ -59,12 +59,8 @@ func (s *server) CalculateChecksum(ctx context.Context, in *gitalypb.CalculateCh } } - if err := scanner.Err(); err != nil { - return nil, status.Errorf(codes.Internal, err.Error()) - } - - if err := cmd.Wait(); checksum == nil || err != nil { - if s.isValidRepo(ctx, repo) { + if checksum == nil { + if s.isValidRepo(ctx, in.GetRepository()) { return &gitalypb.CalculateChecksumResponse{Checksum: git.ZeroOID.String()}, nil } |