Skip to content

Commit 224aa64

Browse files
authored
Replace update repository function in some places (#34566)
`UpdateAllCols` is dangerous, the columns should be updated when necessary. This PR replaces some `updateRepository` invokes to reduce possible problems and wrongly updated time. Some parts have been fixed in #34388, but some are hidden in the function `updateRepository`. Alternatively, using `UpdateRepositoryColsNoAutoTime` to update the changed columns. Some `UpdateRepoSize` invokes are duplicated, so they will be removed when extracting from `updateRepository`.
1 parent 1e644e3 commit 224aa64

File tree

11 files changed

+121
-57
lines changed

11 files changed

+121
-57
lines changed

models/issues/pull.go

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -649,12 +649,6 @@ func GetAllUnmergedAgitPullRequestByPoster(ctx context.Context, uid int64) ([]*P
649649
return pulls, err
650650
}
651651

652-
// Update updates all fields of pull request.
653-
func (pr *PullRequest) Update(ctx context.Context) error {
654-
_, err := db.GetEngine(ctx).ID(pr.ID).AllCols().Update(pr)
655-
return err
656-
}
657-
658652
// UpdateCols updates specific fields of pull request.
659653
func (pr *PullRequest) UpdateCols(ctx context.Context, cols ...string) error {
660654
_, err := db.GetEngine(ctx).ID(pr.ID).Cols(cols...).Update(pr)

models/issues/pull_test.go

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -248,19 +248,6 @@ func TestGetPullRequestByIssueID(t *testing.T) {
248248
assert.True(t, issues_model.IsErrPullRequestNotExist(err))
249249
}
250250

251-
func TestPullRequest_Update(t *testing.T) {
252-
assert.NoError(t, unittest.PrepareTestDatabase())
253-
pr := unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{ID: 1})
254-
pr.BaseBranch = "baseBranch"
255-
pr.HeadBranch = "headBranch"
256-
pr.Update(db.DefaultContext)
257-
258-
pr = unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{ID: pr.ID})
259-
assert.Equal(t, "baseBranch", pr.BaseBranch)
260-
assert.Equal(t, "headBranch", pr.HeadBranch)
261-
unittest.CheckConsistencyFor(t, pr)
262-
}
263-
264251
func TestPullRequest_UpdateCols(t *testing.T) {
265252
assert.NoError(t, unittest.PrepareTestDatabase())
266253
pr := &issues_model.PullRequest{

models/repo/release.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ func AddReleaseAttachments(ctx context.Context, releaseID int64, attachmentUUIDs
180180
}
181181
attachments[i].ReleaseID = releaseID
182182
// No assign value could be 0, so ignore AllCols().
183-
if _, err = db.GetEngine(ctx).ID(attachments[i].ID).Update(attachments[i]); err != nil {
183+
if _, err = db.GetEngine(ctx).ID(attachments[i].ID).Cols("release_id").Update(attachments[i]); err != nil {
184184
return fmt.Errorf("update attachment [%d]: %w", attachments[i].ID, err)
185185
}
186186
}

models/repo/update.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,12 +42,18 @@ func UpdateRepositoryUpdatedTime(ctx context.Context, repoID int64, updateTime t
4242

4343
// UpdateRepositoryColsWithAutoTime updates repository's columns
4444
func UpdateRepositoryColsWithAutoTime(ctx context.Context, repo *Repository, cols ...string) error {
45+
if len(cols) == 0 {
46+
return nil
47+
}
4548
_, err := db.GetEngine(ctx).ID(repo.ID).Cols(cols...).Update(repo)
4649
return err
4750
}
4851

4952
// UpdateRepositoryColsNoAutoTime updates repository's columns and but applies time change automatically
5053
func UpdateRepositoryColsNoAutoTime(ctx context.Context, repo *Repository, cols ...string) error {
54+
if len(cols) == 0 {
55+
return nil
56+
}
5157
_, err := db.GetEngine(ctx).ID(repo.ID).Cols(cols...).NoAutoTime().Update(repo)
5258
return err
5359
}

routers/web/repo/wiki_test.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,12 @@ func TestDefaultWikiBranch(t *testing.T) {
245245
assert.NoError(t, wiki_service.ChangeDefaultWikiBranch(db.DefaultContext, repoWithNoWiki, "main"))
246246

247247
// repo with wiki
248-
assert.NoError(t, repo_model.UpdateRepositoryColsNoAutoTime(db.DefaultContext, &repo_model.Repository{ID: 1, DefaultWikiBranch: "wrong-branch"}))
248+
assert.NoError(t, repo_model.UpdateRepositoryColsNoAutoTime(
249+
db.DefaultContext,
250+
&repo_model.Repository{ID: 1, DefaultWikiBranch: "wrong-branch"},
251+
"default_wiki_branch",
252+
),
253+
)
249254

250255
ctx, _ := contexttest.MockContext(t, "user2/repo1/wiki")
251256
ctx.SetPathParam("*", "Home")

services/repository/adopt.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -196,8 +196,13 @@ func adoptRepository(ctx context.Context, repo *repo_model.Repository, defaultBr
196196
return fmt.Errorf("setDefaultBranch: %w", err)
197197
}
198198
}
199-
if err = updateRepository(ctx, repo, false); err != nil {
200-
return fmt.Errorf("updateRepository: %w", err)
199+
200+
if err = repo_model.UpdateRepositoryColsNoAutoTime(ctx, repo, "is_empty", "default_branch"); err != nil {
201+
return fmt.Errorf("UpdateRepositoryCols: %w", err)
202+
}
203+
204+
if err = repo_module.UpdateRepoSize(ctx, repo); err != nil {
205+
log.Error("Failed to update size for repository: %v", err)
201206
}
202207

203208
return nil

services/repository/create.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -191,10 +191,14 @@ func initRepository(ctx context.Context, u *user_model.User, repo *repo_model.Re
191191
}
192192
}
193193

194-
if err = UpdateRepository(ctx, repo, false); err != nil {
194+
if err = repo_model.UpdateRepositoryColsNoAutoTime(ctx, repo, "is_empty", "default_branch", "default_wiki_branch"); err != nil {
195195
return fmt.Errorf("updateRepository: %w", err)
196196
}
197197

198+
if err = repo_module.UpdateRepoSize(ctx, repo); err != nil {
199+
log.Error("Failed to update size for repository: %v", err)
200+
}
201+
198202
return nil
199203
}
200204

services/repository/fork.go

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,7 @@ func ForkRepository(ctx context.Context, doer, owner *user_model.User, opts Fork
209209

210210
// ConvertForkToNormalRepository convert the provided repo from a forked repo to normal repo
211211
func ConvertForkToNormalRepository(ctx context.Context, repo *repo_model.Repository) error {
212-
err := db.WithTx(ctx, func(ctx context.Context) error {
212+
return db.WithTx(ctx, func(ctx context.Context) error {
213213
repo, err := repo_model.GetRepositoryByID(ctx, repo.ID)
214214
if err != nil {
215215
return err
@@ -226,16 +226,8 @@ func ConvertForkToNormalRepository(ctx context.Context, repo *repo_model.Reposit
226226

227227
repo.IsFork = false
228228
repo.ForkID = 0
229-
230-
if err := updateRepository(ctx, repo, false); err != nil {
231-
log.Error("Unable to update repository %-v whilst converting from fork. Error: %v", repo, err)
232-
return err
233-
}
234-
235-
return nil
229+
return repo_model.UpdateRepositoryColsNoAutoTime(ctx, repo, "is_fork", "fork_id")
236230
})
237-
238-
return err
239231
}
240232

241233
type findForksOptions struct {

services/repository/generate.go

Lines changed: 10 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -253,43 +253,35 @@ func generateRepoCommit(ctx context.Context, repo, templateRepo, generateRepo *r
253253
return initRepoCommit(ctx, tmpDir, repo, repo.Owner, defaultBranch)
254254
}
255255

256-
func generateGitContent(ctx context.Context, repo, templateRepo, generateRepo *repo_model.Repository) (err error) {
257-
tmpDir, cleanup, err := setting.AppDataTempDir("git-repo-content").MkdirTempRandom("gitea-" + repo.Name)
256+
// GenerateGitContent generates git content from a template repository
257+
func GenerateGitContent(ctx context.Context, templateRepo, generateRepo *repo_model.Repository) (err error) {
258+
tmpDir, cleanup, err := setting.AppDataTempDir("git-repo-content").MkdirTempRandom("gitea-" + generateRepo.Name)
258259
if err != nil {
259-
return fmt.Errorf("failed to create temp dir for repository %s: %w", repo.FullName(), err)
260+
return fmt.Errorf("failed to create temp dir for repository %s: %w", generateRepo.FullName(), err)
260261
}
261262
defer cleanup()
262263

263-
if err = generateRepoCommit(ctx, repo, templateRepo, generateRepo, tmpDir); err != nil {
264+
if err = generateRepoCommit(ctx, generateRepo, templateRepo, generateRepo, tmpDir); err != nil {
264265
return fmt.Errorf("generateRepoCommit: %w", err)
265266
}
266267

267268
// re-fetch repo
268-
if repo, err = repo_model.GetRepositoryByID(ctx, repo.ID); err != nil {
269+
if generateRepo, err = repo_model.GetRepositoryByID(ctx, generateRepo.ID); err != nil {
269270
return fmt.Errorf("getRepositoryByID: %w", err)
270271
}
271272

272273
// if there was no default branch supplied when generating the repo, use the default one from the template
273-
if strings.TrimSpace(repo.DefaultBranch) == "" {
274-
repo.DefaultBranch = templateRepo.DefaultBranch
274+
if strings.TrimSpace(generateRepo.DefaultBranch) == "" {
275+
generateRepo.DefaultBranch = templateRepo.DefaultBranch
275276
}
276277

277-
if err = gitrepo.SetDefaultBranch(ctx, repo, repo.DefaultBranch); err != nil {
278+
if err = gitrepo.SetDefaultBranch(ctx, generateRepo, generateRepo.DefaultBranch); err != nil {
278279
return fmt.Errorf("setDefaultBranch: %w", err)
279280
}
280-
if err = UpdateRepository(ctx, repo, false); err != nil {
281+
if err = repo_model.UpdateRepositoryColsNoAutoTime(ctx, generateRepo, "default_branch"); err != nil {
281282
return fmt.Errorf("updateRepository: %w", err)
282283
}
283284

284-
return nil
285-
}
286-
287-
// GenerateGitContent generates git content from a template repository
288-
func GenerateGitContent(ctx context.Context, templateRepo, generateRepo *repo_model.Repository) error {
289-
if err := generateGitContent(ctx, generateRepo, templateRepo, generateRepo); err != nil {
290-
return err
291-
}
292-
293285
if err := repo_module.UpdateRepoSize(ctx, generateRepo); err != nil {
294286
return fmt.Errorf("failed to update size for repository: %w", err)
295287
}

services/repository/migrate.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -220,10 +220,14 @@ func MigrateRepositoryGitData(ctx context.Context, u *user_model.User,
220220
}
221221

222222
repo.IsMirror = true
223-
if err = UpdateRepository(ctx, repo, false); err != nil {
223+
if err = repo_model.UpdateRepositoryColsNoAutoTime(ctx, repo, "num_watches", "is_empty", "default_branch", "default_wiki_branch", "is_mirror"); err != nil {
224224
return nil, err
225225
}
226226

227+
if err = repo_module.UpdateRepoSize(ctx, repo); err != nil {
228+
log.Error("Failed to update size for repository: %v", err)
229+
}
230+
227231
// this is necessary for sync local tags from remote
228232
configName := fmt.Sprintf("remote.%s.fetch", mirrorModel.GetRemoteName())
229233
if stdout, _, err := git.NewCommand("config").

0 commit comments

Comments
 (0)