68 lines
1.5 KiB
Go
68 lines
1.5 KiB
Go
package shared
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"os"
|
|
|
|
"github.com/cli/cli/v2/pkg/cmdutil"
|
|
"github.com/cli/cli/v2/pkg/iostreams"
|
|
)
|
|
|
|
func PreserveInput(io *iostreams.IOStreams, state *IssueMetadataState, createErr *error) func() {
|
|
return func() {
|
|
if !state.IsDirty() {
|
|
return
|
|
}
|
|
|
|
if *createErr == nil {
|
|
return
|
|
}
|
|
|
|
if cmdutil.IsUserCancellation(*createErr) {
|
|
// these errors are user-initiated cancellations
|
|
return
|
|
}
|
|
|
|
out := io.ErrOut
|
|
|
|
// this extra newline guards against appending to the end of a survey line
|
|
fmt.Fprintln(out)
|
|
|
|
data, err := json.Marshal(state)
|
|
if err != nil {
|
|
fmt.Fprintf(out, "failed to save input to file: %s\n", err)
|
|
fmt.Fprintln(out, "would have saved:")
|
|
fmt.Fprintf(out, "%v\n", state)
|
|
return
|
|
}
|
|
|
|
tmpfile, err := io.TempFile(os.TempDir(), "gh*.json")
|
|
if err != nil {
|
|
fmt.Fprintf(out, "failed to save input to file: %s\n", err)
|
|
fmt.Fprintln(out, "would have saved:")
|
|
fmt.Fprintf(out, "%v\n", state)
|
|
return
|
|
}
|
|
|
|
_, err = tmpfile.Write(data)
|
|
if err != nil {
|
|
fmt.Fprintf(out, "failed to save input to file: %s\n", err)
|
|
fmt.Fprintln(out, "would have saved:")
|
|
fmt.Fprintln(out, string(data))
|
|
return
|
|
}
|
|
|
|
cs := io.ColorScheme()
|
|
|
|
issueType := "pr"
|
|
if state.Type == IssueMetadata {
|
|
issueType = "issue"
|
|
}
|
|
|
|
fmt.Fprintf(out, "%s operation failed. To restore: gh %s create --recover %s\n", cs.FailureIcon(), issueType, tmpfile.Name())
|
|
|
|
// some whitespace before the actual error
|
|
fmt.Fprintln(out)
|
|
}
|
|
}
|