diff --git a/jira/cli/cli.go b/jira/cli/cli.go index d68b2402..bfa233f1 100644 --- a/jira/cli/cli.go +++ b/jira/cli/cli.go @@ -196,7 +196,7 @@ func (c *Cli) getTemplate(name string) string { } else { return readFile(file) } - } + } return all_templates[name] } else { return readFile(file) @@ -222,6 +222,9 @@ func (c *Cli) editTemplate(template string, tmpFilePrefix string, templateData m log.Error("Failed to rename %s to %s: %s", fh.Name(), fmt.Sprintf("%s.yml", fh.Name()), err) return err } + defer func() { + os.Remove(tmpFileName) + }() err = runTemplate(template, templateData, fh) if err != nil { @@ -246,6 +249,12 @@ func (c *Cli) editTemplate(template string, tmpFilePrefix string, templateData m editing = false } + tmpFileNameOrig := fmt.Sprintf("%s-orig") + copyFile(tmpFileName,tmpFileNameOrig) + defer func() { + os.Remove(tmpFileNameOrig) + }() + for true { if editing { shell, _ := shellquote.Split(editor) @@ -260,6 +269,11 @@ func (c *Cli) editTemplate(template string, tmpFilePrefix string, templateData m } return err } + diff := exec.Command("diff", "-q", tmpFileNameOrig, tmpFileName) + if err := diff.Run(); err == nil { + log.Info("No changes found, aborting") + return fmt.Errorf("No changes found, aborting") + } } edited := make(map[string]interface{}) diff --git a/jira/cli/util.go b/jira/cli/util.go index fdbe31fc..6a46d635 100644 --- a/jira/cli/util.go +++ b/jira/cli/util.go @@ -63,6 +63,22 @@ func readFile(file string) string { return string(bytes) } +func copyFile(src, dst string) (err error){ + var s, d *os.File; + if s, err = os.Open(src); err == nil { + defer s.Close() + if d, err = os.Create(dst); err == nil { + if _, err = io.Copy(d, s); err != nil { + d.Close() + return + } + return d.Close() + } + } + return +} + + func fuzzyAge(start string) (string, error) { if t, err := time.Parse("2006-01-02T15:04:05.000-0700", start); err != nil { return "", err @@ -246,23 +262,25 @@ func yamlFixup(data interface{}) (interface{}, error) { } return copy, nil case map[string]interface{}: + copy := make(map[string]interface{}) for k, v := range d { if fixed, err := yamlFixup(v); err != nil { return nil, err } else if fixed != nil { - d[k] = fixed + copy[k] = fixed } } - return d, nil + return copy, nil case []interface{}: - for i, val := range d { + copy := make([]interface{}, 0, len(d)) + for _, val := range d { if fixed, err := yamlFixup(val); err != nil { return nil, err } else if fixed != nil { - d[i] = fixed + copy = append(copy, fixed) } } - return data, nil + return copy, nil case string: if d == "" { return nil, nil