From b83875ae41d423c7aed8014fd3592a5a72a71597 Mon Sep 17 00:00:00 2001 From: 6543 <6543@obermui.de> Date: Tue, 27 Sep 2022 00:41:45 +0200 Subject: [PATCH 1/2] Find DefaultPRHead based on branch and SHA --- modules/git/branch.go | 10 +++++----- modules/task/pull_create.go | 5 +++-- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/modules/git/branch.go b/modules/git/branch.go index 6fef68d..2349b39 100644 --- a/modules/git/branch.go +++ b/modules/git/branch.go @@ -212,16 +212,16 @@ func (r TeaRepo) TeaFindBranchRemote(branchName, hash string) (*git.Remote, erro return match, err } -// TeaGetCurrentBranchName return the name of the branch witch is currently active -func (r TeaRepo) TeaGetCurrentBranchName() (string, error) { +// TeaGetCurrentBranchNameAndSHA return the name and sha of the branch witch is currently active +func (r TeaRepo) TeaGetCurrentBranchNameAndSHA() (string, string, error) { localHead, err := r.Head() if err != nil { - return "", err + return "", "", err } if !localHead.Name().IsBranch() { - return "", fmt.Errorf("active ref is no branch") + return "", "", fmt.Errorf("active ref is no branch") } - return localHead.Name().Short(), nil + return localHead.Name().Short(), localHead.Hash().String(), nil } diff --git a/modules/task/pull_create.go b/modules/task/pull_create.go index 8ed6ec9..ab1d7b0 100644 --- a/modules/task/pull_create.go +++ b/modules/task/pull_create.go @@ -88,11 +88,12 @@ func GetDefaultPRBase(login *config.Login, owner, repo string) (string, error) { // that has a branch with the same name, and extracts the owner from its URL. // If no remote matches, owner is empty, meaning same as head repo owner. func GetDefaultPRHead(localRepo *local_git.TeaRepo) (owner, branch string, err error) { - if branch, err = localRepo.TeaGetCurrentBranchName(); err != nil { + var sha string + if branch, sha, err = localRepo.TeaGetCurrentBranchNameAndSHA(); err != nil { return } - remote, err := localRepo.TeaFindBranchRemote(branch, "") + remote, err := localRepo.TeaFindBranchRemote(branch, sha) if err != nil { err = fmt.Errorf("could not determine remote for current branch: %s", err) return -- 2.40.1 From 757bd0cb721a506307d87603a2da8c50ceb0fb30 Mon Sep 17 00:00:00 2001 From: 6543 <6543@obermui.de> Date: Tue, 27 Sep 2022 14:07:21 +0200 Subject: [PATCH 2/2] TeaFindBranchRemote() make specific priority order first match of sha and branch -> first match of branch -> first match of sha --- modules/git/branch.go | 41 ++++++++++++++++++++++++++++++++--------- 1 file changed, 32 insertions(+), 9 deletions(-) diff --git a/modules/git/branch.go b/modules/git/branch.go index 2349b39..f39c837 100644 --- a/modules/git/branch.go +++ b/modules/git/branch.go @@ -173,6 +173,7 @@ func (r TeaRepo) TeaFindBranchByName(branchName, repoURL string) (b *git_config. // TeaFindBranchRemote gives the first remote that has a branch with the same name or sha, // depending on what is passed in. // This function is needed, as git does not always define branches in .git/config with remote entries. +// Priority order is: first match of sha and branch -> first match of branch -> first match of sha func (r TeaRepo) TeaFindBranchRemote(branchName, hash string) (*git.Remote, error) { remotes, err := r.Remotes() if err != nil { @@ -193,23 +194,45 @@ func (r TeaRepo) TeaFindBranchRemote(branchName, hash string) (*git.Remote, erro } defer iter.Close() - var match *git.Remote - err = iter.ForEach(func(ref *git_plumbing.Reference) error { + var shaMatch *git.Remote + var branchMatch *git.Remote + var fullMatch *git.Remote + if err := iter.ForEach(func(ref *git_plumbing.Reference) error { if ref.Name().IsRemote() { names := strings.SplitN(ref.Name().Short(), "/", 2) remote := names[0] branch := names[1] - hashMatch := hash != "" && hash == ref.Hash().String() - nameMatch := branchName != "" && branchName == branch - if hashMatch || nameMatch { - match, err = r.Remote(remote) - return err + if branchMatch == nil && branchName != "" && branchName == branch { + if branchMatch, err = r.Remote(remote); err != nil { + return err + } + } + if shaMatch == nil && hash != "" && hash == ref.Hash().String() { + if shaMatch, err = r.Remote(remote); err != nil { + return err + } + } + if fullMatch == nil && branchName != "" && branchName == branch && hash != "" && hash == ref.Hash().String() { + if fullMatch, err = r.Remote(remote); err != nil { + return err + } + // stop asap you have a full match + return nil } } return nil - }) + }); err != nil { + return nil, err + } - return match, err + if fullMatch != nil { + return fullMatch, nil + } else if branchMatch != nil { + return branchMatch, nil + } else if shaMatch != nil { + return shaMatch, nil + } + return nil, nil } // TeaGetCurrentBranchNameAndSHA return the name and sha of the branch witch is currently active -- 2.40.1