aboutsummaryrefslogtreecommitdiffstats
path: root/commands/input/input.go
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/input/input.go
parent4c7043e8ed994d7863cfd706f6cfd2e1f91850df (diff)
downloadgit-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.go235
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 {