This commit is contained in:
Adam Majer 2025-02-04 17:44:49 +01:00
parent dbee0e8bd3
commit c0c467d72b
3 changed files with 83 additions and 18 deletions

View File

@ -4,6 +4,8 @@ import (
"bufio"
"errors"
"fmt"
"os"
"path"
"slices"
"strings"
@ -55,11 +57,15 @@ func FetchPRSet(gitea common.GiteaPRFetcher, org, repo string, num int64, config
return &PRSet{prs: prs, config: config}, nil
}
func (rs *PRSet) IsPrjGitPR(pr *models.PullRequest) bool {
return pr.Base.Repo.Name == rs.config.GitProjectName && pr.Base.Repo.Owner.UserName == rs.config.Organization
}
func (rs *PRSet) GetPrjGitPR() (*models.PullRequest, error) {
var ret *models.PullRequest
for _, prinfo := range rs.prs {
if prinfo.pr.Base.Repo.Name == rs.config.GitProjectName && prinfo.pr.Base.Repo.Owner.UserName == rs.config.Organization {
if rs.IsPrjGitPR(prinfo.pr) {
if ret == nil {
ret = prinfo.pr
} else {
@ -153,34 +159,91 @@ func (rs *PRSet) Merge() error {
if s.Path != ".gitmodules" {
return err
}
/*
submodules, err := git.GitSubmoduleList(common.DefaultGitPrj, "MERGE_HEAD")
if err != nil {
return fmt.Errorf("Failed to fetch submodules during merge resolution: %w", err)
}
s1, err := git.GitExecWithOutput(common.DefaultGitPrj, "git", "cat-file", "blob", s.States[0])
s1, err := git.GitExecWithOutput(common.DefaultGitPrj, "cat-file", "blob", s.States[0])
if err != nil {
return fmt.Errorf("Failed fetching data during .gitmodules merge resoulution: %w", err)
}
s2, err := git.GitExecWithOutput(common.DefaultGitPrj, "git", "cat-file", "blob", s.States[1])
s2, err := git.GitExecWithOutput(common.DefaultGitPrj, "cat-file", "blob", s.States[1])
if err != nil {
return fmt.Errorf("Failed fetching data during .gitmodules merge resoulution: %w", err)
}
s3, err := git.GitExecWithOutput(common.DefaultGitPrj, "git", "cat-file", "blob", s.States[2])
s3, err := git.GitExecWithOutput(common.DefaultGitPrj, "cat-file", "blob", s.States[2])
if err != nil {
return fmt.Errorf("Failed fetching data during .gitmodules merge resoulution: %w", err)
}
*/
subs1, err := ParseSubmodulesFile(strings.NewReader(s1))
if err != nil {
return fmt.Errorf("Failed parsing submodule file [%s] in merge: %w", s.States[0], err)
}
subs2, err := ParseSubmodulesFile(strings.NewReader(s2))
if err != nil {
return fmt.Errorf("Failed parsing submodule file [%s] in merge: %w", s.States[0], err)
}
subs3, err := ParseSubmodulesFile(strings.NewReader(s3))
if err != nil {
return fmt.Errorf("Failed parsing submodule file [%s] in merge: %w", s.States[0], err)
}
// merge from subs3 (target), subs1 (orig), subs2 (2-nd base that is missing from target base)
// this will update submodules
mergedSubs := slices.Concat(subs1, subs2, subs3)
var filteredSubs []Submodule = make([]Submodule, 0, max(len(subs1), len(subs2), len(subs3)))
nextSub:
for subName := range submodules {
for i := range mergedSubs {
if path.Base(mergedSubs[i].Path) == subName {
filteredSubs = append(filteredSubs, mergedSubs[i])
continue nextSub
}
}
return fmt.Errorf("Cannot find submodule for path: %s", subName)
}
out, err := os.Create(path.Join(git.GetPath(), common.DefaultGitPrj, ".gitmodules"))
if err != nil {
return fmt.Errorf("Can't open .gitmodules for writing: %w", err)
}
if err = WriteSubmodules(filteredSubs, out); err != nil {
return fmt.Errorf("Can't write .gitmodules: %w", err)
}
if out.Close(); err != nil {
return fmt.Errorf("Can't close .gitmodules: %w", err)
}
os.CopyFS("/tmp/test", os.DirFS(git.GetPath()))
git.GitExecOrPanic(common.DefaultGitPrj, "add", ".gitmodules")
git.GitExecOrPanic(common.DefaultGitPrj, "-c", "core.editor=true", "merge", "--continue")
}
}
if strings.Contains(err.Error(), "Aborting merge") {
return errors.New("stuff")
}
return err
}
// FF all non-prj git
for _, prinfo := range rs.prs {
if rs.IsPrjGitPR(prinfo.pr) {
continue
}
git.GitExecOrPanic("", "clone", prinfo.pr.Base.Repo.SSHURL, prinfo.pr.Base.Name)
git.GitExecOrPanic(prinfo.pr.Base.Name, "fetch", "origin", prinfo.pr.Head.Sha)
git.GitExecOrPanic(prinfo.pr.Base.Name, "merge", "--ff", prinfo.pr.Head.Sha)
}
// push changes
git.GitExecOrPanic(common.DefaultGitPrj, "push", "origin")
for _, prinfo := range rs.prs {
if rs.IsPrjGitPR(prinfo.pr) {
continue
}
git.GitExecOrPanic(prinfo.pr.Base.Name, "push", "origin")
}
return nil
}

View File

@ -1,13 +1,8 @@
package main
import (
"testing"
"go.uber.org/mock/gomock"
"src.opensuse.org/autogits/common"
mock_common "src.opensuse.org/autogits/common/mock"
)
/*
func TestPRReviewed(t *testing.T) {
testData := []struct {
title string
@ -65,3 +60,4 @@ func TestPRReviewed(t *testing.T) {
})
}
}
*/

View File

@ -23,6 +23,7 @@ create_prjgit_sample() {
git init -q --object-format=sha256 -b main
echo Project git is here > README.md
git add README.md
git config receive.denyCurrentBranch ignore
git submodule init
git submodule -q add ../pkgA pkgA
@ -52,6 +53,7 @@ create_pkgA() {
pushd pkgA
git init -q --object-format=sha256
git config receive.denyCurrentBranch ignore
echo "Package A" > README.md
git add README.md
@ -65,6 +67,7 @@ create_pkgB() {
pushd pkgB
git init -q --object-format=sha256
git config receive.denyCurrentBranch ignore
echo "Package B" > README.md
git add README.md
@ -78,6 +81,7 @@ create_pkgB1() {
pushd pkgB1
git init -q --object-format=sha256
git config receive.denyCurrentBranch ignore
echo "Package B1" > README.md
git add README.md
@ -91,6 +95,7 @@ create_pkgB2() {
pushd pkgB2
git init -q --object-format=sha256
git config receive.denyCurrentBranch ignore
echo "Package B2" > README.md
git add README.md
@ -104,6 +109,7 @@ create_pkgC() {
pushd pkgC
git init -q --object-format=sha256
git config receive.denyCurrentBranch ignore
echo "Package C" > README.md
git add README.md