diff options
author | James Fargher <jfargher@gitlab.com> | 2023-06-01 07:07:34 +0300 |
---|---|---|
committer | James Fargher <jfargher@gitlab.com> | 2023-06-02 00:26:16 +0300 |
commit | 8e23e474cbef5c82c29db72c3f21fac9925220a9 (patch) | |
tree | 96fc0b5a9682ecc9e8e1f85087ce11932c95b784 | |
parent | 76f60b767b821fb9ae92109fcc46981e4619b4e5 (diff) |
ref service: Implement HeadOnly option for FindDefaultBranchNameuse_head_reference
-rw-r--r-- | internal/gitaly/service/ref/refs.go | 11 | ||||
-rw-r--r-- | internal/gitaly/service/ref/refs_test.go | 53 |
2 files changed, 60 insertions, 4 deletions
diff --git a/internal/gitaly/service/ref/refs.go b/internal/gitaly/service/ref/refs.go index b1c9b5c79..5627a0073 100644 --- a/internal/gitaly/service/ref/refs.go +++ b/internal/gitaly/service/ref/refs.go @@ -76,11 +76,18 @@ func (s *server) FindDefaultBranchName(ctx context.Context, in *gitalypb.FindDef } repo := s.localrepo(repository) + if in.GetHeadOnly() { + head, err := repo.HeadReference(ctx) + if err != nil { + return nil, structerr.NewInternal("head reference: %w", err) + } + return &gitalypb.FindDefaultBranchNameResponse{Name: []byte(head)}, nil + } + defaultBranch, err := repo.GetDefaultBranch(ctx) if err != nil { - return nil, structerr.NewInternal("%w", err) + return nil, structerr.NewInternal("get default branch: %w", err) } - return &gitalypb.FindDefaultBranchNameResponse{Name: []byte(defaultBranch)}, nil } diff --git a/internal/gitaly/service/ref/refs_test.go b/internal/gitaly/service/ref/refs_test.go index 3af702173..557d12820 100644 --- a/internal/gitaly/service/ref/refs_test.go +++ b/internal/gitaly/service/ref/refs_test.go @@ -53,6 +53,25 @@ func TestFindDefaultBranchName(t *testing.T) { expectedName: git.DefaultRef, }, { + desc: "successful, HEAD only", + setup: func(t *testing.T, ctx context.Context, cfg config.Cfg) setupData { + repo, repoPath := gittest.CreateRepository(t, ctx, cfg) + + oid := gittest.WriteCommit(t, cfg, repoPath, gittest.WithReference(git.DefaultRef.String())) + gittest.WriteCommit(t, cfg, repoPath, gittest.WithReference(git.LegacyDefaultRef.String()), gittest.WithParents(oid)) + gittest.WriteCommit(t, cfg, repoPath, gittest.WithBranch("apple"), gittest.WithParents(oid)) + gittest.WriteCommit(t, cfg, repoPath, gittest.WithBranch("banana"), gittest.WithParents(oid)) + + return setupData{ + request: &gitalypb.FindDefaultBranchNameRequest{ + Repository: repo, + HeadOnly: true, + }, + } + }, + expectedName: git.DefaultRef, + }, + { desc: "successful, single branch", setup: func(t *testing.T, ctx context.Context, cfg config.Cfg) setupData { repo, repoPath := gittest.CreateRepository(t, ctx, cfg) @@ -68,6 +87,22 @@ func TestFindDefaultBranchName(t *testing.T) { expectedName: "refs/heads/banana", }, { + desc: "successful, single branch, HEAD only", + setup: func(t *testing.T, ctx context.Context, cfg config.Cfg) setupData { + repo, repoPath := gittest.CreateRepository(t, ctx, cfg) + + gittest.WriteCommit(t, cfg, repoPath, gittest.WithBranch("banana")) + + return setupData{ + request: &gitalypb.FindDefaultBranchNameRequest{ + Repository: repo, + HeadOnly: true, + }, + } + }, + expectedName: git.DefaultRef, + }, + { desc: "successful, updated default", setup: func(t *testing.T, ctx context.Context, cfg config.Cfg) setupData { repo, repoPath := gittest.CreateRepository(t, ctx, cfg) @@ -99,6 +134,20 @@ func TestFindDefaultBranchName(t *testing.T) { }, }, { + desc: "empty repository, HEAD only", + setup: func(t *testing.T, ctx context.Context, cfg config.Cfg) setupData { + repo, _ := gittest.CreateRepository(t, ctx, cfg) + + return setupData{ + request: &gitalypb.FindDefaultBranchNameRequest{ + Repository: repo, + HeadOnly: true, + }, + } + }, + expectedName: git.DefaultRef, + }, + { desc: "repository not provided", setup: func(t *testing.T, ctx context.Context, cfg config.Cfg) setupData { return setupData{ @@ -118,7 +167,7 @@ func TestFindDefaultBranchName(t *testing.T) { Repository: &gitalypb.Repository{StorageName: cfg.Storages[0].Name, RelativePath: "made/up/path"}, }, expectedErr: status.Error(codes.NotFound, testhelper.GitalyOrPraefect( - `GetRepoPath: not a git repository: "`+cfg.Storages[0].Path+`/made/up/path"`, + `get default branch: GetRepoPath: not a git repository: "`+cfg.Storages[0].Path+`/made/up/path"`, `accessor call: route repository accessor: consistent storages: repository "default"/"made/up/path" not found`, )), } @@ -134,7 +183,7 @@ func TestFindDefaultBranchName(t *testing.T) { Repository: &gitalypb.Repository{StorageName: "invalid", RelativePath: repo.GetRelativePath()}, }, expectedErr: status.Error(codes.InvalidArgument, testhelper.GitalyOrPraefect( - `GetStorageByName: no such storage: "invalid"`, + `get default branch: GetStorageByName: no such storage: "invalid"`, "repo scoped: invalid Repository", )), } |