Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitaly.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJames Fargher <jfargher@gitlab.com>2021-07-29 05:20:12 +0300
committerJames Fargher <jfargher@gitlab.com>2021-07-29 05:20:12 +0300
commitf37e11f0550e5ece0cefa68f0e60e79500a37366 (patch)
treefd2bd60f91dc9389dffa7eaa460f372dbbf9b9ab
parentc2075811742f54cb69e67368b925c69598d76185 (diff)
Extract show-ref command wrapper from CalculateChecksumextract_show_ref
-rw-r--r--internal/git/localrepo/refs.go33
-rw-r--r--internal/gitaly/service/repository/calculate_checksum.go32
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
}