diff --git a/pkg/gui/custom_commands.go b/pkg/gui/custom_commands.go index e9aeedb4f..7ae1da8c0 100644 --- a/pkg/gui/custom_commands.go +++ b/pkg/gui/custom_commands.go @@ -117,7 +117,8 @@ func (gui *Gui) menuPrompt(prompt config.CustomCommandPrompt, promptResponses [] return gui.createMenu(title, menuItems, createMenuOptions{showCancel: true}) } -func (gui *Gui) generateMenuCandidates(commandOutput string, filter string, format string) ([]string, error) { + +func (gui *Gui) GenerateMenuCandidates(commandOutput string, filter string, format string) ([]string, error) { candidates := []string{} reg, err := regexp.Compile(filter) if err != nil { @@ -138,7 +139,7 @@ func (gui *Gui) generateMenuCandidates(commandOutput string, filter string, form for groupIdx, group := range reg.SubexpNames() { // Record matched group with group ids matchName := "group_" + strconv.Itoa(groupIdx) - tmplData[matchName] = group + tmplData[matchName] = out[0][groupIdx] // Record last named group non-empty matches as group matches if group != "" { tmplData[group] = out[0][groupIdx] @@ -176,7 +177,10 @@ func (gui *Gui) menuPromptFromCommand(prompt config.CustomCommandPrompt, promptR } // Need to make a menu out of what the cmd has displayed - candidates, err := gui.generateMenuCandidates(message, filter, prompt.Format) + candidates, err := gui.GenerateMenuCandidates(message, filter, prompt.Format) + if err != nil { + return gui.surfaceError(err) + } menuItems := make([]*menuItem, len(candidates)) for i := range candidates { diff --git a/pkg/gui/dummies.go b/pkg/gui/dummies.go new file mode 100644 index 000000000..97a03d784 --- /dev/null +++ b/pkg/gui/dummies.go @@ -0,0 +1,21 @@ +package gui + +import ( + "github.com/jesseduffield/lazygit/pkg/config" + "github.com/jesseduffield/lazygit/pkg/utils" + "github.com/jesseduffield/lazygit/pkg/commands/oscommands" + "github.com/jesseduffield/lazygit/pkg/commands" + "github.com/jesseduffield/lazygit/pkg/i18n" + "github.com/jesseduffield/lazygit/pkg/updates" +) + +// NewDummyGui creates a new dummy GUI for testing +func NewDummyUpdater() *updates.Updater { + DummyUpdater, _ := updates.NewUpdater(utils.NewDummyLog(), config.NewDummyAppConfig(), oscommands.NewDummyOSCommand(), i18n.NewTranslationSet(utils.NewDummyLog())) + return DummyUpdater +} + +func NewDummyGui() *Gui { + DummyGui, _ := NewGui(utils.NewDummyLog(), commands.NewDummyGitCommand(), oscommands.NewDummyOSCommand(), i18n.NewTranslationSet(utils.NewDummyLog()), config.NewDummyAppConfig(), NewDummyUpdater(), "", false) + return DummyGui +} diff --git a/pkg/gui/gui_test.go b/pkg/gui/gui_test.go index 8e37cecfe..8fcf0d4de 100644 --- a/pkg/gui/gui_test.go +++ b/pkg/gui/gui_test.go @@ -80,3 +80,52 @@ func runCmdHeadless(cmd *exec.Cmd) error { return f.Close() } + +func TestGuiGenerateMenuCandidates(t *testing.T) { + type scenario struct { + testName string + cmdOut string + filter string + format string + test func([]string, error) + } + + scenarios := []scenario{ + { + "Extract remote branch name", + "upstream/pr-1", + "upstream/(?P.*)", + "{{ .branch }}", + func(actual []string, err error) { + assert.NoError(t, err) + assert.EqualValues(t, "pr-1", actual[0]) + }, + }, + { + "Multiple named groups", + "upstream/pr-1", + "(?P[a-z]*)/(?P.*)", + "{{ .branch }}|{{ .remote }}", + func(actual []string, err error) { + assert.NoError(t, err) + assert.EqualValues(t, "pr-1|upstream", actual[0]) + }, + }, + { + "Multiple named groups with group ids", + "upstream/pr-1", + "(?P[a-z]*)/(?P.*)", + "{{ .group_2 }}|{{ .group_1 }}", + func(actual []string, err error) { + assert.NoError(t, err) + assert.EqualValues(t, "pr-1|upstream", actual[0]) + }, + }, + } + + for _, s := range scenarios { + t.Run(s.testName, func(t *testing.T) { + s.test(NewDummyGui().GenerateMenuCandidates(s.cmdOut, s.filter, s.format)) + }) + } +}