From 8e066c2f167b427111927112b691feabbb7d1f94 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Sat, 21 Jun 2025 12:56:07 -0700 Subject: [PATCH 1/4] Use standalone function to update repository cols --- routers/web/repo/setting/setting.go | 27 +++++++++------------------ services/repository/repository.go | 20 ++++++++++++++++++++ 2 files changed, 29 insertions(+), 18 deletions(-) diff --git a/routers/web/repo/setting/setting.go b/routers/web/repo/setting/setting.go index 6602685e94888..e16c650e737d0 100644 --- a/routers/web/repo/setting/setting.go +++ b/routers/web/repo/setting/setting.go @@ -663,44 +663,35 @@ func handleSettingsPostAdvanced(ctx *context.Context) { func handleSettingsPostSigning(ctx *context.Context) { form := web.GetForm(ctx).(*forms.RepoSettingForm) repo := ctx.Repo.Repository - changed := false trustModel := repo_model.ToTrustModel(form.TrustModel) if trustModel != repo.TrustModel { - repo.TrustModel = trustModel - changed = true - } - - if changed { - if err := repo_service.UpdateRepository(ctx, repo, false); err != nil { + if err := repo_service.UpdateRepositoryTrustModel(ctx, repo, trustModel); err != nil { ctx.ServerError("UpdateRepository", err) return } + log.Trace("Repository signing settings updated: %s/%s", ctx.Repo.Owner.Name, repo.Name) } - log.Trace("Repository signing settings updated: %s/%s", ctx.Repo.Owner.Name, repo.Name) ctx.Flash.Success(ctx.Tr("repo.settings.update_settings_success")) ctx.Redirect(ctx.Repo.RepoLink + "/settings") } func handleSettingsPostAdmin(ctx *context.Context) { - form := web.GetForm(ctx).(*forms.RepoSettingForm) - repo := ctx.Repo.Repository if !ctx.Doer.IsAdmin { ctx.HTTPError(http.StatusForbidden) return } + repo := ctx.Repo.Repository + form := web.GetForm(ctx).(*forms.RepoSettingForm) if repo.IsFsckEnabled != form.EnableHealthCheck { - repo.IsFsckEnabled = form.EnableHealthCheck - } - - if err := repo_service.UpdateRepository(ctx, repo, false); err != nil { - ctx.ServerError("UpdateRepository", err) - return + if err := repo_service.UpdateRepositoryHealthCheck(ctx, repo, form.EnableHealthCheck); err != nil { + ctx.ServerError("UpdateRepository", err) + return + } + log.Trace("Repository admin settings updated: %s/%s", ctx.Repo.Owner.Name, repo.Name) } - log.Trace("Repository admin settings updated: %s/%s", ctx.Repo.Owner.Name, repo.Name) - ctx.Flash.Success(ctx.Tr("repo.settings.update_settings_success")) ctx.Redirect(ctx.Repo.RepoLink + "/settings") } diff --git a/services/repository/repository.go b/services/repository/repository.go index e574dc6c0181d..151b9a22a6796 100644 --- a/services/repository/repository.go +++ b/services/repository/repository.go @@ -124,6 +124,26 @@ func UpdateRepository(ctx context.Context, repo *repo_model.Repository, visibili }) } +func UpdateRepositoryTrustModel(ctx context.Context, repo *repo_model.Repository, trustModel repo_model.TrustModelType) (err error) { + return db.WithTx(ctx, func(ctx context.Context) error { + repo.TrustModel = trustModel + if err := repo_model.UpdateRepositoryColsNoAutoTime(ctx, repo, "trust_model"); err != nil { + return fmt.Errorf("UpdateRepositoryColsNoAutoTime: %w", err) + } + return nil + }) +} + +func UpdateRepositoryHealthCheck(ctx context.Context, repo *repo_model.Repository, healthCheckEnabled bool) (err error) { + return db.WithTx(ctx, func(ctx context.Context) error { + repo.IsFsckEnabled = healthCheckEnabled + if err := repo_model.UpdateRepositoryColsNoAutoTime(ctx, repo, "is_fsck_enabled"); err != nil { + return fmt.Errorf("UpdateRepositoryColsNoAutoTime: %w", err) + } + return nil + }) +} + func MakeRepoPublic(ctx context.Context, repo *repo_model.Repository) (err error) { return db.WithTx(ctx, func(ctx context.Context) error { repo.IsPrivate = false From 27f484e4717f64c31a0dd3325b1ee351c05a454f Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Tue, 24 Jun 2025 10:18:28 -0700 Subject: [PATCH 2/4] Fix wrong updated time when syncing repository --- modules/repository/branch.go | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/modules/repository/branch.go b/modules/repository/branch.go index 2bf9930f19fd3..d7bd1b74aea08 100644 --- a/modules/repository/branch.go +++ b/modules/repository/branch.go @@ -41,11 +41,12 @@ func SyncRepoBranchesWithRepo(ctx context.Context, repo *repo_model.Repository, if err != nil { return 0, fmt.Errorf("GetObjectFormat: %w", err) } - _, err = db.GetEngine(ctx).ID(repo.ID).Update(&repo_model.Repository{ObjectFormatName: objFmt.Name()}) - if err != nil { - return 0, fmt.Errorf("UpdateRepository: %w", err) + if objFmt.Name() != repo.ObjectFormatName { + repo.ObjectFormatName = objFmt.Name() // keep consistent with db + if err = repo_model.UpdateRepositoryColsWithAutoTime(ctx, repo, "object_format_name"); err != nil { + return 0, fmt.Errorf("UpdateRepository: %w", err) + } } - repo.ObjectFormatName = objFmt.Name() // keep consistent with db allBranches := container.Set[string]{} { From 848afdba8413945f61e8b9c37a01482cc7f45879 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Tue, 24 Jun 2025 10:21:00 -0700 Subject: [PATCH 3/4] improvements --- modules/repository/branch.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/repository/branch.go b/modules/repository/branch.go index d7bd1b74aea08..30aa0a6e85ec1 100644 --- a/modules/repository/branch.go +++ b/modules/repository/branch.go @@ -42,9 +42,9 @@ func SyncRepoBranchesWithRepo(ctx context.Context, repo *repo_model.Repository, return 0, fmt.Errorf("GetObjectFormat: %w", err) } if objFmt.Name() != repo.ObjectFormatName { - repo.ObjectFormatName = objFmt.Name() // keep consistent with db + repo.ObjectFormatName = objFmt.Name() if err = repo_model.UpdateRepositoryColsWithAutoTime(ctx, repo, "object_format_name"); err != nil { - return 0, fmt.Errorf("UpdateRepository: %w", err) + return 0, fmt.Errorf("UpdateRepositoryColsWithAutoTime: %w", err) } } From aa00202f07d68b64ea8e1a2decea492ac66084d8 Mon Sep 17 00:00:00 2001 From: wxiaoguang Date: Thu, 26 Jun 2025 19:18:04 +0800 Subject: [PATCH 4/4] fix --- models/repo/update.go | 18 ++++++------------ routers/private/hook_post_receive.go | 26 ++++++++++---------------- routers/web/repo/setting/setting.go | 10 ++++++---- services/repository/repository.go | 20 -------------------- 4 files changed, 22 insertions(+), 52 deletions(-) diff --git a/models/repo/update.go b/models/repo/update.go index f82ff7c76c222..64065f11c46e2 100644 --- a/models/repo/update.go +++ b/models/repo/update.go @@ -40,21 +40,15 @@ func UpdateRepositoryUpdatedTime(ctx context.Context, repoID int64, updateTime t return err } -// UpdateRepositoryColsWithAutoTime updates repository's columns -func UpdateRepositoryColsWithAutoTime(ctx context.Context, repo *Repository, cols ...string) error { - if len(cols) == 0 { - return nil - } - _, err := db.GetEngine(ctx).ID(repo.ID).Cols(cols...).Update(repo) +// UpdateRepositoryColsWithAutoTime updates repository's columns and the timestamp fields automatically +func UpdateRepositoryColsWithAutoTime(ctx context.Context, repo *Repository, colName string, moreColNames ...string) error { + _, err := db.GetEngine(ctx).ID(repo.ID).Cols(append([]string{colName}, moreColNames...)...).Update(repo) return err } -// UpdateRepositoryColsNoAutoTime updates repository's columns and but applies time change automatically -func UpdateRepositoryColsNoAutoTime(ctx context.Context, repo *Repository, cols ...string) error { - if len(cols) == 0 { - return nil - } - _, err := db.GetEngine(ctx).ID(repo.ID).Cols(cols...).NoAutoTime().Update(repo) +// UpdateRepositoryColsNoAutoTime updates repository's columns, doesn't change timestamp field automatically +func UpdateRepositoryColsNoAutoTime(ctx context.Context, repo *Repository, colName string, moreColNames ...string) error { + _, err := db.GetEngine(ctx).ID(repo.ID).Cols(append([]string{colName}, moreColNames...)...).NoAutoTime().Update(repo) return err } diff --git a/routers/private/hook_post_receive.go b/routers/private/hook_post_receive.go index a391e572b34cc..e8bef7d6c14bb 100644 --- a/routers/private/hook_post_receive.go +++ b/routers/private/hook_post_receive.go @@ -207,25 +207,19 @@ func HookPostReceive(ctx *gitea_context.PrivateContext) { return } - cols := make([]string, 0, 2) - - if isPrivate.Has() { + // FIXME: these options are not quite right, for example: changing visibility should do more works than just setting the is_private flag + // These options should only be used for "push-to-create" + if isPrivate.Has() && repo.IsPrivate != isPrivate.Value() { + // TODO: it needs to do more work repo.IsPrivate = isPrivate.Value() - cols = append(cols, "is_private") + if err = repo_model.UpdateRepositoryColsNoAutoTime(ctx, repo, "is_private"); err != nil { + ctx.JSON(http.StatusInternalServerError, private.HookPostReceiveResult{Err: "Failed to change visibility"}) + } } - - if isTemplate.Has() { + if isTemplate.Has() && repo.IsTemplate != isTemplate.Value() { repo.IsTemplate = isTemplate.Value() - cols = append(cols, "is_template") - } - - if len(cols) > 0 { - if err := repo_model.UpdateRepositoryColsNoAutoTime(ctx, repo, cols...); err != nil { - log.Error("Failed to Update: %s/%s Error: %v", ownerName, repoName, err) - ctx.JSON(http.StatusInternalServerError, private.HookPostReceiveResult{ - Err: fmt.Sprintf("Failed to Update: %s/%s Error: %v", ownerName, repoName, err), - }) - return + if err = repo_model.UpdateRepositoryColsNoAutoTime(ctx, repo, "is_template"); err != nil { + ctx.JSON(http.StatusInternalServerError, private.HookPostReceiveResult{Err: "Failed to change template status"}) } } } diff --git a/routers/web/repo/setting/setting.go b/routers/web/repo/setting/setting.go index e16c650e737d0..6e16ead183c9e 100644 --- a/routers/web/repo/setting/setting.go +++ b/routers/web/repo/setting/setting.go @@ -665,8 +665,9 @@ func handleSettingsPostSigning(ctx *context.Context) { repo := ctx.Repo.Repository trustModel := repo_model.ToTrustModel(form.TrustModel) if trustModel != repo.TrustModel { - if err := repo_service.UpdateRepositoryTrustModel(ctx, repo, trustModel); err != nil { - ctx.ServerError("UpdateRepository", err) + repo.TrustModel = trustModel + if err := repo_model.UpdateRepositoryColsNoAutoTime(ctx, repo, "trust_model"); err != nil { + ctx.ServerError("UpdateRepositoryColsNoAutoTime", err) return } log.Trace("Repository signing settings updated: %s/%s", ctx.Repo.Owner.Name, repo.Name) @@ -685,8 +686,9 @@ func handleSettingsPostAdmin(ctx *context.Context) { repo := ctx.Repo.Repository form := web.GetForm(ctx).(*forms.RepoSettingForm) if repo.IsFsckEnabled != form.EnableHealthCheck { - if err := repo_service.UpdateRepositoryHealthCheck(ctx, repo, form.EnableHealthCheck); err != nil { - ctx.ServerError("UpdateRepository", err) + repo.IsFsckEnabled = form.EnableHealthCheck + if err := repo_model.UpdateRepositoryColsNoAutoTime(ctx, repo, "is_fsck_enabled"); err != nil { + ctx.ServerError("UpdateRepositoryColsNoAutoTime", err) return } log.Trace("Repository admin settings updated: %s/%s", ctx.Repo.Owner.Name, repo.Name) diff --git a/services/repository/repository.go b/services/repository/repository.go index 151b9a22a6796..e574dc6c0181d 100644 --- a/services/repository/repository.go +++ b/services/repository/repository.go @@ -124,26 +124,6 @@ func UpdateRepository(ctx context.Context, repo *repo_model.Repository, visibili }) } -func UpdateRepositoryTrustModel(ctx context.Context, repo *repo_model.Repository, trustModel repo_model.TrustModelType) (err error) { - return db.WithTx(ctx, func(ctx context.Context) error { - repo.TrustModel = trustModel - if err := repo_model.UpdateRepositoryColsNoAutoTime(ctx, repo, "trust_model"); err != nil { - return fmt.Errorf("UpdateRepositoryColsNoAutoTime: %w", err) - } - return nil - }) -} - -func UpdateRepositoryHealthCheck(ctx context.Context, repo *repo_model.Repository, healthCheckEnabled bool) (err error) { - return db.WithTx(ctx, func(ctx context.Context) error { - repo.IsFsckEnabled = healthCheckEnabled - if err := repo_model.UpdateRepositoryColsNoAutoTime(ctx, repo, "is_fsck_enabled"); err != nil { - return fmt.Errorf("UpdateRepositoryColsNoAutoTime: %w", err) - } - return nil - }) -} - func MakeRepoPublic(ctx context.Context, repo *repo_model.Repository) (err error) { return db.WithTx(ctx, func(ctx context.Context) error { repo.IsPrivate = false