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 ab09ca70e..f9623447d 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 @@ -181,6 +181,53 @@ func (_c *MockGitServer_CopyRepository_Call) RunAndReturn(run func(context.Conte return _c } +// CreateBranch provides a mock function with given fields: ctx, req +func (_m *MockGitServer) CreateBranch(ctx context.Context, req gitserver.CreateBranchReq) error { + ret := _m.Called(ctx, req) + + if len(ret) == 0 { + panic("no return value specified for CreateBranch") + } + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, gitserver.CreateBranchReq) error); ok { + r0 = rf(ctx, req) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// MockGitServer_CreateBranch_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'CreateBranch' +type MockGitServer_CreateBranch_Call struct { + *mock.Call +} + +// CreateBranch is a helper method to define mock.On call +// - ctx context.Context +// - req gitserver.CreateBranchReq +func (_e *MockGitServer_Expecter) CreateBranch(ctx interface{}, req interface{}) *MockGitServer_CreateBranch_Call { + return &MockGitServer_CreateBranch_Call{Call: _e.mock.On("CreateBranch", ctx, req)} +} + +func (_c *MockGitServer_CreateBranch_Call) Run(run func(ctx context.Context, req gitserver.CreateBranchReq)) *MockGitServer_CreateBranch_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(gitserver.CreateBranchReq)) + }) + return _c +} + +func (_c *MockGitServer_CreateBranch_Call) Return(_a0 error) *MockGitServer_CreateBranch_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockGitServer_CreateBranch_Call) RunAndReturn(run func(context.Context, gitserver.CreateBranchReq) error) *MockGitServer_CreateBranch_Call { + _c.Call.Return(run) + return _c +} + // CreateMirrorRepo provides a mock function with given fields: ctx, req func (_m *MockGitServer) CreateMirrorRepo(ctx context.Context, req gitserver.CreateMirrorRepoReq) (int64, error) { ret := _m.Called(ctx, req) diff --git a/builder/git/gitserver/gitaly/branch.go b/builder/git/gitserver/gitaly/branch.go index 3b57b9287..116b3264e 100644 --- a/builder/git/gitserver/gitaly/branch.go +++ b/builder/git/gitserver/gitaly/branch.go @@ -130,3 +130,49 @@ func (c *Client) DeleteRepoBranch(ctx context.Context, req gitserver.DeleteBranc return nil } + +func (c *Client) CreateBranch(ctx context.Context, req gitserver.CreateBranchReq) error { + repoType := fmt.Sprintf("%ss", string(req.RepoType)) + relativePath, err := c.BuildRelativePath(ctx, req.RepoType, req.Namespace, req.Name) + if err != nil { + return err + } + client, err := c.refClient.UpdateReferences(ctx) + if err != nil { + return err + } + createBranchReq := &gitalypb.UpdateReferencesRequest{ + Repository: &gitalypb.Repository{ + StorageName: c.config.GitalyServer.Storage, + RelativePath: relativePath, + GlRepository: filepath.Join(repoType, req.Namespace, req.Name), + }, + Updates: []*gitalypb.UpdateReferencesRequest_Update{ + { + Reference: []byte("refs/heads/" + req.BranchName), + NewObjectId: []byte(req.CommitID), + }, + }, + } + + err = client.Send(createBranchReq) + if err != nil { + return errorx.CreateBranchFailed(err, errorx.Ctx(). + Set("repo_type", req.RepoType). + Set("path", relativePath). + Set("branch", req.BranchName). + Set("commit_id", req.CommitID), + ) + } + + _, err = client.CloseAndRecv() + if err != nil { + return errorx.CreateBranchFailed(err, errorx.Ctx(). + Set("repo_type", req.RepoType). + Set("path", relativePath). + Set("branch", req.BranchName). + Set("commit_id", req.CommitID), + ) + } + return nil +} diff --git a/builder/git/gitserver/gitea/branch.go b/builder/git/gitserver/gitea/branch.go index df7e435a9..1647e62e6 100644 --- a/builder/git/gitserver/gitea/branch.go +++ b/builder/git/gitserver/gitea/branch.go @@ -62,3 +62,7 @@ func (c *Client) GetRepoBranchByName(ctx context.Context, req gitserver.GetBranc func (c *Client) DeleteRepoBranch(ctx context.Context, req gitserver.DeleteBranchReq) error { return nil } + +func (c *Client) CreateBranch(ctx context.Context, req gitserver.CreateBranchReq) error { + return nil +} diff --git a/builder/git/gitserver/interface.go b/builder/git/gitserver/interface.go index 0a5d52d63..b873af573 100644 --- a/builder/git/gitserver/interface.go +++ b/builder/git/gitserver/interface.go @@ -26,6 +26,7 @@ type GitServer interface { CreateRepo(ctx context.Context, req CreateRepoReq) (*CreateRepoResp, error) UpdateRepo(ctx context.Context, req UpdateRepoReq) (*CreateRepoResp, error) DeleteRepo(ctx context.Context, relativePath string) error + CreateBranch(ctx context.Context, req CreateBranchReq) error 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 diff --git a/builder/git/gitserver/types.go b/builder/git/gitserver/types.go index 45e32bc15..9b750d6f2 100644 --- a/builder/git/gitserver/types.go +++ b/builder/git/gitserver/types.go @@ -100,6 +100,14 @@ type GetBranchesReq struct { RepoType types.RepositoryType `json:"repo_type"` } +type CreateBranchReq struct { + Namespace string `json:"namespace"` + Name string `json:"name"` + BranchName string `json:"branch_name"` + CommitID string `json:"commit_id"` + 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 b39ebce94..329b855ba 100644 --- a/common/errorx/error_git.go +++ b/common/errorx/error_git.go @@ -19,6 +19,7 @@ const ( gitFindBranchFailed gitBranchNotFound gitDeleteBranchFailed + gitCreateBranchFailed gitFileNotFound gitUploadFailed gitDownloadFailed @@ -555,6 +556,15 @@ func DeleteBranchFailed(err error, ctx context) error { } } +func CreateBranchFailed(err error, ctx context) error { + return CustomError{ + prefix: errGitPrefix, + code: gitCreateBranchFailed, + err: err, + context: ctx, + } +} + func GitFileNotFound(err error, ctx context) error { return CustomError{ prefix: errGitPrefix, diff --git a/component/checker/wire_gen.go b/component/checker/wire_gen.go index 75180265d..b3f2ab109 100644 --- a/component/checker/wire_gen.go +++ b/component/checker/wire_gen.go @@ -8,6 +8,7 @@ package checker import ( "context" + "github.com/stretchr/testify/mock" "opencsg.com/csghub-server/_mocks/opencsg.com/csghub-server/builder/git/gitserver" "opencsg.com/csghub-server/_mocks/opencsg.com/csghub-server/builder/store/s3"