diff --git a/_mocks/opencsg.com/csghub-server/builder/git/gitserver/mock_GitServer.go b/_mocks/opencsg.com/csghub-server/builder/git/gitserver/mock_GitServer.go index f9623447d..84fc259d6 100644 --- a/_mocks/opencsg.com/csghub-server/builder/git/gitserver/mock_GitServer.go +++ b/_mocks/opencsg.com/csghub-server/builder/git/gitserver/mock_GitServer.go @@ -2399,6 +2399,53 @@ func (_c *MockGitServer_RepositoryExists_Call) RunAndReturn(run func(context.Con return _c } +// SetDefaultBranch provides a mock function with given fields: ctx, req +func (_m *MockGitServer) SetDefaultBranch(ctx context.Context, req gitserver.SetDefaultBranchReq) error { + ret := _m.Called(ctx, req) + + if len(ret) == 0 { + panic("no return value specified for SetDefaultBranch") + } + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, gitserver.SetDefaultBranchReq) error); ok { + r0 = rf(ctx, req) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// MockGitServer_SetDefaultBranch_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetDefaultBranch' +type MockGitServer_SetDefaultBranch_Call struct { + *mock.Call +} + +// SetDefaultBranch is a helper method to define mock.On call +// - ctx context.Context +// - req gitserver.SetDefaultBranchReq +func (_e *MockGitServer_Expecter) SetDefaultBranch(ctx interface{}, req interface{}) *MockGitServer_SetDefaultBranch_Call { + return &MockGitServer_SetDefaultBranch_Call{Call: _e.mock.On("SetDefaultBranch", ctx, req)} +} + +func (_c *MockGitServer_SetDefaultBranch_Call) Run(run func(ctx context.Context, req gitserver.SetDefaultBranchReq)) *MockGitServer_SetDefaultBranch_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(gitserver.SetDefaultBranchReq)) + }) + return _c +} + +func (_c *MockGitServer_SetDefaultBranch_Call) Return(_a0 error) *MockGitServer_SetDefaultBranch_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockGitServer_SetDefaultBranch_Call) RunAndReturn(run func(context.Context, gitserver.SetDefaultBranchReq) error) *MockGitServer_SetDefaultBranch_Call { + _c.Call.Return(run) + return _c +} + // UpdateOrganization provides a mock function with given fields: _a0, _a1 func (_m *MockGitServer) UpdateOrganization(_a0 *types.EditOrgReq, _a1 *database.Organization) (*database.Organization, error) { ret := _m.Called(_a0, _a1) diff --git a/builder/git/gitserver/gitaly/branch.go b/builder/git/gitserver/gitaly/branch.go index 116b3264e..ab3438058 100644 --- a/builder/git/gitserver/gitaly/branch.go +++ b/builder/git/gitserver/gitaly/branch.go @@ -176,3 +176,28 @@ func (c *Client) CreateBranch(ctx context.Context, req gitserver.CreateBranchReq } return nil } + +func (c *Client) SetDefaultBranch(ctx context.Context, req gitserver.SetDefaultBranchReq) error { + repoType := fmt.Sprintf("%ss", string(req.RepoType)) + relativePath, err := c.BuildRelativePath(ctx, req.RepoType, req.Namespace, req.Name) + if err != nil { + return err + } + _, err = c.repoClient.WriteRef(ctx, &gitalypb.WriteRefRequest{ + Repository: &gitalypb.Repository{ + StorageName: c.config.GitalyServer.Storage, + RelativePath: relativePath, + GlRepository: filepath.Join(repoType, req.Namespace, req.Name), + }, + Ref: []byte("HEAD"), + Revision: []byte("refs/heads/" + req.BranchName), + }) + if err != nil { + return errorx.SetDefaultBranchFailed(err, errorx.Ctx(). + Set("repo_type", req.RepoType). + Set("path", relativePath). + Set("branch", req.BranchName), + ) + } + return nil +} diff --git a/builder/git/gitserver/gitea/branch.go b/builder/git/gitserver/gitea/branch.go index 1647e62e6..a22794f76 100644 --- a/builder/git/gitserver/gitea/branch.go +++ b/builder/git/gitserver/gitea/branch.go @@ -66,3 +66,7 @@ func (c *Client) DeleteRepoBranch(ctx context.Context, req gitserver.DeleteBranc func (c *Client) CreateBranch(ctx context.Context, req gitserver.CreateBranchReq) error { return nil } + +func (c *Client) SetDefaultBranch(ctx context.Context, req gitserver.SetDefaultBranchReq) error { + return nil +} diff --git a/builder/git/gitserver/interface.go b/builder/git/gitserver/interface.go index b873af573..0095af748 100644 --- a/builder/git/gitserver/interface.go +++ b/builder/git/gitserver/interface.go @@ -30,6 +30,7 @@ type GitServer interface { GetRepoBranches(ctx context.Context, req GetBranchesReq) ([]types.Branch, error) GetRepoBranchByName(ctx context.Context, req GetBranchReq) (*types.Branch, error) DeleteRepoBranch(ctx context.Context, req DeleteBranchReq) error + SetDefaultBranch(ctx context.Context, req SetDefaultBranchReq) error GetRepoCommits(ctx context.Context, req GetRepoCommitsReq) ([]types.Commit, *types.RepoPageOpts, error) GetRepoLastCommit(ctx context.Context, req GetRepoLastCommitReq) (*types.Commit, error) GetSingleCommit(ctx context.Context, req GetRepoLastCommitReq) (*types.CommitResponse, error) diff --git a/builder/git/gitserver/types.go b/builder/git/gitserver/types.go index 9b750d6f2..0826115f6 100644 --- a/builder/git/gitserver/types.go +++ b/builder/git/gitserver/types.go @@ -108,6 +108,13 @@ type CreateBranchReq struct { RepoType types.RepositoryType `json:"repo_type"` } +type SetDefaultBranchReq struct { + Namespace string `json:"namespace"` + Name string `json:"name"` + BranchName string `json:"branch_name"` + RepoType types.RepositoryType `json:"repo_type"` +} + type GetBranchReq struct { Namespace string `json:"namespace"` Name string `json:"name"` diff --git a/common/errorx/error_git.go b/common/errorx/error_git.go index 329b855ba..d8d786c31 100644 --- a/common/errorx/error_git.go +++ b/common/errorx/error_git.go @@ -20,6 +20,7 @@ const ( gitBranchNotFound gitDeleteBranchFailed gitCreateBranchFailed + gitSetDefaultBranchFailed gitFileNotFound gitUploadFailed gitDownloadFailed @@ -565,6 +566,15 @@ func CreateBranchFailed(err error, ctx context) error { } } +func SetDefaultBranchFailed(err error, ctx context) error { + return CustomError{ + prefix: errGitPrefix, + code: gitSetDefaultBranchFailed, + err: err, + context: ctx, + } +} + func GitFileNotFound(err error, ctx context) error { return CustomError{ prefix: errGitPrefix,