workflow-pr: don't recreate branches on every check

Check if branch exists and if it matches the PR already created.
If yes, then nothing needs to be updated.
This commit is contained in:
Adam Majer 2025-01-16 16:36:53 +01:00
parent fbaeddfcd8
commit 245181ad28
4 changed files with 28 additions and 11 deletions

View File

@ -4,6 +4,7 @@ import (
"bytes" "bytes"
"fmt" "fmt"
"log" "log"
"os"
"os/exec" "os/exec"
"path/filepath" "path/filepath"
"strings" "strings"
@ -145,7 +146,9 @@ func TestUpdatePrBranch(t *testing.T) {
req.Pull_Request.Base.Sha = strings.TrimSpace(revs[1]) req.Pull_Request.Base.Sha = strings.TrimSpace(revs[1])
req.Pull_Request.Head.Sha = strings.TrimSpace(revs[0]) req.Pull_Request.Head.Sha = strings.TrimSpace(revs[0])
updateOrCreatePRBranch(req, git, "created commit", "testing") updateSubmoduleToPR(req, git)
common.PanicOnError(git.GitExec(common.DefaultGitPrj, "commit", "-a", "-m", "created commit"))
common.PanicOnError(git.GitExec(common.DefaultGitPrj, "push", "origin", "+HEAD:+testing"))
git.GitExecOrPanic("prj", "reset", "--hard", "testing") git.GitExecOrPanic("prj", "reset", "--hard", "testing")
rev := strings.TrimSpace(git.GitExecWithOutputOrPanic(filepath.Join(common.DefaultGitPrj, "testRepo"), "rev-list", "-1", "HEAD")) rev := strings.TrimSpace(git.GitExecWithOutputOrPanic(filepath.Join(common.DefaultGitPrj, "testRepo"), "rev-list", "-1", "HEAD"))
if rev != req.Pull_Request.Head.Sha { if rev != req.Pull_Request.Head.Sha {
@ -181,7 +184,9 @@ func TestCreatePrBranch(t *testing.T) {
req.Pull_Request.Base.Sha = strings.TrimSpace(revs[1]) req.Pull_Request.Base.Sha = strings.TrimSpace(revs[1])
req.Pull_Request.Head.Sha = strings.TrimSpace(revs[0]) req.Pull_Request.Head.Sha = strings.TrimSpace(revs[0])
updateOrCreatePRBranch(req, git, "created commit", "testingCreated") updateSubmoduleToPR(req, git)
common.PanicOnError(git.GitExec(common.DefaultGitPrj, "commit", "-a", "-m", "created commit"))
common.PanicOnError(git.GitExec(common.DefaultGitPrj, "push", "origin", "+HEAD:testingCreated"))
rev := strings.TrimSpace(git.GitExecWithOutputOrPanic(filepath.Join(common.DefaultGitPrj, "testRepo"), "rev-list", "-1", "HEAD")) rev := strings.TrimSpace(git.GitExecWithOutputOrPanic(filepath.Join(common.DefaultGitPrj, "testRepo"), "rev-list", "-1", "HEAD"))
if rev != req.Pull_Request.Head.Sha { if rev != req.Pull_Request.Head.Sha {
@ -189,11 +194,11 @@ func TestCreatePrBranch(t *testing.T) {
t.Error(buf.String()) t.Error(buf.String())
} }
os.CopyFS("/tmp/test", os.DirFS(git.GitPath))
git.GitExecOrPanic("prj", "reset", "--hard", "testingCreated") git.GitExecOrPanic("prj", "reset", "--hard", "testingCreated")
rev = strings.TrimSpace(git.GitExecWithOutputOrPanic("prj", "submodule", "status", "testRepo"))[1 : len(req.Pull_Request.Head.Sha)+1] rev = strings.TrimSpace(git.GitExecWithOutputOrPanic("prj", "submodule", "status", "testRepo"))[1 : len(req.Pull_Request.Head.Sha)+1]
if rev != req.Pull_Request.Head.Sha { if rev != req.Pull_Request.Head.Sha {
t.Error("prj/testRepo not updated to", req.Pull_Request.Head.Sha, "but is at", rev) t.Error("prj/testRepo not updated to", req.Pull_Request.Head.Sha, "but is at", rev)
t.Error(buf.String()) t.Error(buf.String())
// os.CopyFS("/tmp/test", os.DirFS(git.GitPath))
} }
} }

View File

@ -23,7 +23,7 @@ func (o *PullRequestOpened) Process(req *common.PullRequestWebhookEvent, git com
This commit was autocreated by %s This commit was autocreated by %s
referencing referencing
PullRequest: %s/%s#%d`, `+common.PrPattern,
req.Repository.Owner.Username, req.Repository.Owner.Username,
req.Repository.Name, req.Repository.Name,
GitAuthor, GitAuthor,
@ -37,8 +37,20 @@ PullRequest: %s/%s#%d`,
} }
common.PanicOnError(git.GitExec("", "clone", "--depth", "1", prjGit.SSHURL, common.DefaultGitPrj)) common.PanicOnError(git.GitExec("", "clone", "--depth", "1", prjGit.SSHURL, common.DefaultGitPrj))
err = git.GitExec(common.DefaultGitPrj, "fetch", "origin", branchName+":"+branchName)
if err != nil {
common.PanicOnError(git.GitExec(common.DefaultGitPrj, "checkout", "-B", branchName, prjGit.DefaultBranch)) common.PanicOnError(git.GitExec(common.DefaultGitPrj, "checkout", "-B", branchName, prjGit.DefaultBranch))
updateOrCreatePRBranch(req, git, commitMsg, branchName) } else {
common.PanicOnError(git.GitExec(common.DefaultGitPrj, "checkout", branchName))
}
subList, err := git.GitSubmoduleList(common.DefaultGitPrj, "HEAD")
common.PanicOnError(err)
if id := subList[req.Repository.Name]; id != req.Pull_Request.Head.Sha {
updateSubmoduleToPR(req, git)
common.PanicOnError(git.GitExec(common.DefaultGitPrj, "commit", "-a", "-m", commitMsg))
common.PanicOnError(git.GitExec(common.DefaultGitPrj, "push", "origin", "+HEAD:"+branchName))
}
PR, err := o.gitea.CreatePullRequestIfNotExist(prjGit, branchName, prjGit.DefaultBranch, PR, err := o.gitea.CreatePullRequestIfNotExist(prjGit, branchName, prjGit.DefaultBranch,
fmt.Sprintf("Forwarded PR: %s", req.Repository.Name), fmt.Sprintf("Forwarded PR: %s", req.Repository.Name),

View File

@ -14,12 +14,10 @@ func prGitBranchNameForPR(req *common.PullRequestWebhookEvent) string {
return fmt.Sprintf("PR_%s#%d", req.Repository.Name, req.Pull_Request.Number) return fmt.Sprintf("PR_%s#%d", req.Repository.Name, req.Pull_Request.Number)
} }
func updateOrCreatePRBranch(req *common.PullRequestWebhookEvent, git common.Git, commitMsg, branchName string) { func updateSubmoduleToPR(req *common.PullRequestWebhookEvent, git common.Git) {
common.PanicOnError(git.GitExec(common.DefaultGitPrj, "submodule", "update", "--init", "--checkout", "--depth", "1", req.Repository.Name)) common.PanicOnError(git.GitExec(common.DefaultGitPrj, "submodule", "update", "--init", "--checkout", "--depth", "1", req.Repository.Name))
common.PanicOnError(git.GitExec(path.Join(common.DefaultGitPrj, req.Repository.Name), "fetch", "--depth", "1", "origin", req.Pull_Request.Head.Sha)) common.PanicOnError(git.GitExec(path.Join(common.DefaultGitPrj, req.Repository.Name), "fetch", "--depth", "1", "origin", req.Pull_Request.Head.Sha))
common.PanicOnError(git.GitExec(path.Join(common.DefaultGitPrj, req.Repository.Name), "checkout", req.Pull_Request.Head.Sha)) common.PanicOnError(git.GitExec(path.Join(common.DefaultGitPrj, req.Repository.Name), "checkout", req.Pull_Request.Head.Sha))
common.PanicOnError(git.GitExec(common.DefaultGitPrj, "commit", "-a", "-m", commitMsg))
common.PanicOnError(git.GitExec(common.DefaultGitPrj, "push", "origin", "+HEAD:"+branchName))
} }
func processPrjGitPullRequestSync(req *common.PullRequestWebhookEvent) error { func processPrjGitPullRequestSync(req *common.PullRequestWebhookEvent) error {
@ -78,6 +76,8 @@ Update to %s`, req.Pull_Request.Head.Sha)
// we need to update prjgit PR with the new head hash // we need to update prjgit PR with the new head hash
branchName := prGitBranchNameForPR(req) branchName := prGitBranchNameForPR(req)
updateOrCreatePRBranch(req, git, commitMsg, branchName) updateSubmoduleToPR(req, git)
common.PanicOnError(git.GitExec(common.DefaultGitPrj, "commit", "-a", "-m", commitMsg))
common.PanicOnError(git.GitExec(common.DefaultGitPrj, "push", "origin", "+HEAD:"+branchName))
return nil return nil
} }