mirror of
https://codeberg.org/forgejo/forgejo.git
synced 2024-11-29 03:38:52 +03:00
Revert "Fix schedule tasks bugs (#28691)"
This reverts commit 97292da960
.
This commit is contained in:
parent
dce3a7c0f6
commit
3249d2806c
19 changed files with 90 additions and 206 deletions
|
@ -168,14 +168,13 @@ func updateRepoRunsNumbers(ctx context.Context, repo *repo_model.Repository) err
|
||||||
}
|
}
|
||||||
|
|
||||||
// CancelRunningJobs cancels all running and waiting jobs associated with a specific workflow.
|
// CancelRunningJobs cancels all running and waiting jobs associated with a specific workflow.
|
||||||
func CancelRunningJobs(ctx context.Context, repoID int64, ref, workflowID string, event webhook_module.HookEventType) error {
|
func CancelRunningJobs(ctx context.Context, repoID int64, ref, workflowID string) error {
|
||||||
// Find all runs in the specified repository, reference, and workflow with statuses 'Running' or 'Waiting'.
|
// Find all runs in the specified repository, reference, and workflow with statuses 'Running' or 'Waiting'.
|
||||||
runs, total, err := db.FindAndCount[ActionRun](ctx, FindRunOptions{
|
runs, total, err := db.FindAndCount[ActionRun](ctx, FindRunOptions{
|
||||||
RepoID: repoID,
|
RepoID: repoID,
|
||||||
Ref: ref,
|
Ref: ref,
|
||||||
WorkflowID: workflowID,
|
WorkflowID: workflowID,
|
||||||
TriggerEvent: event,
|
Status: []Status{StatusRunning, StatusWaiting},
|
||||||
Status: []Status{StatusRunning, StatusWaiting},
|
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
|
|
@ -10,7 +10,6 @@ import (
|
||||||
repo_model "code.gitea.io/gitea/models/repo"
|
repo_model "code.gitea.io/gitea/models/repo"
|
||||||
user_model "code.gitea.io/gitea/models/user"
|
user_model "code.gitea.io/gitea/models/user"
|
||||||
"code.gitea.io/gitea/modules/container"
|
"code.gitea.io/gitea/modules/container"
|
||||||
webhook_module "code.gitea.io/gitea/modules/webhook"
|
|
||||||
|
|
||||||
"xorm.io/builder"
|
"xorm.io/builder"
|
||||||
)
|
)
|
||||||
|
@ -72,7 +71,6 @@ type FindRunOptions struct {
|
||||||
WorkflowID string
|
WorkflowID string
|
||||||
Ref string // the commit/tag/… that caused this workflow
|
Ref string // the commit/tag/… that caused this workflow
|
||||||
TriggerUserID int64
|
TriggerUserID int64
|
||||||
TriggerEvent webhook_module.HookEventType
|
|
||||||
Approved bool // not util.OptionalBool, it works only when it's true
|
Approved bool // not util.OptionalBool, it works only when it's true
|
||||||
Status []Status
|
Status []Status
|
||||||
}
|
}
|
||||||
|
@ -100,9 +98,6 @@ func (opts FindRunOptions) ToConds() builder.Cond {
|
||||||
if opts.Ref != "" {
|
if opts.Ref != "" {
|
||||||
cond = cond.And(builder.Eq{"ref": opts.Ref})
|
cond = cond.And(builder.Eq{"ref": opts.Ref})
|
||||||
}
|
}
|
||||||
if opts.TriggerEvent != "" {
|
|
||||||
cond = cond.And(builder.Eq{"trigger_event": opts.TriggerEvent})
|
|
||||||
}
|
|
||||||
return cond
|
return cond
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,6 @@ package actions
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"code.gitea.io/gitea/models/db"
|
"code.gitea.io/gitea/models/db"
|
||||||
|
@ -119,22 +118,3 @@ func DeleteScheduleTaskByRepo(ctx context.Context, id int64) error {
|
||||||
|
|
||||||
return committer.Commit()
|
return committer.Commit()
|
||||||
}
|
}
|
||||||
|
|
||||||
func CleanRepoScheduleTasks(ctx context.Context, repo *repo_model.Repository) error {
|
|
||||||
// If actions disabled when there is schedule task, this will remove the outdated schedule tasks
|
|
||||||
// There is no other place we can do this because the app.ini will be changed manually
|
|
||||||
if err := DeleteScheduleTaskByRepo(ctx, repo.ID); err != nil {
|
|
||||||
return fmt.Errorf("DeleteCronTaskByRepo: %v", err)
|
|
||||||
}
|
|
||||||
// cancel running cron jobs of this repository and delete old schedules
|
|
||||||
if err := CancelRunningJobs(
|
|
||||||
ctx,
|
|
||||||
repo.ID,
|
|
||||||
repo.DefaultBranch,
|
|
||||||
"",
|
|
||||||
webhook_module.HookEventSchedule,
|
|
||||||
); err != nil {
|
|
||||||
return fmt.Errorf("CancelRunningJobs: %v", err)
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
|
@ -283,7 +283,7 @@ func FindRenamedBranch(ctx context.Context, repoID int64, from string) (branch *
|
||||||
}
|
}
|
||||||
|
|
||||||
// RenameBranch rename a branch
|
// RenameBranch rename a branch
|
||||||
func RenameBranch(ctx context.Context, repo *repo_model.Repository, from, to string, gitAction func(ctx context.Context, isDefault bool) error) (err error) {
|
func RenameBranch(ctx context.Context, repo *repo_model.Repository, from, to string, gitAction func(isDefault bool) error) (err error) {
|
||||||
ctx, committer, err := db.TxContext(ctx)
|
ctx, committer, err := db.TxContext(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
@ -358,7 +358,7 @@ func RenameBranch(ctx context.Context, repo *repo_model.Repository, from, to str
|
||||||
}
|
}
|
||||||
|
|
||||||
// 5. do git action
|
// 5. do git action
|
||||||
if err = gitAction(ctx, isDefault); err != nil {
|
if err = gitAction(isDefault); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,6 @@
|
||||||
package git_test
|
package git_test
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"code.gitea.io/gitea/models/db"
|
"code.gitea.io/gitea/models/db"
|
||||||
|
@ -133,7 +132,7 @@ func TestRenameBranch(t *testing.T) {
|
||||||
}, git_model.WhitelistOptions{}))
|
}, git_model.WhitelistOptions{}))
|
||||||
assert.NoError(t, committer.Commit())
|
assert.NoError(t, committer.Commit())
|
||||||
|
|
||||||
assert.NoError(t, git_model.RenameBranch(db.DefaultContext, repo1, "master", "main", func(ctx context.Context, isDefault bool) error {
|
assert.NoError(t, git_model.RenameBranch(db.DefaultContext, repo1, "master", "main", func(isDefault bool) error {
|
||||||
_isDefault = isDefault
|
_isDefault = isDefault
|
||||||
return nil
|
return nil
|
||||||
}))
|
}))
|
||||||
|
|
|
@ -314,3 +314,29 @@ func UpdateRepoUnit(ctx context.Context, unit *RepoUnit) error {
|
||||||
_, err := db.GetEngine(ctx).ID(unit.ID).Update(unit)
|
_, err := db.GetEngine(ctx).ID(unit.ID).Update(unit)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// UpdateRepositoryUnits updates a repository's units
|
||||||
|
func UpdateRepositoryUnits(ctx context.Context, repo *Repository, units []RepoUnit, deleteUnitTypes []unit.Type) (err error) {
|
||||||
|
ctx, committer, err := db.TxContext(ctx)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer committer.Close()
|
||||||
|
|
||||||
|
// Delete existing settings of units before adding again
|
||||||
|
for _, u := range units {
|
||||||
|
deleteUnitTypes = append(deleteUnitTypes, u.Type)
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, err = db.GetEngine(ctx).Where("repo_id = ?", repo.ID).In("type", deleteUnitTypes).Delete(new(RepoUnit)); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(units) > 0 {
|
||||||
|
if err = db.Insert(ctx, units); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return committer.Commit()
|
||||||
|
}
|
||||||
|
|
|
@ -22,7 +22,6 @@ const (
|
||||||
GithubEventRelease = "release"
|
GithubEventRelease = "release"
|
||||||
GithubEventPullRequestComment = "pull_request_comment"
|
GithubEventPullRequestComment = "pull_request_comment"
|
||||||
GithubEventGollum = "gollum"
|
GithubEventGollum = "gollum"
|
||||||
GithubEventSchedule = "schedule"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// canGithubEventMatch check if the input Github event can match any Gitea event.
|
// canGithubEventMatch check if the input Github event can match any Gitea event.
|
||||||
|
@ -70,9 +69,6 @@ func canGithubEventMatch(eventName string, triggedEvent webhook_module.HookEvent
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
case GithubEventSchedule:
|
|
||||||
return triggedEvent == webhook_module.HookEventSchedule
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return eventName == string(triggedEvent)
|
return eventName == string(triggedEvent)
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,7 +22,7 @@ import (
|
||||||
|
|
||||||
type DetectedWorkflow struct {
|
type DetectedWorkflow struct {
|
||||||
EntryName string
|
EntryName string
|
||||||
TriggerEvent *jobparser.Event
|
TriggerEvent string
|
||||||
Content []byte
|
Content []byte
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -103,7 +103,6 @@ func DetectWorkflows(
|
||||||
commit *git.Commit,
|
commit *git.Commit,
|
||||||
triggedEvent webhook_module.HookEventType,
|
triggedEvent webhook_module.HookEventType,
|
||||||
payload api.Payloader,
|
payload api.Payloader,
|
||||||
detectSchedule bool,
|
|
||||||
) ([]*DetectedWorkflow, []*DetectedWorkflow, error) {
|
) ([]*DetectedWorkflow, []*DetectedWorkflow, error) {
|
||||||
entries, err := ListWorkflows(commit)
|
entries, err := ListWorkflows(commit)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -118,7 +117,6 @@ func DetectWorkflows(
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// one workflow may have multiple events
|
|
||||||
events, err := GetEventsFromContent(content)
|
events, err := GetEventsFromContent(content)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Warn("ignore invalid workflow %q: %v", entry.Name(), err)
|
log.Warn("ignore invalid workflow %q: %v", entry.Name(), err)
|
||||||
|
@ -127,18 +125,17 @@ func DetectWorkflows(
|
||||||
for _, evt := range events {
|
for _, evt := range events {
|
||||||
log.Trace("detect workflow %q for event %#v matching %q", entry.Name(), evt, triggedEvent)
|
log.Trace("detect workflow %q for event %#v matching %q", entry.Name(), evt, triggedEvent)
|
||||||
if evt.IsSchedule() {
|
if evt.IsSchedule() {
|
||||||
if detectSchedule {
|
|
||||||
dwf := &DetectedWorkflow{
|
|
||||||
EntryName: entry.Name(),
|
|
||||||
TriggerEvent: evt,
|
|
||||||
Content: content,
|
|
||||||
}
|
|
||||||
schedules = append(schedules, dwf)
|
|
||||||
}
|
|
||||||
} else if detectMatched(gitRepo, commit, triggedEvent, payload, evt) {
|
|
||||||
dwf := &DetectedWorkflow{
|
dwf := &DetectedWorkflow{
|
||||||
EntryName: entry.Name(),
|
EntryName: entry.Name(),
|
||||||
TriggerEvent: evt,
|
TriggerEvent: evt.Name,
|
||||||
|
Content: content,
|
||||||
|
}
|
||||||
|
schedules = append(schedules, dwf)
|
||||||
|
}
|
||||||
|
if detectMatched(gitRepo, commit, triggedEvent, payload, evt) {
|
||||||
|
dwf := &DetectedWorkflow{
|
||||||
|
EntryName: entry.Name(),
|
||||||
|
TriggerEvent: evt.Name,
|
||||||
Content: content,
|
Content: content,
|
||||||
}
|
}
|
||||||
workflows = append(workflows, dwf)
|
workflows = append(workflows, dwf)
|
||||||
|
@ -159,8 +156,7 @@ func detectMatched(gitRepo *git.Repository, commit *git.Commit, triggedEvent web
|
||||||
webhook_module.HookEventCreate,
|
webhook_module.HookEventCreate,
|
||||||
webhook_module.HookEventDelete,
|
webhook_module.HookEventDelete,
|
||||||
webhook_module.HookEventFork,
|
webhook_module.HookEventFork,
|
||||||
webhook_module.HookEventWiki,
|
webhook_module.HookEventWiki:
|
||||||
webhook_module.HookEventSchedule:
|
|
||||||
if len(evt.Acts()) != 0 {
|
if len(evt.Acts()) != 0 {
|
||||||
log.Warn("Ignore unsupported %s event arguments %v", triggedEvent, evt.Acts())
|
log.Warn("Ignore unsupported %s event arguments %v", triggedEvent, evt.Acts())
|
||||||
}
|
}
|
||||||
|
|
|
@ -118,13 +118,6 @@ func TestDetectMatched(t *testing.T) {
|
||||||
yamlOn: "on: gollum",
|
yamlOn: "on: gollum",
|
||||||
expected: true,
|
expected: true,
|
||||||
},
|
},
|
||||||
{
|
|
||||||
desc: "HookEventSchedue(schedule) matches GithubEventSchedule(schedule)",
|
|
||||||
triggedEvent: webhook_module.HookEventSchedule,
|
|
||||||
payload: nil,
|
|
||||||
yamlOn: "on: schedule",
|
|
||||||
expected: true,
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, tc := range testCases {
|
for _, tc := range testCases {
|
||||||
|
|
|
@ -31,7 +31,6 @@ const (
|
||||||
HookEventRepository HookEventType = "repository"
|
HookEventRepository HookEventType = "repository"
|
||||||
HookEventRelease HookEventType = "release"
|
HookEventRelease HookEventType = "release"
|
||||||
HookEventPackage HookEventType = "package"
|
HookEventPackage HookEventType = "package"
|
||||||
HookEventSchedule HookEventType = "schedule"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// Event returns the HookEventType as an event string
|
// Event returns the HookEventType as an event string
|
||||||
|
|
|
@ -983,7 +983,7 @@ func updateRepoUnits(ctx *context.APIContext, opts api.EditRepoOption) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(units)+len(deleteUnitTypes) > 0 {
|
if len(units)+len(deleteUnitTypes) > 0 {
|
||||||
if err := repo_service.UpdateRepositoryUnits(ctx, repo, units, deleteUnitTypes); err != nil {
|
if err := repo_model.UpdateRepositoryUnits(ctx, repo, units, deleteUnitTypes); err != nil {
|
||||||
ctx.Error(http.StatusInternalServerError, "UpdateRepositoryUnits", err)
|
ctx.Error(http.StatusInternalServerError, "UpdateRepositoryUnits", err)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,12 +6,13 @@ package setting
|
||||||
import (
|
import (
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
git_model "code.gitea.io/gitea/models/git"
|
repo_model "code.gitea.io/gitea/models/repo"
|
||||||
"code.gitea.io/gitea/modules/context"
|
"code.gitea.io/gitea/modules/context"
|
||||||
|
"code.gitea.io/gitea/modules/git"
|
||||||
"code.gitea.io/gitea/modules/log"
|
"code.gitea.io/gitea/modules/log"
|
||||||
"code.gitea.io/gitea/modules/setting"
|
"code.gitea.io/gitea/modules/setting"
|
||||||
"code.gitea.io/gitea/routers/web/repo"
|
"code.gitea.io/gitea/routers/web/repo"
|
||||||
repo_service "code.gitea.io/gitea/services/repository"
|
notify_service "code.gitea.io/gitea/services/notify"
|
||||||
)
|
)
|
||||||
|
|
||||||
// SetDefaultBranchPost set default branch
|
// SetDefaultBranchPost set default branch
|
||||||
|
@ -34,14 +35,23 @@ func SetDefaultBranchPost(ctx *context.Context) {
|
||||||
}
|
}
|
||||||
|
|
||||||
branch := ctx.FormString("branch")
|
branch := ctx.FormString("branch")
|
||||||
if err := repo_service.SetRepoDefaultBranch(ctx, ctx.Repo.Repository, ctx.Repo.GitRepo, branch); err != nil {
|
if !ctx.Repo.GitRepo.IsBranchExist(branch) {
|
||||||
switch {
|
ctx.Status(http.StatusNotFound)
|
||||||
case git_model.IsErrBranchNotExist(err):
|
|
||||||
ctx.Status(http.StatusNotFound)
|
|
||||||
default:
|
|
||||||
ctx.ServerError("SetDefaultBranch", err)
|
|
||||||
}
|
|
||||||
return
|
return
|
||||||
|
} else if repo.DefaultBranch != branch {
|
||||||
|
repo.DefaultBranch = branch
|
||||||
|
if err := ctx.Repo.GitRepo.SetDefaultBranch(branch); err != nil {
|
||||||
|
if !git.IsErrUnsupportedVersion(err) {
|
||||||
|
ctx.ServerError("SetDefaultBranch", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if err := repo_model.UpdateDefaultBranch(ctx, repo); err != nil {
|
||||||
|
ctx.ServerError("SetDefaultBranch", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
notify_service.ChangeDefaultBranch(ctx, repo)
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Trace("Repository basic settings updated: %s/%s", ctx.Repo.Owner.Name, repo.Name)
|
log.Trace("Repository basic settings updated: %s/%s", ctx.Repo.Owner.Name, repo.Name)
|
||||||
|
|
|
@ -601,7 +601,7 @@ func SettingsPost(ctx *context.Context) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := repo_service.UpdateRepositoryUnits(ctx, repo, units, deleteUnitTypes); err != nil {
|
if err := repo_model.UpdateRepositoryUnits(ctx, repo, units, deleteUnitTypes); err != nil {
|
||||||
ctx.ServerError("UpdateRepositoryUnits", err)
|
ctx.ServerError("UpdateRepositoryUnits", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
|
@ -117,9 +117,6 @@ func notify(ctx context.Context, input *notifyInput) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
if unit_model.TypeActions.UnitGlobalDisabled() {
|
if unit_model.TypeActions.UnitGlobalDisabled() {
|
||||||
if err := actions_model.CleanRepoScheduleTasks(ctx, input.Repo); err != nil {
|
|
||||||
log.Error("CleanRepoScheduleTasks: %v", err)
|
|
||||||
}
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
if err := input.Repo.LoadUnits(ctx); err != nil {
|
if err := input.Repo.LoadUnits(ctx); err != nil {
|
||||||
|
@ -156,11 +153,7 @@ func notify(ctx context.Context, input *notifyInput) error {
|
||||||
|
|
||||||
var detectedWorkflows []*actions_module.DetectedWorkflow
|
var detectedWorkflows []*actions_module.DetectedWorkflow
|
||||||
actionsConfig := input.Repo.MustGetUnit(ctx, unit_model.TypeActions).ActionsConfig()
|
actionsConfig := input.Repo.MustGetUnit(ctx, unit_model.TypeActions).ActionsConfig()
|
||||||
workflows, schedules, err := actions_module.DetectWorkflows(gitRepo, commit,
|
workflows, schedules, err := actions_module.DetectWorkflows(gitRepo, commit, input.Event, input.Payload)
|
||||||
input.Event,
|
|
||||||
input.Payload,
|
|
||||||
input.Event == webhook_module.HookEventPush && input.Ref == input.Repo.DefaultBranch,
|
|
||||||
)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("DetectWorkflows: %w", err)
|
return fmt.Errorf("DetectWorkflows: %w", err)
|
||||||
}
|
}
|
||||||
|
@ -174,7 +167,7 @@ func notify(ctx context.Context, input *notifyInput) error {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
if wf.TriggerEvent.Name != actions_module.GithubEventPullRequestTarget {
|
if wf.TriggerEvent != actions_module.GithubEventPullRequestTarget {
|
||||||
detectedWorkflows = append(detectedWorkflows, wf)
|
detectedWorkflows = append(detectedWorkflows, wf)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -187,7 +180,7 @@ func notify(ctx context.Context, input *notifyInput) error {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("gitRepo.GetCommit: %w", err)
|
return fmt.Errorf("gitRepo.GetCommit: %w", err)
|
||||||
}
|
}
|
||||||
baseWorkflows, _, err := actions_module.DetectWorkflows(gitRepo, baseCommit, input.Event, input.Payload, false)
|
baseWorkflows, _, err := actions_module.DetectWorkflows(gitRepo, baseCommit, input.Event, input.Payload)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("DetectWorkflows: %w", err)
|
return fmt.Errorf("DetectWorkflows: %w", err)
|
||||||
}
|
}
|
||||||
|
@ -195,7 +188,7 @@ func notify(ctx context.Context, input *notifyInput) error {
|
||||||
log.Trace("repo %s with commit %s couldn't find pull_request_target workflows", input.Repo.RepoPath(), baseCommit.ID)
|
log.Trace("repo %s with commit %s couldn't find pull_request_target workflows", input.Repo.RepoPath(), baseCommit.ID)
|
||||||
} else {
|
} else {
|
||||||
for _, wf := range baseWorkflows {
|
for _, wf := range baseWorkflows {
|
||||||
if wf.TriggerEvent.Name == actions_module.GithubEventPullRequestTarget {
|
if wf.TriggerEvent == actions_module.GithubEventPullRequestTarget {
|
||||||
detectedWorkflows = append(detectedWorkflows, wf)
|
detectedWorkflows = append(detectedWorkflows, wf)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -272,7 +265,7 @@ func handleWorkflows(
|
||||||
IsForkPullRequest: isForkPullRequest,
|
IsForkPullRequest: isForkPullRequest,
|
||||||
Event: input.Event,
|
Event: input.Event,
|
||||||
EventPayload: string(p),
|
EventPayload: string(p),
|
||||||
TriggerEvent: dwf.TriggerEvent.Name,
|
TriggerEvent: dwf.TriggerEvent,
|
||||||
Status: actions_model.StatusWaiting,
|
Status: actions_model.StatusWaiting,
|
||||||
}
|
}
|
||||||
if need, err := ifNeedApproval(ctx, run, input.Repo, input.Doer); err != nil {
|
if need, err := ifNeedApproval(ctx, run, input.Repo, input.Doer); err != nil {
|
||||||
|
@ -296,7 +289,6 @@ func handleWorkflows(
|
||||||
run.RepoID,
|
run.RepoID,
|
||||||
run.Ref,
|
run.Ref,
|
||||||
run.WorkflowID,
|
run.WorkflowID,
|
||||||
run.Event,
|
|
||||||
); err != nil {
|
); err != nil {
|
||||||
log.Error("CancelRunningJobs: %v", err)
|
log.Error("CancelRunningJobs: %v", err)
|
||||||
}
|
}
|
||||||
|
@ -422,8 +414,8 @@ func handleSchedules(
|
||||||
log.Error("CountSchedules: %v", err)
|
log.Error("CountSchedules: %v", err)
|
||||||
return err
|
return err
|
||||||
} else if count > 0 {
|
} else if count > 0 {
|
||||||
if err := actions_model.CleanRepoScheduleTasks(ctx, input.Repo); err != nil {
|
if err := actions_model.DeleteScheduleTaskByRepo(ctx, input.Repo.ID); err != nil {
|
||||||
log.Error("CleanRepoScheduleTasks: %v", err)
|
log.Error("DeleteCronTaskByRepo: %v", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -468,6 +460,19 @@ func handleSchedules(
|
||||||
Specs: schedules,
|
Specs: schedules,
|
||||||
Content: dwf.Content,
|
Content: dwf.Content,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// cancel running jobs if the event is push
|
||||||
|
if run.Event == webhook_module.HookEventPush {
|
||||||
|
// cancel running jobs of the same workflow
|
||||||
|
if err := actions_model.CancelRunningJobs(
|
||||||
|
ctx,
|
||||||
|
run.RepoID,
|
||||||
|
run.Ref,
|
||||||
|
run.WorkflowID,
|
||||||
|
); err != nil {
|
||||||
|
log.Error("CancelRunningJobs: %v", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
crons = append(crons, run)
|
crons = append(crons, run)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -59,7 +59,6 @@ func startTasks(ctx context.Context) error {
|
||||||
row.RepoID,
|
row.RepoID,
|
||||||
row.Schedule.Ref,
|
row.Schedule.Ref,
|
||||||
row.Schedule.WorkflowID,
|
row.Schedule.WorkflowID,
|
||||||
webhook_module.HookEventSchedule,
|
|
||||||
); err != nil {
|
); err != nil {
|
||||||
log.Error("CancelRunningJobs: %v", err)
|
log.Error("CancelRunningJobs: %v", err)
|
||||||
}
|
}
|
||||||
|
@ -114,7 +113,6 @@ func CreateScheduleTask(ctx context.Context, cron *actions_model.ActionSchedule)
|
||||||
CommitSHA: cron.CommitSHA,
|
CommitSHA: cron.CommitSHA,
|
||||||
Event: cron.Event,
|
Event: cron.Event,
|
||||||
EventPayload: cron.EventPayload,
|
EventPayload: cron.EventPayload,
|
||||||
TriggerEvent: string(webhook_module.HookEventSchedule),
|
|
||||||
ScheduleID: cron.ID,
|
ScheduleID: cron.ID,
|
||||||
Status: actions_model.StatusWaiting,
|
Status: actions_model.StatusWaiting,
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,7 +10,6 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"code.gitea.io/gitea/models"
|
"code.gitea.io/gitea/models"
|
||||||
actions_model "code.gitea.io/gitea/models/actions"
|
|
||||||
"code.gitea.io/gitea/models/db"
|
"code.gitea.io/gitea/models/db"
|
||||||
git_model "code.gitea.io/gitea/models/git"
|
git_model "code.gitea.io/gitea/models/git"
|
||||||
issues_model "code.gitea.io/gitea/models/issues"
|
issues_model "code.gitea.io/gitea/models/issues"
|
||||||
|
@ -23,7 +22,6 @@ import (
|
||||||
repo_module "code.gitea.io/gitea/modules/repository"
|
repo_module "code.gitea.io/gitea/modules/repository"
|
||||||
"code.gitea.io/gitea/modules/timeutil"
|
"code.gitea.io/gitea/modules/timeutil"
|
||||||
"code.gitea.io/gitea/modules/util"
|
"code.gitea.io/gitea/modules/util"
|
||||||
webhook_module "code.gitea.io/gitea/modules/webhook"
|
|
||||||
notify_service "code.gitea.io/gitea/services/notify"
|
notify_service "code.gitea.io/gitea/services/notify"
|
||||||
files_service "code.gitea.io/gitea/services/repository/files"
|
files_service "code.gitea.io/gitea/services/repository/files"
|
||||||
|
|
||||||
|
@ -316,28 +314,13 @@ func RenameBranch(ctx context.Context, repo *repo_model.Repository, doer *user_m
|
||||||
return "from_not_exist", nil
|
return "from_not_exist", nil
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := git_model.RenameBranch(ctx, repo, from, to, func(ctx context.Context, isDefault bool) error {
|
if err := git_model.RenameBranch(ctx, repo, from, to, func(isDefault bool) error {
|
||||||
err2 := gitRepo.RenameBranch(from, to)
|
err2 := gitRepo.RenameBranch(from, to)
|
||||||
if err2 != nil {
|
if err2 != nil {
|
||||||
return err2
|
return err2
|
||||||
}
|
}
|
||||||
|
|
||||||
if isDefault {
|
if isDefault {
|
||||||
// if default branch changed, we need to delete all schedules and cron jobs
|
|
||||||
if err := actions_model.DeleteScheduleTaskByRepo(ctx, repo.ID); err != nil {
|
|
||||||
log.Error("DeleteCronTaskByRepo: %v", err)
|
|
||||||
}
|
|
||||||
// cancel running cron jobs of this repository and delete old schedules
|
|
||||||
if err := actions_model.CancelRunningJobs(
|
|
||||||
ctx,
|
|
||||||
repo.ID,
|
|
||||||
from,
|
|
||||||
"",
|
|
||||||
webhook_module.HookEventSchedule,
|
|
||||||
); err != nil {
|
|
||||||
log.Error("CancelRunningJobs: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
err2 = gitRepo.SetDefaultBranch(to)
|
err2 = gitRepo.SetDefaultBranch(to)
|
||||||
if err2 != nil {
|
if err2 != nil {
|
||||||
return err2
|
return err2
|
||||||
|
@ -473,50 +456,3 @@ func AddAllRepoBranchesToSyncQueue(ctx context.Context, doerID int64) error {
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func SetRepoDefaultBranch(ctx context.Context, repo *repo_model.Repository, gitRepo *git.Repository, newBranchName string) error {
|
|
||||||
if repo.DefaultBranch == newBranchName {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
if !gitRepo.IsBranchExist(newBranchName) {
|
|
||||||
return git_model.ErrBranchNotExist{
|
|
||||||
BranchName: newBranchName,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
oldDefaultBranchName := repo.DefaultBranch
|
|
||||||
repo.DefaultBranch = newBranchName
|
|
||||||
if err := db.WithTx(ctx, func(ctx context.Context) error {
|
|
||||||
if err := repo_model.UpdateDefaultBranch(ctx, repo); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := actions_model.DeleteScheduleTaskByRepo(ctx, repo.ID); err != nil {
|
|
||||||
log.Error("DeleteCronTaskByRepo: %v", err)
|
|
||||||
}
|
|
||||||
// cancel running cron jobs of this repository and delete old schedules
|
|
||||||
if err := actions_model.CancelRunningJobs(
|
|
||||||
ctx,
|
|
||||||
repo.ID,
|
|
||||||
oldDefaultBranchName,
|
|
||||||
"",
|
|
||||||
webhook_module.HookEventSchedule,
|
|
||||||
); err != nil {
|
|
||||||
log.Error("CancelRunningJobs: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := gitRepo.SetDefaultBranch(newBranchName); err != nil {
|
|
||||||
if !git.IsErrUnsupportedVersion(err) {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
notify_service.ChangeDefaultBranch(ctx, repo)
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,47 +0,0 @@
|
||||||
// Copyright 2023 The Gitea Authors. All rights reserved.
|
|
||||||
// SPDX-License-Identifier: MIT
|
|
||||||
|
|
||||||
package repository
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"slices"
|
|
||||||
|
|
||||||
actions_model "code.gitea.io/gitea/models/actions"
|
|
||||||
"code.gitea.io/gitea/models/db"
|
|
||||||
repo_model "code.gitea.io/gitea/models/repo"
|
|
||||||
"code.gitea.io/gitea/models/unit"
|
|
||||||
"code.gitea.io/gitea/modules/log"
|
|
||||||
)
|
|
||||||
|
|
||||||
// UpdateRepositoryUnits updates a repository's units
|
|
||||||
func UpdateRepositoryUnits(ctx context.Context, repo *repo_model.Repository, units []repo_model.RepoUnit, deleteUnitTypes []unit.Type) (err error) {
|
|
||||||
ctx, committer, err := db.TxContext(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
defer committer.Close()
|
|
||||||
|
|
||||||
// Delete existing settings of units before adding again
|
|
||||||
for _, u := range units {
|
|
||||||
deleteUnitTypes = append(deleteUnitTypes, u.Type)
|
|
||||||
}
|
|
||||||
|
|
||||||
if slices.Contains(deleteUnitTypes, unit.TypeActions) {
|
|
||||||
if err := actions_model.CleanRepoScheduleTasks(ctx, repo); err != nil {
|
|
||||||
log.Error("CleanRepoScheduleTasks: %v", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if _, err = db.GetEngine(ctx).Where("repo_id = ?", repo.ID).In("type", deleteUnitTypes).Delete(new(repo_model.RepoUnit)); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(units) > 0 {
|
|
||||||
if err = db.Insert(ctx, units); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return committer.Commit()
|
|
||||||
}
|
|
|
@ -19,7 +19,6 @@ import (
|
||||||
repo_module "code.gitea.io/gitea/modules/repository"
|
repo_module "code.gitea.io/gitea/modules/repository"
|
||||||
"code.gitea.io/gitea/modules/sync"
|
"code.gitea.io/gitea/modules/sync"
|
||||||
asymkey_service "code.gitea.io/gitea/services/asymkey"
|
asymkey_service "code.gitea.io/gitea/services/asymkey"
|
||||||
repo_service "code.gitea.io/gitea/services/repository"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// TODO: use clustered lock (unique queue? or *abuse* cache)
|
// TODO: use clustered lock (unique queue? or *abuse* cache)
|
||||||
|
@ -351,7 +350,7 @@ func DeleteWikiPage(ctx context.Context, doer *user_model.User, repo *repo_model
|
||||||
|
|
||||||
// DeleteWiki removes the actual and local copy of repository wiki.
|
// DeleteWiki removes the actual and local copy of repository wiki.
|
||||||
func DeleteWiki(ctx context.Context, repo *repo_model.Repository) error {
|
func DeleteWiki(ctx context.Context, repo *repo_model.Repository) error {
|
||||||
if err := repo_service.UpdateRepositoryUnits(ctx, repo, nil, []unit.Type{unit.TypeWiki}); err != nil {
|
if err := repo_model.UpdateRepositoryUnits(ctx, repo, nil, []unit.Type{unit.TypeWiki}); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -47,7 +47,7 @@ func TestPullRequestTargetEvent(t *testing.T) {
|
||||||
assert.NotEmpty(t, baseRepo)
|
assert.NotEmpty(t, baseRepo)
|
||||||
|
|
||||||
// enable actions
|
// enable actions
|
||||||
err = repo_service.UpdateRepositoryUnits(db.DefaultContext, baseRepo, []repo_model.RepoUnit{{
|
err = repo_model.UpdateRepositoryUnits(db.DefaultContext, baseRepo, []repo_model.RepoUnit{{
|
||||||
RepoID: baseRepo.ID,
|
RepoID: baseRepo.ID,
|
||||||
Type: unit_model.TypeActions,
|
Type: unit_model.TypeActions,
|
||||||
}}, nil)
|
}}, nil)
|
||||||
|
@ -216,7 +216,7 @@ func TestSkipCI(t *testing.T) {
|
||||||
assert.NotEmpty(t, repo)
|
assert.NotEmpty(t, repo)
|
||||||
|
|
||||||
// enable actions
|
// enable actions
|
||||||
err = repo_service.UpdateRepositoryUnits(db.DefaultContext, repo, []repo_model.RepoUnit{{
|
err = repo_model.UpdateRepositoryUnits(db.DefaultContext, repo, []repo_model.RepoUnit{{
|
||||||
RepoID: repo.ID,
|
RepoID: repo.ID,
|
||||||
Type: unit_model.TypeActions,
|
Type: unit_model.TypeActions,
|
||||||
}}, nil)
|
}}, nil)
|
||||||
|
|
Loading…
Reference in a new issue