aboutsummaryrefslogtreecommitdiffstats
path: root/commands/bug
diff options
context:
space:
mode:
authorMichael Muré <batolettre@gmail.com>2022-12-27 17:23:56 +0100
committerMichael Muré <batolettre@gmail.com>2022-12-27 17:23:56 +0100
commitd5b07f48376cef9f62e12e3b56bcdd7483ef588f (patch)
tree2eaf6c403e0f6e8bf1fd1327afd275a226d93f1f /commands/bug
parent4c7043e8ed994d7863cfd706f6cfd2e1f91850df (diff)
downloadgit-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.go8
-rw-r--r--commands/bug/bug_comment_edit.go8
-rw-r--r--commands/bug/bug_new.go8
-rw-r--r--commands/bug/bug_title_edit.go6
-rw-r--r--commands/bug/input/input.go230
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
+}