diff options
author | Michael Muré <batolettre@gmail.com> | 2022-12-27 17:23:56 +0100 |
---|---|---|
committer | Michael Muré <batolettre@gmail.com> | 2022-12-27 17:23:56 +0100 |
commit | d5b07f48376cef9f62e12e3b56bcdd7483ef588f (patch) | |
tree | 2eaf6c403e0f6e8bf1fd1327afd275a226d93f1f /commands/input/input.go | |
parent | 4c7043e8ed994d7863cfd706f6cfd2e1f91850df (diff) | |
download | git-bug-d5b07f48376cef9f62e12e3b56bcdd7483ef588f.tar.gz |
commands: move bug specific input code into commands/bug/input
Diffstat (limited to 'commands/input/input.go')
-rw-r--r-- | commands/input/input.go | 235 |
1 files changed, 7 insertions, 228 deletions
diff --git a/commands/input/input.go b/commands/input/input.go index ee343cd8..4ccfbd92 100644 --- a/commands/input/input.go +++ b/commands/input/input.go @@ -12,245 +12,24 @@ import ( "os" "os/exec" "path/filepath" - "strings" "github.com/go-git/go-billy/v5/util" - "github.com/pkg/errors" "github.com/MichaelMure/git-bug/repository" ) -const messageFilename = "BUG_MESSAGE_EDITMSG" - -// ErrEmptyMessage is returned when the required message has not been entered -var ErrEmptyMessage = errors.New("empty message") - -// ErrEmptyTitle is returned when the required title has not been entered -var ErrEmptyTitle = errors.New("empty title") - -const bugTitleCommentTemplate = `%s%s - -# Please enter the title and comment message. The first non-empty line will be -# used as the title. Lines starting with '#' will be ignored. -# An empty title aborts the operation. -` - -// BugCreateEditorInput will open the default editor in the terminal with a -// template for the user to fill. The file is then processed to extract title -// and message. -func BugCreateEditorInput(repo repository.RepoCommonStorage, preTitle string, preMessage string) (string, string, error) { - if preMessage != "" { - preMessage = "\n\n" + preMessage - } - - template := fmt.Sprintf(bugTitleCommentTemplate, preTitle, preMessage) - - raw, err := launchEditorWithTemplate(repo, messageFilename, template) - - if err != nil { - return "", "", err - } - - return processCreate(raw) -} - -// BugCreateFileInput read from either from a file or from the standard input -// and extract a title and a message -func BugCreateFileInput(fileName string) (string, string, error) { - raw, err := fromFile(fileName) - if err != nil { - return "", "", err - } - - return processCreate(raw) -} - -func processCreate(raw string) (string, string, error) { - lines := strings.Split(raw, "\n") - - var title string - var buffer bytes.Buffer - for _, line := range lines { - if strings.HasPrefix(line, "#") { - continue - } - - if title == "" { - trimmed := strings.TrimSpace(line) - if trimmed != "" { - title = trimmed - } - continue - } - - buffer.WriteString(line) - buffer.WriteString("\n") - } - - if title == "" { - return "", "", ErrEmptyTitle - } - - message := strings.TrimSpace(buffer.String()) - - return title, message, nil -} - -const bugCommentTemplate = `%s - -# Please enter the comment message. Lines starting with '#' will be ignored, -# and an empty message aborts the operation. -` - -// BugCommentEditorInput will open the default editor in the terminal with a -// template for the user to fill. The file is then processed to extract a comment. -func BugCommentEditorInput(repo repository.RepoCommonStorage, preMessage string) (string, error) { - template := fmt.Sprintf(bugCommentTemplate, preMessage) - - raw, err := launchEditorWithTemplate(repo, messageFilename, template) - if err != nil { - return "", err - } - - return processComment(raw) -} - -// BugCommentFileInput read from either from a file or from the standard input -// and extract a message -func BugCommentFileInput(fileName string) (string, error) { - raw, err := fromFile(fileName) - if err != nil { - return "", err - } - - return processComment(raw) -} - -func processComment(raw string) (string, error) { - lines := strings.Split(raw, "\n") - - var buffer bytes.Buffer - for _, line := range lines { - if strings.HasPrefix(line, "#") { - continue - } - buffer.WriteString(line) - buffer.WriteString("\n") - } - - message := strings.TrimSpace(buffer.String()) - - if message == "" { - return "", ErrEmptyMessage - } - - return message, nil -} - -const bugTitleTemplate = `%s - -# Please enter the new title. Only one line will used. -# Lines starting with '#' will be ignored, and an empty title aborts the operation. -` - -// BugTitleEditorInput will open the default editor in the terminal with a -// template for the user to fill. The file is then processed to extract a title. -func BugTitleEditorInput(repo repository.RepoCommonStorage, preTitle string) (string, error) { - template := fmt.Sprintf(bugTitleTemplate, preTitle) - - raw, err := launchEditorWithTemplate(repo, messageFilename, template) - if err != nil { - return "", err - } - - lines := strings.Split(raw, "\n") - - var title string - for _, line := range lines { - if strings.HasPrefix(line, "#") { - continue - } - trimmed := strings.TrimSpace(line) - if trimmed == "" { - continue - } - title = trimmed - break - } - - if title == "" { - return "", ErrEmptyTitle - } - - return title, nil -} - -const queryTemplate = `%s - -# Please edit the bug query. -# Lines starting with '#' will be ignored, and an empty query aborts the operation. -# -# Example: status:open author:"rené descartes" sort:edit -# -# Valid filters are: -# -# - status:open, status:closed -# - author:<query> -# - title:<title> -# - label:<label> -# - no:label -# -# Sorting -# -# - sort:id, sort:id-desc, sort:id-asc -# - sort:creation, sort:creation-desc, sort:creation-asc -# - sort:edit, sort:edit-desc, sort:edit-asc -# -# Notes -# -# - queries are case insensitive. -# - you can combine as many qualifiers as you want. -# - you can use double quotes for multi-word search terms (ex: author:"René Descartes") -` - -// QueryEditorInput will open the default editor in the terminal with a -// template for the user to fill. The file is then processed to extract a query. -func QueryEditorInput(repo repository.RepoCommonStorage, preQuery string) (string, error) { - template := fmt.Sprintf(queryTemplate, preQuery) - - raw, err := launchEditorWithTemplate(repo, messageFilename, template) - if err != nil { - return "", err - } - - lines := strings.Split(raw, "\n") - - for _, line := range lines { - if strings.HasPrefix(line, "#") { - continue - } - trimmed := strings.TrimSpace(line) - if trimmed == "" { - continue - } - return trimmed, nil - } - - return "", nil -} - -// launchEditorWithTemplate will launch an editor as launchEditor do, but with a +// LaunchEditorWithTemplate will launch an editor as LaunchEditor do, but with a // provided template. -func launchEditorWithTemplate(repo repository.RepoCommonStorage, fileName string, template string) (string, error) { +func LaunchEditorWithTemplate(repo repository.RepoCommonStorage, fileName string, template string) (string, error) { err := util.WriteFile(repo.LocalStorage(), fileName, []byte(template), 0644) if err != nil { return "", err } - return launchEditor(repo, fileName) + return LaunchEditor(repo, fileName) } -// launchEditor launches the default editor configured for the given repo. This +// LaunchEditor launches the default editor configured for the given repo. This // method blocks until the editor command has returned. // // The specified filename should be a temporary file and provided as a relative path @@ -259,7 +38,7 @@ func launchEditorWithTemplate(repo repository.RepoCommonStorage, fileName string // // This method returns the text that was read from the temporary file, or // an error if any step in the process failed. -func launchEditor(repo repository.RepoCommonStorage, fileName string) (string, error) { +func LaunchEditor(repo repository.RepoCommonStorage, fileName string) (string, error) { defer repo.LocalStorage().Remove(fileName) editor, err := repo.GetCoreEditor() @@ -302,11 +81,11 @@ func launchEditor(repo repository.RepoCommonStorage, fileName string) (string, e return string(output), err } -// fromFile loads and returns the contents of a given file. If - is passed +// FromFile loads and returns the contents of a given file. If - is passed // through, much like git, it will read from stdin. This can be piped data, // unless there is a tty in which case the user will be prompted to enter a // message. -func fromFile(fileName string) (string, error) { +func FromFile(fileName string) (string, error) { if fileName == "-" { stat, err := os.Stdin.Stat() if err != nil { |