aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--modules/setting/actions.go2
-rw-r--r--modules/setting/cron_test.go53
-rw-r--r--services/actions/notifier.go11
-rw-r--r--services/cron/tasks_extended.go43
-rw-r--r--services/cron/tasks_extended_test.go51
-rw-r--r--services/issue/comments.go6
-rw-r--r--services/webhook/notifier.go1
7 files changed, 135 insertions, 32 deletions
diff --git a/modules/setting/actions.go b/modules/setting/actions.go
index 8bace1f750..34346b62cf 100644
--- a/modules/setting/actions.go
+++ b/modules/setting/actions.go
@@ -24,7 +24,7 @@ var (
ZombieTaskTimeout time.Duration `ini:"ZOMBIE_TASK_TIMEOUT"`
EndlessTaskTimeout time.Duration `ini:"ENDLESS_TASK_TIMEOUT"`
AbandonedJobTimeout time.Duration `ini:"ABANDONED_JOB_TIMEOUT"`
- SkipWorkflowStrings []string `ìni:"SKIP_WORKFLOW_STRINGS"`
+ SkipWorkflowStrings []string `ini:"SKIP_WORKFLOW_STRINGS"`
}{
Enabled: true,
DefaultActionsURL: defaultActionsURLGitHub,
diff --git a/modules/setting/cron_test.go b/modules/setting/cron_test.go
index 39a228068a..53996b5de9 100644
--- a/modules/setting/cron_test.go
+++ b/modules/setting/cron_test.go
@@ -41,3 +41,56 @@ EXTEND = true
assert.Equal(t, "white rabbit", extended.Second)
assert.True(t, extended.Extend)
}
+
+// Test_getCronSettings2 tests that getCronSettings can not handle two levels of embedding
+func Test_getCronSettings2(t *testing.T) {
+ type BaseStruct struct {
+ Enabled bool
+ RunAtStart bool
+ Schedule string
+ }
+
+ type Extended struct {
+ BaseStruct
+ Extend bool
+ }
+ type Extended2 struct {
+ Extended
+ Third string
+ }
+
+ iniStr := `
+[cron.test]
+ENABLED = TRUE
+RUN_AT_START = TRUE
+SCHEDULE = @every 1h
+EXTEND = true
+THIRD = white rabbit
+`
+ cfg, err := NewConfigProviderFromData(iniStr)
+ assert.NoError(t, err)
+
+ extended := &Extended2{
+ Extended: Extended{
+ BaseStruct: BaseStruct{
+ Enabled: false,
+ RunAtStart: false,
+ Schedule: "@every 72h",
+ },
+ Extend: false,
+ },
+ Third: "black rabbit",
+ }
+
+ _, err = getCronSettings(cfg, "test", extended)
+ assert.NoError(t, err)
+
+ // This confirms the first level of embedding works
+ assert.Equal(t, "white rabbit", extended.Third)
+ assert.True(t, extended.Extend)
+
+ // This confirms 2 levels of embedding doesn't work
+ assert.False(t, extended.Enabled)
+ assert.False(t, extended.RunAtStart)
+ assert.Equal(t, "@every 72h", extended.Schedule)
+}
diff --git a/services/actions/notifier.go b/services/actions/notifier.go
index d10cc0ab34..110e330f68 100644
--- a/services/actions/notifier.go
+++ b/services/actions/notifier.go
@@ -263,11 +263,6 @@ func (n *actionsNotifier) CreateIssueComment(ctx context.Context, doer *user_mod
func (n *actionsNotifier) UpdateComment(ctx context.Context, doer *user_model.User, c *issues_model.Comment, oldContent string) {
ctx = withMethod(ctx, "UpdateComment")
- if err := c.LoadIssue(ctx); err != nil {
- log.Error("LoadIssue: %v", err)
- return
- }
-
if c.Issue.IsPull {
notifyIssueCommentChange(ctx, doer, c, oldContent, webhook_module.HookEventPullRequestComment, api.HookIssueCommentEdited)
return
@@ -278,11 +273,6 @@ func (n *actionsNotifier) UpdateComment(ctx context.Context, doer *user_model.Us
func (n *actionsNotifier) DeleteComment(ctx context.Context, doer *user_model.User, comment *issues_model.Comment) {
ctx = withMethod(ctx, "DeleteComment")
- if err := comment.LoadIssue(ctx); err != nil {
- log.Error("LoadIssue: %v", err)
- return
- }
-
if comment.Issue.IsPull {
notifyIssueCommentChange(ctx, doer, comment, "", webhook_module.HookEventPullRequestComment, api.HookIssueCommentDeleted)
return
@@ -291,6 +281,7 @@ func (n *actionsNotifier) DeleteComment(ctx context.Context, doer *user_model.Us
}
func notifyIssueCommentChange(ctx context.Context, doer *user_model.User, comment *issues_model.Comment, oldContent string, event webhook_module.HookEventType, action api.HookIssueCommentAction) {
+ comment.Issue = nil // force issue to be loaded
if err := comment.LoadIssue(ctx); err != nil {
log.Error("LoadIssue: %v", err)
return
diff --git a/services/cron/tasks_extended.go b/services/cron/tasks_extended.go
index 0018c5facc..3747111984 100644
--- a/services/cron/tasks_extended.go
+++ b/services/cron/tasks_extended.go
@@ -171,34 +171,35 @@ func registerDeleteOldSystemNotices() {
})
}
+type GCLFSConfig struct {
+ BaseConfig
+ OlderThan time.Duration
+ LastUpdatedMoreThanAgo time.Duration
+ NumberToCheckPerRepo int64
+ ProportionToCheckPerRepo float64
+}
+
func registerGCLFS() {
if !setting.LFS.StartServer {
return
}
- type GCLFSConfig struct {
- OlderThanConfig
- LastUpdatedMoreThanAgo time.Duration
- NumberToCheckPerRepo int64
- ProportionToCheckPerRepo float64
- }
RegisterTaskFatal("gc_lfs", &GCLFSConfig{
- OlderThanConfig: OlderThanConfig{
- BaseConfig: BaseConfig{
- Enabled: false,
- RunAtStart: false,
- Schedule: "@every 24h",
- },
- // Only attempt to garbage collect lfs meta objects older than a week as the order of git lfs upload
- // and git object upload is not necessarily guaranteed. It's possible to imagine a situation whereby
- // an LFS object is uploaded but the git branch is not uploaded immediately, or there are some rapid
- // changes in new branches that might lead to lfs objects becoming temporarily unassociated with git
- // objects.
- //
- // It is likely that a week is potentially excessive but it should definitely be enough that any
- // unassociated LFS object is genuinely unassociated.
- OlderThan: 24 * time.Hour * 7,
+ BaseConfig: BaseConfig{
+ Enabled: false,
+ RunAtStart: false,
+ Schedule: "@every 24h",
},
+ // Only attempt to garbage collect lfs meta objects older than a week as the order of git lfs upload
+ // and git object upload is not necessarily guaranteed. It's possible to imagine a situation whereby
+ // an LFS object is uploaded but the git branch is not uploaded immediately, or there are some rapid
+ // changes in new branches that might lead to lfs objects becoming temporarily unassociated with git
+ // objects.
+ //
+ // It is likely that a week is potentially excessive but it should definitely be enough that any
+ // unassociated LFS object is genuinely unassociated.
+ OlderThan: 24 * time.Hour * 7,
+
// Only GC things that haven't been looked at in the past 3 days
LastUpdatedMoreThanAgo: 24 * time.Hour * 3,
NumberToCheckPerRepo: 100,
diff --git a/services/cron/tasks_extended_test.go b/services/cron/tasks_extended_test.go
new file mode 100644
index 0000000000..a3d40630a3
--- /dev/null
+++ b/services/cron/tasks_extended_test.go
@@ -0,0 +1,51 @@
+// Copyright 2025 The Gitea Authors. All rights reserved.
+// SPDX-License-Identifier: MIT
+
+package cron
+
+import (
+ "testing"
+ "time"
+
+ "code.gitea.io/gitea/modules/setting"
+ "code.gitea.io/gitea/modules/test"
+
+ "github.com/stretchr/testify/assert"
+)
+
+func Test_GCLFSConfig(t *testing.T) {
+ cfg, err := setting.NewConfigProviderFromData(`
+[cron.gc_lfs]
+ENABLED = true
+RUN_AT_START = true
+SCHEDULE = "@every 2h"
+OLDER_THAN = "1h"
+LAST_UPDATED_MORE_THAN_AGO = "7h"
+NUMBER_TO_CHECK_PER_REPO = 10
+PROPORTION_TO_CHECK_PER_REPO = 0.1
+`)
+ assert.NoError(t, err)
+ defer test.MockVariableValue(&setting.CfgProvider, cfg)()
+
+ config := &GCLFSConfig{
+ BaseConfig: BaseConfig{
+ Enabled: false,
+ RunAtStart: false,
+ Schedule: "@every 24h",
+ },
+ OlderThan: 24 * time.Hour * 7,
+ LastUpdatedMoreThanAgo: 24 * time.Hour * 3,
+ NumberToCheckPerRepo: 100,
+ ProportionToCheckPerRepo: 0.6,
+ }
+
+ _, err = setting.GetCronSettings("gc_lfs", config)
+ assert.NoError(t, err)
+ assert.True(t, config.Enabled)
+ assert.True(t, config.RunAtStart)
+ assert.Equal(t, "@every 2h", config.Schedule)
+ assert.Equal(t, 1*time.Hour, config.OlderThan)
+ assert.Equal(t, 7*time.Hour, config.LastUpdatedMoreThanAgo)
+ assert.Equal(t, int64(10), config.NumberToCheckPerRepo)
+ assert.InDelta(t, 0.1, config.ProportionToCheckPerRepo, 0.001)
+}
diff --git a/services/issue/comments.go b/services/issue/comments.go
index 10c81198d5..9442701029 100644
--- a/services/issue/comments.go
+++ b/services/issue/comments.go
@@ -80,6 +80,12 @@ func CreateIssueComment(ctx context.Context, doer *user_model.User, repo *repo_m
return nil, err
}
+ // reload issue to ensure it has the latest data, especially the number of comments
+ issue, err = issues_model.GetIssueByID(ctx, issue.ID)
+ if err != nil {
+ return nil, err
+ }
+
notify_service.CreateIssueComment(ctx, doer, repo, issue, comment, mentions)
return comment, nil
diff --git a/services/webhook/notifier.go b/services/webhook/notifier.go
index 672abd5c95..80de6b00fd 100644
--- a/services/webhook/notifier.go
+++ b/services/webhook/notifier.go
@@ -481,6 +481,7 @@ func (m *webhookNotifier) DeleteComment(ctx context.Context, doer *user_model.Us
log.Error("LoadPoster: %v", err)
return
}
+ comment.Issue = nil // reload issue to ensure it has the latest data, especially the number of comments
if err = comment.LoadIssue(ctx); err != nil {
log.Error("LoadIssue: %v", err)
return