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/bug | |
parent | 4c7043e8ed994d7863cfd706f6cfd2e1f91850df (diff) | |
download | git-bug-d5b07f48376cef9f62e12e3b56bcdd7483ef588f.tar.gz |
commands: move bug specific input code into commands/bug/input
Diffstat (limited to 'commands/bug')
-rw-r--r-- | commands/bug/bug_comment_add.go | 8 | ||||
-rw-r--r-- | commands/bug/bug_comment_edit.go | 8 | ||||
-rw-r--r-- | commands/bug/bug_new.go | 8 | ||||
-rw-r--r-- | commands/bug/bug_title_edit.go | 6 | ||||
-rw-r--r-- | commands/bug/input/input.go | 230 |
5 files changed, 245 insertions, 15 deletions
diff --git a/commands/bug/bug_comment_add.go b/commands/bug/bug_comment_add.go index b676db3a..b445ffad 100644 --- a/commands/bug/bug_comment_add.go +++ b/commands/bug/bug_comment_add.go @@ -3,10 +3,10 @@ package bugcmd import ( "github.com/spf13/cobra" + buginput "github.com/MichaelMure/git-bug/commands/bug/input" "github.com/MichaelMure/git-bug/commands/bug/select" "github.com/MichaelMure/git-bug/commands/completion" "github.com/MichaelMure/git-bug/commands/execenv" - "github.com/MichaelMure/git-bug/commands/input" "github.com/MichaelMure/git-bug/util/text" ) @@ -50,7 +50,7 @@ func runBugCommentNew(env *execenv.Env, opts bugCommentNewOptions, args []string } if opts.messageFile != "" && opts.message == "" { - opts.message, err = input.BugCommentFileInput(opts.messageFile) + opts.message, err = buginput.BugCommentFileInput(opts.messageFile) if err != nil { return err } @@ -61,8 +61,8 @@ func runBugCommentNew(env *execenv.Env, opts bugCommentNewOptions, args []string env.Err.Println("No message given. Use -m or -F option to specify a message. Aborting.") return nil } - opts.message, err = input.BugCommentEditorInput(env.Backend, "") - if err == input.ErrEmptyMessage { + opts.message, err = buginput.BugCommentEditorInput(env.Backend, "") + if err == buginput.ErrEmptyMessage { env.Err.Println("Empty message, aborting.") return nil } diff --git a/commands/bug/bug_comment_edit.go b/commands/bug/bug_comment_edit.go index 2a0289f5..ded3d82a 100644 --- a/commands/bug/bug_comment_edit.go +++ b/commands/bug/bug_comment_edit.go @@ -3,8 +3,8 @@ package bugcmd import ( "github.com/spf13/cobra" + buginput "github.com/MichaelMure/git-bug/commands/bug/input" "github.com/MichaelMure/git-bug/commands/execenv" - "github.com/MichaelMure/git-bug/commands/input" ) type bugCommentEditOptions struct { @@ -47,7 +47,7 @@ func runBugCommentEdit(env *execenv.Env, opts bugCommentEditOptions, args []stri } if opts.messageFile != "" && opts.message == "" { - opts.message, err = input.BugCommentFileInput(opts.messageFile) + opts.message, err = buginput.BugCommentFileInput(opts.messageFile) if err != nil { return err } @@ -58,8 +58,8 @@ func runBugCommentEdit(env *execenv.Env, opts bugCommentEditOptions, args []stri env.Err.Println("No message given. Use -m or -F option to specify a message. Aborting.") return nil } - opts.message, err = input.BugCommentEditorInput(env.Backend, "") - if err == input.ErrEmptyMessage { + opts.message, err = buginput.BugCommentEditorInput(env.Backend, "") + if err == buginput.ErrEmptyMessage { env.Err.Println("Empty message, aborting.") return nil } diff --git a/commands/bug/bug_new.go b/commands/bug/bug_new.go index fbfb9def..9ef288e9 100644 --- a/commands/bug/bug_new.go +++ b/commands/bug/bug_new.go @@ -3,8 +3,8 @@ package bugcmd import ( "github.com/spf13/cobra" + buginput "github.com/MichaelMure/git-bug/commands/bug/input" "github.com/MichaelMure/git-bug/commands/execenv" - "github.com/MichaelMure/git-bug/commands/input" "github.com/MichaelMure/git-bug/util/text" ) @@ -45,16 +45,16 @@ func newBugNewCommand() *cobra.Command { func runBugNew(env *execenv.Env, opts bugNewOptions) error { var err error if opts.messageFile != "" && opts.message == "" { - opts.title, opts.message, err = input.BugCreateFileInput(opts.messageFile) + opts.title, opts.message, err = buginput.BugCreateFileInput(opts.messageFile) if err != nil { return err } } if !opts.nonInteractive && opts.messageFile == "" && (opts.message == "" || opts.title == "") { - opts.title, opts.message, err = input.BugCreateEditorInput(env.Backend, opts.title, opts.message) + opts.title, opts.message, err = buginput.BugCreateEditorInput(env.Backend, opts.title, opts.message) - if err == input.ErrEmptyTitle { + if err == buginput.ErrEmptyTitle { env.Out.Println("Empty title, aborting.") return nil } diff --git a/commands/bug/bug_title_edit.go b/commands/bug/bug_title_edit.go index e71330a1..bf9f6375 100644 --- a/commands/bug/bug_title_edit.go +++ b/commands/bug/bug_title_edit.go @@ -3,10 +3,10 @@ package bugcmd import ( "github.com/spf13/cobra" + buginput "github.com/MichaelMure/git-bug/commands/bug/input" "github.com/MichaelMure/git-bug/commands/bug/select" "github.com/MichaelMure/git-bug/commands/completion" "github.com/MichaelMure/git-bug/commands/execenv" - "github.com/MichaelMure/git-bug/commands/input" "github.com/MichaelMure/git-bug/util/text" ) @@ -53,8 +53,8 @@ func runBugTitleEdit(env *execenv.Env, opts bugTitleEditOptions, args []string) env.Err.Println("No title given. Use -m or -F option to specify a title. Aborting.") return nil } - opts.title, err = input.BugTitleEditorInput(env.Repo, snap.Title) - if err == input.ErrEmptyTitle { + opts.title, err = buginput.BugTitleEditorInput(env.Repo, snap.Title) + if err == buginput.ErrEmptyTitle { env.Out.Println("Empty title, aborting.") return nil } diff --git a/commands/bug/input/input.go b/commands/bug/input/input.go new file mode 100644 index 00000000..23c20acb --- /dev/null +++ b/commands/bug/input/input.go @@ -0,0 +1,230 @@ +package buginput + +import ( + "bytes" + "fmt" + "strings" + + "github.com/pkg/errors" + + "github.com/MichaelMure/git-bug/commands/input" + "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 := input.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 := input.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 := input.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 := input.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 := input.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 := input.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 +} |