| // Copyright 2015 The Go Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style | |
| // license that can be found in the LICENSE file. | |
| package main | |
| import ( | |
| "io" | |
| "os" | |
| "os/exec" | |
| ) | |
| // editor invokes an interactive editor on a temporary file containing | |
| // initial, blocks until the editor exits, and returns the (possibly | |
| // edited) contents of the temporary file. It follows the conventions | |
| // of git for selecting and invoking the editor (see git-var(1)). | |
| func editor(initial string) string { | |
| // Query the git editor command. | |
| gitEditor := trim(cmdOutput("git", "var", "GIT_EDITOR")) | |
| // Create temporary file. | |
| temp, err := os.CreateTemp("", "git-codereview") | |
| if err != nil { | |
| dief("creating temp file: %v", err) | |
| } | |
| tempName := temp.Name() | |
| defer os.Remove(tempName) | |
| if _, err := io.WriteString(temp, initial); err != nil { | |
| dief("%v", err) | |
| } | |
| if err := temp.Close(); err != nil { | |
| dief("%v", err) | |
| } | |
| // Invoke the editor. See git's prepare_shell_cmd. | |
| cmd := exec.Command("sh", "-c", gitEditor+" \"$@\"", gitEditor, tempName) | |
| cmd.Stdin, cmd.Stdout, cmd.Stderr = os.Stdin, os.Stdout, os.Stderr | |
| if err := cmd.Run(); err != nil { | |
| os.Remove(tempName) | |
| dief("editor exited with: %v", err) | |
| } | |
| // Read the edited file. | |
| b, err := os.ReadFile(tempName) | |
| if err != nil { | |
| dief("%v", err) | |
| } | |
| return string(b) | |
| } |