From f04b303f58e7cb2a9e47366e7cd6222bf6a950eb Mon Sep 17 00:00:00 2001 From: Tom Amberson <53712733+TommyAmberson@users.noreply.github.com> Date: Fri, 20 Feb 2026 21:15:18 -0600 Subject: [PATCH] Support fnmatch patterns in mainBranches config Use `git for-each-ref` to resolve patterns containing *, ?, or [ against both local and origin remote branches. Exact branch names continue to use `git rev-parse` for fast lookups. --- pkg/commands/git_commands/main_branches.go | 25 ++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/pkg/commands/git_commands/main_branches.go b/pkg/commands/git_commands/main_branches.go index a177984f7..54a67ce0c 100644 --- a/pkg/commands/git_commands/main_branches.go +++ b/pkg/commands/git_commands/main_branches.go @@ -87,6 +87,31 @@ func (self *MainBranches) determineMainBranches(configuredMainBranches []string) go utils.Safe(func() { defer wg.Done() + // Check for glob patterns first + if strings.ContainsAny(branchName, "*?[") { + branchPattern := branchName + var refs []string + + // Check local branches + if output, err := self.cmd.New( + NewGitCmd("for-each-ref").Arg("--format=%(refname)", "refs/heads/"+branchPattern).ToArgv(), + ).DontLog().RunWithOutput(); err == nil { + refs = append(refs, strings.Fields(strings.TrimSpace(output))...) + } + + // Check remote branches on 'origin' + if output, err := self.cmd.New( + NewGitCmd("for-each-ref").Arg("--format=%(refname)", "refs/remotes/origin/"+branchPattern).ToArgv(), + ).DontLog().RunWithOutput(); err == nil { + refs = append(refs, strings.Fields(strings.TrimSpace(output))...) + } + + matchedBranches[i] = lo.Filter(refs, func(ref string, _ int) bool { + return ref != "" + }) + return + } + // Try to determine upstream of local main branch if ref, err := self.cmd.New( NewGitCmd("rev-parse").Arg("--symbolic-full-name", branchName+"@{u}").ToArgv(),