Revert "Fix schedule tasks bugs (#28691)"
This reverts commit97292da960. (cherry picked from commit83e5eba031)
This commit is contained in:
		
							parent
							
								
									4699db575c
								
							
						
					
					
						commit
						f6ef8f3819
					
				
					 19 changed files with 90 additions and 206 deletions
				
			
		| 
						 | 
				
			
			@ -171,14 +171,13 @@ func updateRepoRunsNumbers(ctx context.Context, repo *repo_model.Repository) err
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
// 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'.
 | 
			
		||||
	runs, total, err := db.FindAndCount[ActionRun](ctx, FindRunOptions{
 | 
			
		||||
		RepoID:       repoID,
 | 
			
		||||
		Ref:          ref,
 | 
			
		||||
		WorkflowID:   workflowID,
 | 
			
		||||
		TriggerEvent: event,
 | 
			
		||||
		Status:       []Status{StatusRunning, StatusWaiting},
 | 
			
		||||
		RepoID:     repoID,
 | 
			
		||||
		Ref:        ref,
 | 
			
		||||
		WorkflowID: workflowID,
 | 
			
		||||
		Status:     []Status{StatusRunning, StatusWaiting},
 | 
			
		||||
	})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -10,7 +10,6 @@ import (
 | 
			
		|||
	repo_model "code.gitea.io/gitea/models/repo"
 | 
			
		||||
	user_model "code.gitea.io/gitea/models/user"
 | 
			
		||||
	"code.gitea.io/gitea/modules/container"
 | 
			
		||||
	webhook_module "code.gitea.io/gitea/modules/webhook"
 | 
			
		||||
 | 
			
		||||
	"xorm.io/builder"
 | 
			
		||||
)
 | 
			
		||||
