commands/stack/reorder/prompt.go (60 lines of code) (raw):
package reorder
import (
"bytes"
"errors"
"fmt"
"strings"
"gitlab.com/gitlab-org/cli/commands/cmdutils"
"gitlab.com/gitlab-org/cli/pkg/git"
)
// parseReorderFile removes comments and trims space for all non-comment lines
func parseReorderFile(input string) (branches []string, err error) {
for line := range strings.SplitSeq(input, "\n") {
if strings.HasPrefix(line, "#") {
continue
}
if len(line) == 0 {
continue
}
branchLine := strings.Split(line, " ")
if (len(branchLine) == 1) || hasComment(branchLine) {
branches = append(branches, strings.TrimSpace(branchLine[0]))
} else {
return []string{},
fmt.Errorf("improperly formatted reorder file: unexpected content after branch name on line %q", line)
}
}
return
}
func promptForOrder(f *cmdutils.Factory, getText cmdutils.GetTextUsingEditor, stack git.Stack, branch string) ([]string, error) {
var message string
var buffer bytes.Buffer
buffer.WriteString("# Arrange the stack references in the order you'd like. Lines starting\n# with '#' will be ignored. \n#\n")
for ref := range stack.Iter() {
currentBranch := " # "
if branch == ref.Branch {
currentBranch = " # <- Current branch, "
}
buffer.WriteString(ref.Branch + currentBranch + ref.Description + "\n")
}
message = buffer.String()
editor, err := cmdutils.GetEditor(f.Config)
if err != nil {
return []string{}, err
}
var branches []string
if !f.IO.IsOutputTTY() {
return []string{}, errors.New("No TTY available")
}
promptResponse, err := getText(editor, "glab-stack-reorder*.gitrebase", message)
if err != nil {
return []string{}, err
}
branches, err = parseReorderFile(promptResponse)
if err != nil {
return []string{}, err
}
return branches, nil
}
func hasComment(words []string) bool {
return len(words) > 0 && strings.HasPrefix(words[1], "#")
}