Repository: jesseduffield/lazygit
File: pkg/gui/custom_commands.go (Go)

Code before:
				return wrappedF()
			},
		}
	}

	title, err := gui.resolveTemplate(prompt.Title, promptResponses)
	if err != nil {
		return gui.surfaceError(err)
	}

	return gui.createMenu(title, menuItems, createMenuOptions{showCancel: true})
}

func (gui *Gui) GenerateMenuCandidates(commandOutput, filter, valueFormat, labelFormat string) ([]CommandMenuEntry, error) {
	candidates := []CommandMenuEntry{}
	reg, err := regexp.Compile(filter)
	if err != nil {
		return candidates, gui.surfaceError(errors.New("unable to parse filter regex, error: " + err.Error()))
	}
	buffItem := bytes.NewBuffer(nil)
	tempItem, err := template.New("format").Parse(valueFormat)
	if err != nil {
		return candidates, gui.surfaceError(errors.New("unable to parse item format, error: " + err.Error()))
	}
	buffDescr := bytes.NewBuffer(nil)
	tempDescr, err := template.New("format").Parse(labelFormat)
	if err != nil {
		return candidates, gui.surfaceError(errors.New("unable to parse item description format, error: " + err.Error()))
	}
	for _, str := range strings.Split(string(commandOutput), "\n") {
		if str == "" {
			continue
		}
		tmplData := map[string]string{}
		out := reg.FindAllStringSubmatch(str, -1)
		if len(out) > 0 {
			for groupIdx, group := range reg.SubexpNames() {
				// Record matched group with group ids
				matchName := "group_" + strconv.Itoa(groupIdx)
				tmplData[matchName] = out[0][groupIdx]
				// Record last named group non-empty matches as group matches
				if group != "" {
					tmplData[group] = out[0][groupIdx]
				}
			}
		}
		err = tempItem.Execute(buffItem, tmplData)
		if err != nil {
			return candidates, gui.surfaceError(err)
		}
		err = tempDescr.Execute(buffDescr, tmplData)

Review comment (suggestion):
I think this is a better name
Note the change of desc**r** > desc, spell checker in the browser and in my editor complains about descr
```suggestion
	descBuff := bytes.NewBuffer(nil)
	descTemp, err := template.New("format").Parse(labelFormat)
```

Code after:
				return wrappedF()
			},
		}
	}

	title, err := gui.resolveTemplate(prompt.Title, promptResponses)
	if err != nil {
		return gui.surfaceError(err)
	}

	return gui.createMenu(title, menuItems, createMenuOptions{showCancel: true})
}

func (gui *Gui) GenerateMenuCandidates(commandOutput, filter, valueFormat, labelFormat string) ([]commandMenuEntry, error) {
	reg, err := regexp.Compile(filter)
	if err != nil {
		return nil, gui.surfaceError(errors.New("unable to parse filter regex, error: " + err.Error()))
	}

	buff := bytes.NewBuffer(nil)

	valueTemp, err := template.New("format").Parse(valueFormat)
	if err != nil {
		return nil, gui.surfaceError(errors.New("unable to parse value format, error: " + err.Error()))
	}

	descTemp, err := template.New("format").Parse(labelFormat)
	if err != nil {
		return nil, gui.surfaceError(errors.New("unable to parse label format, error: " + err.Error()))
	}

	candidates := []commandMenuEntry{}
	for _, str := range strings.Split(string(commandOutput), "\n") {
		if str == "" {
			continue
		}

		tmplData := map[string]string{}
		out := reg.FindAllStringSubmatch(str, -1)
		if len(out) > 0 {
			for groupIdx, group := range reg.SubexpNames() {
				// Record matched group with group ids
				matchName := "group_" + strconv.Itoa(groupIdx)
				tmplData[matchName] = out[0][groupIdx]
				// Record last named group non-empty matches as group matches
				if group != "" {
					tmplData[group] = out[0][groupIdx]
				}
			}
		}