diff options
Diffstat (limited to 'pkg/commands/git_commands/merged_branch_loader.go')
-rw-r--r-- | pkg/commands/git_commands/merged_branch_loader.go | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/pkg/commands/git_commands/merged_branch_loader.go b/pkg/commands/git_commands/merged_branch_loader.go new file mode 100644 index 000000000..a3b4843b6 --- /dev/null +++ b/pkg/commands/git_commands/merged_branch_loader.go @@ -0,0 +1,59 @@ +package git_commands + +import ( + "github.com/jesseduffield/generics/set" + "github.com/jesseduffield/lazygit/pkg/utils" +) + +// Returns a set of branch names which are merged into a main branch. +// This +type MergedBranchLoader struct { + c *GitCommon +} + +func NewMergedBranchLoader(c *GitCommon) *MergedBranchLoader { + return &MergedBranchLoader{c: c} +} + +// TODO: check against upstreams, and share code with commit loader that determines main branches +func (self *MergedBranchLoader) Load() *set.Set[string] { + set := set.New[string]() + + mainBranches := self.c.UserConfig.Git.MainBranches + results := utils.ConcurrentMap(mainBranches, func(mainBranch string) []string { + mergedBranches, err := self.GetMergedBranches(mainBranch) + if err != nil { + self.c.Log.Warnf("Failed to get merged branches for %s: %s", mainBranch, err) + return nil + } + return mergedBranches + }) + + for i := 0; i < len(mainBranches); i++ { + for _, mergedBranch := range results[i] { + set.Add(mergedBranch) + } + } + + return set +} + +func (self *MergedBranchLoader) GetMergedBranches(mainBranch string) ([]string, error) { + // git for-each-ref --merged master --format '%(refname)' refs/heads/ + cmdArgs := NewGitCmd("for-each-ref").Arg( + "--merged", + mainBranch, + "--format", + "%(refname)", + "refs/heads/", + ).ToArgv() + + output, err := self.c.cmd.New(cmdArgs).DontLog().RunWithOutput() + if err != nil { + return nil, err + } + + branches := utils.SplitLines(output) + + return branches, nil +} |