| 
						 | 
				
			
			@ -72,7 +71,6 @@ type FindRunOptions struct {
 | 
			
		|||
	WorkflowID    string
 | 
			
		||||
	Ref           string // the commit/tag/… that caused this workflow
 | 
			
		||||
	TriggerUserID int64
 | 
			
		||||
	TriggerEvent  webhook_module.HookEventType
 | 
			
		||||
	Approved      bool // not util.OptionalBool, it works only when it's true
 | 
			
		||||
	Status        []Status
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -100,9 +98,6 @@ func (opts FindRunOptions) ToConds() builder.Cond {
 | 
			
		|||
	if opts.Ref != "" {
 | 
			
		||||
		cond = cond.And(builder.Eq{"ref": opts.Ref})
 | 
			
		||||
	}
 | 
			
		||||
	if opts.TriggerEvent != "" {
 | 
			
		||||
		cond = cond.And(builder.Eq{"trigger_event": opts.TriggerEvent})
 | 
			
		||||
	}
 | 
			
		||||
	return cond
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -5,7 +5,6 @@ package actions
 | 
			
		|||
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"code.gitea.io/gitea/models/db"
 | 
			
		||||
| 
						 | 
				
			
			@ -119,22 +118,3 @@ func DeleteScheduleTaskByRepo(ctx context.Context, id int64) error {
 | 
			
		|||
 | 
			
		||||
	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
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -287,7 +287,7 @@ func FindRenamedBranch(ctx context.Context, repoID int64, from string) (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)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
| 
						 | 
				
			
			@ -362,7 +362,7 @@ func RenameBranch(ctx context.Context, repo *repo_model.Repository, from, to str
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	// 5. do git action
 | 
			
		||||
	if err = gitAction(ctx, isDefault); err != nil {
 | 
			
		||||
	if err = gitAction(isDefault); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4,7 +4,6 @@
 | 
			
		|||
package git_test
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"testing"
 | 
			
		||||
 | 
			
		||||
	"code.gitea.io/gitea/models/db"
 | 
			
		||||
| 
						 | 
				
			
			@ -133,7 +132,7 @@ func TestRenameBranch(t *testing.T) {
 | 
			
		|||
	}, git_model.WhitelistOptions{}))
 | 
			
		||||
	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
 | 
			
		||||
		return nil
 | 
			
		||||
	}))
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -314,3 +314,29 @@ func UpdateRepoUnit(ctx context.Context, unit *RepoUnit) error {
 | 
			
		|||
	_, err := db.GetEngine(ctx).ID(unit.ID).Update(unit)
 | 
			
		||||
	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"
 | 
			
		||||
	GithubEventPullRequestComment       = "pull_request_comment"
 | 
			
		||||
	GithubEventGollum                   = "gollum"
 | 
			
		||||
	GithubEventSchedule                 = "schedule"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// 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
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	case GithubEventSchedule:
 | 
			
		||||
		return triggedEvent == webhook_module.HookEventSchedule
 | 
			
		||||
 | 
			
		||||
	default:
 | 
			
		||||
		return eventName == string(triggedEvent)
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -22,7 +22,7 @@ import (
 | 
			
		|||
 | 
			
		||||
type DetectedWorkflow struct {
 | 
			
		||||
	EntryName    string
 | 
			
		||||
	TriggerEvent *jobparser.Event
 | 
			
		||||
	TriggerEvent string
 | 
			
		||||
	Content      []byte
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -103,7 +103,6 @@ func DetectWorkflows(
 | 
			
		|||
	commit *git.Commit,
 | 
			
		||||
	triggedEvent webhook_module.HookEventType,
 | 
			
		||||
	payload api.Payloader,
 | 
			
		||||
	detectSchedule bool,
 | 
			
		||||
) ([]*DetectedWorkflow, []*DetectedWorkflow, error) {
 | 
			
		||||
	entries, err := ListWorkflows(commit)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
| 
						 | 
				
			
			@ -118,7 +117,6 @@ func DetectWorkflows(
 | 
			
		|||
			return nil, nil, err
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// one workflow may have multiple events
 | 
			
		||||
		events, err := GetEventsFromContent(content)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			log.Warn("ignore invalid workflow %q: %v", entry.Name(), err)
 | 
			
		||||
| 
						 | 
				
			
			@ -127,18 +125,17 @@ func DetectWorkflows(
 | 
			
		|||
		for _, evt := range events {
 | 
			
		||||
			log.Trace("detect workflow %q for event %#v matching %q", entry.Name(), evt, triggedEvent)
 | 
			
		||||
			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{
 | 
			
		||||
					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,
 | 
			
		||||
				}
 | 
			
		||||
				workflows = append(workflows, dwf)
 | 
			
		||||
| 
						 | 
				
			
			@ -159,8 +156,7 @@ func detectMatched(gitRepo *git.Repository, commit *git.Commit, triggedEvent web
 | 
			
		|||
		webhook_module.HookEventCreate,
 | 
			
		||||
		webhook_module.HookEventDelete,
 | 
			
		||||
		webhook_module.HookEventFork,
 | 
			
		||||
		webhook_module.HookEventWiki,
 | 
			
		||||
		webhook_module.HookEventSchedule:
 | 
			
		||||
		webhook_module.HookEventWiki:
 | 
			
		||||
		if len(evt.Acts()) != 0 {
 | 
			
		||||
			log.Warn("Ignore unsupported %s event arguments %v", triggedEvent, evt.Acts())
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -118,13 +118,6 @@ func TestDetectMatched(t *testing.T) {
 | 
			
		|||
			yamlOn:       "on: gollum",
 | 
			
		||||
			expected:     true,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			desc:         "HookEventSchedue(schedule) matches GithubEventSchedule(schedule)",
 | 
			
		||||
			triggedEvent: webhook_module.HookEventSchedule,
 | 
			
		||||
			payload:      nil,
 | 
			
		||||
			yamlOn:       "on: schedule",
 | 
			
		||||
			expected:     true,
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, tc := range testCases {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -31,7 +31,6 @@ const (
 | 
			
		|||
	HookEventRepository                HookEventType = "repository"
 | 
			
		||||
	HookEventRelease                   HookEventType = "release"
 | 
			
		||||
	HookEventPackage                   HookEventType = "package"
 | 
			
		||||
	HookEventSchedule                  HookEventType = "schedule"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Event returns the HookEventType as an event string
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -984,7 +984,7 @@ func updateRepoUnits(ctx *context.APIContext, opts api.EditRepoOption) error {
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	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)
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -6,12 +6,13 @@ package setting
 | 
			
		|||
import (
 | 
			
		||||
	"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/git"
 | 
			
		||||
	"code.gitea.io/gitea/modules/log"
 | 
			
		||||
	"code.gitea.io/gitea/modules/setting"
 | 
			
		||||
	"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
 | 
			
		||||
| 
						 | 
				
			
			@ -34,14 +35,23 @@ func SetDefaultBranchPost(ctx *context.Context) {
 | 
			
		|||
		}
 | 
			
		||||
 | 
			
		||||
		branch := ctx.FormString("branch")
 | 
			
		||||
		if err := repo_service.SetRepoDefaultBranch(ctx, ctx.Repo.Repository, ctx.Repo.GitRepo, branch); err != nil {
 | 
			
		||||
			switch {
 | 
			
		||||
			case git_model.IsErrBranchNotExist(err):
 | 
			
		||||
				ctx.Status(http.StatusNotFound)
 | 
			
		||||
			default:
 | 
			
		||||
				ctx.ServerError("SetDefaultBranch", err)
 | 
			
		||||
			}
 | 
			
		||||
		if !ctx.Repo.GitRepo.IsBranchExist(branch) {
 | 
			
		||||
			ctx.Status(http.StatusNotFound)
 | 
			
		||||
			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)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -601,7 +601,7 @@ func SettingsPost(ctx *context.Context) {
 | 
			
		|||
			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)
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -118,9 +118,6 @@ func notify(ctx context.Context, input *notifyInput) error {
 | 
			
		|||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	if unit_model.TypeActions.UnitGlobalDisabled() {
 | 
			
		||||
		if err := actions_model.CleanRepoScheduleTasks(ctx, input.Repo); err != nil {
 | 
			
		||||
			log.Error("CleanRepoScheduleTasks: %v", err)
 | 
			
		||||
		}
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	if err := input.Repo.LoadUnits(ctx); err != nil {
 | 
			
		||||
| 
						 | 
				
			
			@ -157,11 +154,7 @@ func notify(ctx context.Context, input *notifyInput) error {
 | 
			
		|||
 | 
			
		||||
	var detectedWorkflows []*actions_module.DetectedWorkflow
 | 
			
		||||
	actionsConfig := input.Repo.MustGetUnit(ctx, unit_model.TypeActions).ActionsConfig()
 | 
			
		||||
	workflows, schedules, err := actions_module.DetectWorkflows(gitRepo, commit,
 | 
			
		||||
		input.Event,
 | 
			
		||||
		input.Payload,
 | 
			
		||||
		input.Event == webhook_module.HookEventPush && input.Ref == input.Repo.DefaultBranch,
 | 
			
		||||
	)
 | 
			
		||||
	workflows, schedules, err := actions_module.DetectWorkflows(gitRepo, commit, input.Event, input.Payload)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return fmt.Errorf("DetectWorkflows: %w", err)
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -175,7 +168,7 @@ func notify(ctx context.Context, input *notifyInput) error {
 | 
			
		|||
				continue
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			if wf.TriggerEvent.Name != actions_module.GithubEventPullRequestTarget {
 | 
			
		||||
			if wf.TriggerEvent != actions_module.GithubEventPullRequestTarget {
 | 
			
		||||
				detectedWorkflows = append(detectedWorkflows, wf)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			@ -188,7 +181,7 @@ func notify(ctx context.Context, input *notifyInput) error {
 | 
			
		|||
		if err != nil {
 | 
			
		||||
			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 {
 | 
			
		||||
			return fmt.Errorf("DetectWorkflows: %w", err)
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			@ -196,7 +189,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)
 | 
			
		||||
		} else {
 | 
			
		||||
			for _, wf := range baseWorkflows {
 | 
			
		||||
				if wf.TriggerEvent.Name == actions_module.GithubEventPullRequestTarget {
 | 
			
		||||
				if wf.TriggerEvent == actions_module.GithubEventPullRequestTarget {
 | 
			
		||||
					detectedWorkflows = append(detectedWorkflows, wf)
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
| 
						 | 
				
			
			@ -273,7 +266,7 @@ func handleWorkflows(
 | 
			
		|||
			IsForkPullRequest: isForkPullRequest,
 | 
			
		||||
			Event:             input.Event,
 | 
			
		||||
			EventPayload:      string(p),
 | 
			
		||||
			TriggerEvent:      dwf.TriggerEvent.Name,
 | 
			
		||||
			TriggerEvent:      dwf.TriggerEvent,
 | 
			
		||||
			Status:            actions_model.StatusWaiting,
 | 
			
		||||
		}
 | 
			
		||||
		if need, err := ifNeedApproval(ctx, run, input.Repo, input.Doer); err != nil {
 | 
			
		||||
| 
						 | 
				
			
			@ -297,7 +290,6 @@ func handleWorkflows(
 | 
			
		|||
				run.RepoID,
 | 
			
		||||
				run.Ref,
 | 
			
		||||
				run.WorkflowID,
 | 
			
		||||
				run.Event,
 | 
			
		||||
			); err != nil {
 | 
			
		||||
				log.Error("CancelRunningJobs: %v", err)
 | 
			
		||||
			}
 | 
			
		||||
| 
						 | 
				
			
			@ -423,8 +415,8 @@ func handleSchedules(
 | 
			
		|||
		log.Error("CountSchedules: %v", err)
 | 
			
		||||
		return err
 | 
			
		||||
	} else if count > 0 {
 | 
			
		||||
		if err := actions_model.CleanRepoScheduleTasks(ctx, input.Repo); err != nil {
 | 
			
		||||
			log.Error("CleanRepoScheduleTasks: %v", err)
 | 
			
		||||
		if err := actions_model.DeleteScheduleTaskByRepo(ctx, input.Repo.ID); err != nil {
 | 
			
		||||
			log.Error("DeleteCronTaskByRepo: %v", err)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -469,6 +461,19 @@ func handleSchedules(
 | 
			
		|||
			Specs:         schedules,
 | 
			
		||||
			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)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -59,7 +59,6 @@ func startTasks(ctx context.Context) error {
 | 
			
		|||
					row.RepoID,
 | 
			
		||||
					row.Schedule.Ref,
 | 
			
		||||
					row.Schedule.WorkflowID,
 | 
			
		||||
					webhook_module.HookEventSchedule,
 | 
			
		||||
				); err != nil {
 | 
			
		||||
					log.Error("CancelRunningJobs: %v", err)
 | 
			
		||||
				}
 | 
			
		||||
| 
						 | 
				
			
			@ -114,7 +113,6 @@ func CreateScheduleTask(ctx context.Context, cron *actions_model.ActionSchedule)
 | 
			
		|||
		CommitSHA:     cron.CommitSHA,
 | 
			
		||||
		Event:         cron.Event,
 | 
			
		||||
		EventPayload:  cron.EventPayload,
 | 
			
		||||
		TriggerEvent:  string(webhook_module.HookEventSchedule),
 | 
			
		||||
		ScheduleID:    cron.ID,
 | 
			
		||||
		Status:        actions_model.StatusWaiting,
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -10,7 +10,6 @@ import (
 | 
			
		|||
	"strings"
 | 
			
		||||
 | 
			
		||||
	"code.gitea.io/gitea/models"
 | 
			
		||||
	actions_model "code.gitea.io/gitea/models/actions"
 | 
			
		||||
	"code.gitea.io/gitea/models/db"
 | 
			
		||||
	git_model "code.gitea.io/gitea/models/git"
 | 
			
		||||
	issues_model "code.gitea.io/gitea/models/issues"
 | 
			
		||||
| 
						 | 
				
			
			@ -24,7 +23,6 @@ import (
 | 
			
		|||
	repo_module "code.gitea.io/gitea/modules/repository"
 | 
			
		||||
	"code.gitea.io/gitea/modules/timeutil"
 | 
			
		||||
	"code.gitea.io/gitea/modules/util"
 | 
			
		||||
	webhook_module "code.gitea.io/gitea/modules/webhook"
 | 
			
		||||
	notify_service "code.gitea.io/gitea/services/notify"
 | 
			
		||||
	files_service "code.gitea.io/gitea/services/repository/files"
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -312,28 +310,13 @@ func RenameBranch(ctx context.Context, repo *repo_model.Repository, doer *user_m
 | 
			
		|||
		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)
 | 
			
		||||
		if err2 != nil {
 | 
			
		||||
			return err2
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		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)
 | 
			
		||||
			if err2 != nil {
 | 
			
		||||
				return err2
 | 
			
		||||
| 
						 | 
				
			
			@ -469,50 +452,3 @@ func AddAllRepoBranchesToSyncQueue(ctx context.Context, doerID int64) error {
 | 
			
		|||
	}
 | 
			
		||||
	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"
 | 
			
		||||
	"code.gitea.io/gitea/modules/sync"
 | 
			
		||||
	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)
 | 
			
		||||
| 
						 | 
				
			
			@ -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.
 | 
			
		||||
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
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -47,7 +47,7 @@ func TestPullRequestTargetEvent(t *testing.T) {
 | 
			
		|||
		assert.NotEmpty(t, baseRepo)
 | 
			
		||||
 | 
			
		||||
		// 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,
 | 
			
		||||
			Type:   unit_model.TypeActions,
 | 
			
		||||
		}}, nil)
 | 
			
		||||
| 
						 | 
				
			
			@ -216,7 +216,7 @@ func TestSkipCI(t *testing.T) {
 | 
			
		|||
		assert.NotEmpty(t, repo)
 | 
			
		||||
 | 
			
		||||
		// 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,
 | 
			
		||||
			Type:   unit_model.TypeActions,
 | 
			
		||||
		}}, nil)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue