From 527e7094a493e7862a7a0db5fed5f05841e6722f Mon Sep 17 00:00:00 2001 From: Prarit Bhargava Date: Sat, 11 Sep 2021 20:36:30 -0400 Subject: [PATCH] mr_create: Add -f option to open editor A request was made to add an option to open the editor when a file was specified for the title and description. Opening the editor would allow project owners and maintainers to deploy MR templates that could be edited by the MR submitter. Add a --file-open_editor/-f option that opens the editor with the file contents. Closes #739 Suggested-by: David Arcari Signed-off-by: Prarit Bhargava --- cmd/mr_create.go | 40 ++++++++++++++++++++++++++++++++++++---- cmd/mr_create_test.go | 4 ++-- 2 files changed, 38 insertions(+), 6 deletions(-) diff --git a/cmd/mr_create.go b/cmd/mr_create.go index 333729b8..072b130e 100644 --- a/cmd/mr_create.go +++ b/cmd/mr_create.go @@ -34,6 +34,7 @@ var mrCreateCmd = &cobra.Command{ lab mr create my_remote --draft lab mr create my_remote -F a_file.txt lab mr create my_remote -F a_file.txt --force-linebreak + lab mr create my_remote -f a_file.txt lab mr create my_remote -l bug -l confirmed lab mr create my_remote -m "A title message" lab mr create my_remote -m "A MR title" -m "A MR description" @@ -54,7 +55,8 @@ func init() { mrCreateCmd.Flags().BoolP("squash", "s", false, "squash commits when merging") mrCreateCmd.Flags().Bool("allow-collaboration", false, "allow commits from other members") mrCreateCmd.Flags().String("milestone", "", "set milestone by milestone title or ID") - mrCreateCmd.Flags().StringP("file", "F", "", "use the given file as the Description") + mrCreateCmd.Flags().StringP("file", "F", "", "use the given file as the Title and Description") + mrCreateCmd.Flags().StringP("file-edit", "f", "", "use the given file as the Title and Description and open the editor") mrCreateCmd.Flags().Bool("force-linebreak", false, "append 2 spaces to the end of each line to force markdown linebreaks") mrCreateCmd.Flags().BoolP("cover-letter", "c", false, "comment changelog and diffstat") mrCreateCmd.Flags().Bool("draft", false, "mark the merge request as draft") @@ -111,6 +113,22 @@ func runMRCreate(cmd *cobra.Command, args []string) { if err != nil { log.Fatal(err) } + + ofilename, err := cmd.Flags().GetString("file-edit") + if err != nil { + log.Fatal(err) + } + + if ofilename != "" && filename != "" { + log.Fatalf("Cannot specify both -F and -f options.") + } + + openEditor := false + if ofilename != "" { + filename = ofilename + openEditor = true + } + coverLetterFormat, err := cmd.Flags().GetBool("cover-letter") if err != nil { log.Fatal(err) @@ -230,6 +248,20 @@ func runMRCreate(cmd *cobra.Command, args []string) { if err != nil { log.Fatal(err) } + + if openEditor { + msg, err := mrText(sourceRemote, sourceBranch, targetRemote, targetBranch, coverLetterFormat, false) + if err != nil { + log.Fatal(err) + } + + msg = title + body + msg + + title, body, err = git.Edit("MERGEREQ", msg) + if err != nil { + log.Fatal(err) + } + } } else if len(msgs) > 0 { if coverLetterFormat { log.Fatal("option -m cannot be combined with -c/-F") @@ -237,7 +269,7 @@ func runMRCreate(cmd *cobra.Command, args []string) { title, body = msgs[0], strings.Join(msgs[1:], "\n\n") } else { - msg, err := mrText(sourceRemote, sourceBranch, targetRemote, targetBranch, coverLetterFormat) + msg, err := mrText(sourceRemote, sourceBranch, targetRemote, targetBranch, coverLetterFormat, true) if err != nil { log.Fatal(err) } @@ -303,13 +335,13 @@ func runMRCreate(cmd *cobra.Command, args []string) { } } -func mrText(sourceRemote, sourceBranch, targetRemote, targetBranch string, coverLetterFormat bool) (string, error) { +func mrText(sourceRemote, sourceBranch, targetRemote, targetBranch string, coverLetterFormat bool, generateCommitMsg bool) (string, error) { target := fmt.Sprintf("%s/%s", targetRemote, targetBranch) source := fmt.Sprintf("%s/%s", sourceRemote, sourceBranch) commitMsg := "" numCommits := git.NumberCommits(target, source) - if numCommits == 1 { + if numCommits == 1 && generateCommitMsg { var err error commitMsg, err = git.LastCommitMessage(source) if err != nil { diff --git a/cmd/mr_create_test.go b/cmd/mr_create_test.go index d64bb933..e648ff3d 100644 --- a/cmd/mr_create_test.go +++ b/cmd/mr_create_test.go @@ -9,7 +9,7 @@ import ( // MR Create is tested in cmd/mr_test.go func Test_mrText(t *testing.T) { - text, err := mrText("origin", "mrtest", "origin", "master", false) + text, err := mrText("origin", "mrtest", "origin", "master", false, false) if err != nil { t.Log(text) t.Fatal(err) @@ -29,7 +29,7 @@ I am the default merge request template for lab } func Test_mrText_CoverLetter(t *testing.T) { - coverLetter, err := mrText("origin", "mrtest", "origin", "master", true) + coverLetter, err := mrText("origin", "mrtest", "origin", "master", true, false) if err != nil { t.Log(coverLetter) t.Fatal(err)