Files
Gitea/services/automergequeue/automergequeue.go
T
Willem Kokke 60326ca03d refactor(automerge): fix error handling, populate recent automerge tasks on restart (#39001)
* Refactor "automerge" related code, clarify many details (including "unique queue item", start check by pull head or commit)
* Fix automerge queue handler's error handling, clarify error messages
* Populate recent automerge tasks on restart to restore the previous aborted automerge tasks

Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>
2026-08-28 14:17:01 -07:00

53 lines
1.5 KiB
Go

// Copyright 2025 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT
package automergequeue
import (
"context"
"errors"
"strconv"
issues_model "gitea.dev/models/issues"
"gitea.dev/modules/git"
"gitea.dev/modules/log"
"gitea.dev/modules/queue"
)
// AutoMergeItem is for the unique queue, so the item type can't be JSON which doesn't have deterministic key order.
// Since the queue is a unique queue, the item must contain commit ID, otherwise the new commit ID will be ignored.
type AutoMergeItem string
var AutoMergeQueue *queue.WorkerPoolQueue[AutoMergeItem]
var AddToQueue = func(item AutoMergeItem) {
if err := AutoMergeQueue.Push(item); err != nil && !errors.Is(err, queue.ErrAlreadyInQueue) {
log.Error("Error adding %v to the automerge queue: %v", item, err)
}
}
func StartAutoMergeCheckByPullCommit(pullID int64, commitID string) {
AddToQueue(AutoMergeItem("pr:" + strconv.FormatInt(pullID, 10) + ":" + commitID))
}
func StartAutoMergeCheckByPullHead(ctx context.Context, pull *issues_model.PullRequest) {
if err := pull.LoadBaseRepo(ctx); err != nil {
log.Error("LoadBaseRepo: %v", err)
return
}
gitRepo, err := git.OpenRepository(ctx, pull.BaseRepo)
if err != nil {
log.Error("OpenRepository: %v", err)
return
}
defer gitRepo.Close()
commitID, err := gitRepo.GetRefCommitID(ctx, pull.GetGitHeadRefName())
if err != nil {
log.Error("GetRefCommitID: %v", err)
return
}
StartAutoMergeCheckByPullCommit(pull.ID, commitID)
}