diff --git a/routers/api/v1/repo/branch.go b/routers/api/v1/repo/branch.go index 9f2ca69b89..00c8b68109 100644 --- a/routers/api/v1/repo/branch.go +++ b/routers/api/v1/repo/branch.go @@ -436,15 +436,11 @@ func UpdateBranch(ctx *context.APIContext) { return } - if ctx.Repo.GitRepo == nil { - ctx.APIErrorInternal(nil) - return - } - - if err := repo_service.UpdateBranch(ctx, repo, ctx.Doer, branchName, opt.NewCommitID, opt.OldCommitID, opt.Force); err != nil { + // permission check has been done in api.go + if err := repo_service.UpdateBranch(ctx, repo, ctx.Repo.GitRepo, ctx.Doer, branchName, opt.NewCommitID, opt.OldCommitID, opt.Force); err != nil { switch { - case git_model.IsErrBranchNotExist(err): - ctx.APIError(http.StatusNotFound, "Branch doesn't exist.") + case git.IsErrNotExist(err): + ctx.APIError(http.StatusUnprocessableEntity, err) case repo_service.IsErrBranchCommitDoesNotMatch(err): ctx.APIError(http.StatusConflict, err) case git.IsErrPushOutOfDate(err): @@ -452,10 +448,6 @@ func UpdateBranch(ctx *context.APIContext) { case git.IsErrPushRejected(err): rej := err.(*git.ErrPushRejected) ctx.APIError(http.StatusForbidden, rej.Message) - case repo_model.IsErrUserDoesNotHaveAccessToRepo(err): - ctx.APIError(http.StatusForbidden, err) - case git.IsErrNotExist(err): - ctx.APIError(http.StatusUnprocessableEntity, err) default: ctx.APIErrorInternal(err) } diff --git a/services/repository/branch.go b/services/repository/branch.go index 1e38cc7e9c..c15f9291a5 100644 --- a/services/repository/branch.go +++ b/services/repository/branch.go @@ -484,34 +484,10 @@ func RenameBranch(ctx context.Context, repo *repo_model.Repository, doer *user_m return "", nil } -// UpdateBranch moves a branch reference to the provided commit. -func UpdateBranch(ctx context.Context, repo *repo_model.Repository, doer *user_model.User, branchName, newCommitID, expectedOldCommitID string, force bool) error { - if err := repo.MustNotBeArchived(); err != nil { - return err - } - - perm, err := access_model.GetUserRepoPermission(ctx, repo, doer) - if err != nil { - return err - } - if !perm.CanWrite(unit.TypeCode) { - return repo_model.ErrUserDoesNotHaveAccessToRepo{ - UserID: doer.ID, - RepoName: repo.LowerName, - } - } - - gitRepo, err := gitrepo.OpenRepository(ctx, repo) - if err != nil { - return fmt.Errorf("OpenRepository: %w", err) - } - defer gitRepo.Close() - +// UpdateBranch moves a branch reference to the provided commit. permission check should be done before calling this function. +func UpdateBranch(ctx context.Context, repo *repo_model.Repository, gitRepo *git.Repository, doer *user_model.User, branchName, newCommitID, expectedOldCommitID string, force bool) error { branchCommit, err := gitRepo.GetBranchCommit(branchName) if err != nil { - if git.IsErrNotExist(err) { - return git_model.ErrBranchNotExist{RepoID: repo.ID, BranchName: branchName} - } return err } currentCommitID := branchCommit.ID.String()