Replace #28625 Backport #28624 by lunny #28361 introduced `syncBranchToDB` in `CreateNewBranchFromCommit`. This PR will revert the change because it's unnecessary. Every push will already be checked by `syncBranchToDB`. This PR also created a test to ensure it's right.tags/v1.21.4
@@ -281,28 +281,17 @@ func CreateNewBranchFromCommit(ctx context.Context, doer *user_model.User, repo | |||
return err | |||
} | |||
return db.WithTx(ctx, func(ctx context.Context) error { | |||
commit, err := gitRepo.GetCommit(commitID) | |||
if err != nil { | |||
return err | |||
} | |||
// database operation should be done before git operation so that we can rollback if git operation failed | |||
if err := syncBranchToDB(ctx, repo.ID, doer.ID, branchName, commit); err != nil { | |||
if err := git.Push(ctx, repo.RepoPath(), git.PushOptions{ | |||
Remote: repo.RepoPath(), | |||
Branch: fmt.Sprintf("%s:%s%s", commitID, git.BranchPrefix, branchName), | |||
Env: repo_module.PushingEnvironment(doer, repo), | |||
}); err != nil { | |||
if git.IsErrPushOutOfDate(err) || git.IsErrPushRejected(err) { | |||
return err | |||
} | |||
if err := git.Push(ctx, repo.RepoPath(), git.PushOptions{ | |||
Remote: repo.RepoPath(), | |||
Branch: fmt.Sprintf("%s:%s%s", commitID, git.BranchPrefix, branchName), | |||
Env: repo_module.PushingEnvironment(doer, repo), | |||
}); err != nil { | |||
if git.IsErrPushOutOfDate(err) || git.IsErrPushRejected(err) { | |||
return err | |||
} | |||
return fmt.Errorf("push: %w", err) | |||
} | |||
return nil | |||
}) | |||
return fmt.Errorf("push: %w", err) | |||
} | |||
return nil | |||
} | |||
// RenameBranch rename a branch |
@@ -9,6 +9,8 @@ import ( | |||
"testing" | |||
auth_model "code.gitea.io/gitea/models/auth" | |||
"code.gitea.io/gitea/models/db" | |||
git_model "code.gitea.io/gitea/models/git" | |||
api "code.gitea.io/gitea/modules/structs" | |||
"code.gitea.io/gitea/tests" | |||
@@ -212,3 +214,37 @@ func TestAPIBranchProtection(t *testing.T) { | |||
testAPIDeleteBranch(t, "master", http.StatusForbidden) | |||
testAPIDeleteBranch(t, "branch2", http.StatusNoContent) | |||
} | |||
func TestAPICreateBranchWithSyncBranches(t *testing.T) { | |||
defer tests.PrepareTestEnv(t)() | |||
branches, err := git_model.FindBranches(db.DefaultContext, git_model.FindBranchOptions{ | |||
RepoID: 1, | |||
}) | |||
assert.NoError(t, err) | |||
assert.Len(t, branches, 4) | |||
// make a broke repository with no branch on database | |||
_, err = db.DeleteByBean(db.DefaultContext, git_model.Branch{RepoID: 1}) | |||
assert.NoError(t, err) | |||
onGiteaRun(t, func(t *testing.T, giteaURL *url.URL) { | |||
ctx := NewAPITestContext(t, "user2", "repo1", auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteUser) | |||
giteaURL.Path = ctx.GitPath() | |||
testAPICreateBranch(t, ctx.Session, "user2", "repo1", "", "new_branch", http.StatusCreated) | |||
}) | |||
branches, err = git_model.FindBranches(db.DefaultContext, git_model.FindBranchOptions{ | |||
RepoID: 1, | |||
}) | |||
assert.NoError(t, err) | |||
assert.Len(t, branches, 5) | |||
branches, err = git_model.FindBranches(db.DefaultContext, git_model.FindBranchOptions{ | |||
RepoID: 1, | |||
Keyword: "new_branch", | |||
}) | |||
assert.NoError(t, err) | |||
assert.Len(t, branches, 1) | |||
} |