Mercurial > projects > sievemgr
annotate cmd/sievemgr/edit.go @ 22:fc5e6970a0d5 default tip
Add support for specifying an authorization identity on the command line
author | Guido Berhoerster <guido+sievemgr@berhoerster.name> |
---|---|
date | Wed, 17 Feb 2021 07:50:55 +0100 |
parents | 29769b9e2f09 |
children |
rev | line source |
---|---|
8
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
1 // Copyright (C) 2020 Guido Berhoerster <guido+sievemgr@berhoerster.name> |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
2 // |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
3 // Permission is hereby granted, free of charge, to any person obtaining |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
4 // a copy of this software and associated documentation files (the |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
5 // "Software"), to deal in the Software without restriction, including |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
6 // without limitation the rights to use, copy, modify, merge, publish, |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
7 // distribute, sublicense, and/or sell copies of the Software, and to |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
8 // permit persons to whom the Software is furnished to do so, subject to |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
9 // the following conditions: |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
10 // |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
11 // The above copyright notice and this permission notice shall be included |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
12 // in all copies or substantial portions of the Software. |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
13 // |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
14 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
15 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
16 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
17 // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
18 // CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
19 // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
20 // SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
21 |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
22 package main |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
23 |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
24 import ( |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
25 "fmt" |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
26 "io" |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
27 "io/ioutil" |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
28 "os" |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
29 "os/exec" |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
30 "path/filepath" |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
31 "runtime" |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
32 "strings" |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
33 |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
34 "go.guido-berhoerster.org/managesieve" |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
35 "go.guido-berhoerster.org/sievemgr/cmd/sievemgr/internal/config" |
11
29769b9e2f09
Switch to golang.org/x/term module
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
8
diff
changeset
|
36 "golang.org/x/term" |
8
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
37 ) |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
38 |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
39 func init() { |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
40 cmdEdit.Flag.StringVar(&acctName, "a", "", "Select the account") |
22
fc5e6970a0d5
Add support for specifying an authorization identity on the command line
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
11
diff
changeset
|
41 cmdEdit.Flag.StringVar(&authzID, "A", "", "Specify the authorization identity") |
8
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
42 } |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
43 |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
44 var cmdEdit = &command{ |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
45 UsageLine: "edit [options] name", |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
46 Run: runEdit, |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
47 } |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
48 |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
49 func promptYesNo(prompt string) (yesNo bool, err error) { |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
50 var tty *os.File |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
51 var r io.Reader |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
52 var w io.Writer |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
53 if runtime.GOOS == "windows" { |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
54 r = os.Stdin |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
55 w = os.Stdout |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
56 } else { |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
57 tty, err = os.OpenFile("/dev/tty", os.O_RDWR, 0666) |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
58 if err != nil { |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
59 return |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
60 } |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
61 r = tty |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
62 w = tty |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
63 defer tty.Close() |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
64 } |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
65 |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
66 for { |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
67 io.WriteString(w, prompt) |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
68 |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
69 var response string |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
70 _, err = fmt.Fscanln(r, &response) |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
71 if err != nil { |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
72 err = fmt.Errorf("failed to read response: %s", err) |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
73 return |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
74 } |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
75 |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
76 switch strings.ToLower(response) { |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
77 case "y", "yes": |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
78 yesNo = true |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
79 return |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
80 case "n", "no": |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
81 return |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
82 } |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
83 } |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
84 } |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
85 |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
86 func getScript(acct *config.Account, scriptName string) (string, error) { |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
87 c, err := dialPlainAuth(acct) |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
88 if err != nil { |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
89 return "", err |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
90 } |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
91 defer c.Logout() |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
92 |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
93 return c.GetScript(scriptName) |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
94 } |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
95 |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
96 func readScript(filename string) (string, error) { |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
97 f, err := os.Open(filename) |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
98 if err != nil { |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
99 return "", err |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
100 } |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
101 defer f.Close() |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
102 |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
103 return readLimitedString(f, managesieve.ReadLimit) |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
104 } |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
105 |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
106 func putScript(acct *config.Account, scriptName, script string) (string, error) { |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
107 c, err := dialPlainAuth(acct) |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
108 if err != nil { |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
109 return "", err |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
110 } |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
111 defer c.Logout() |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
112 |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
113 return c.PutScript(scriptName, script) |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
114 } |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
115 |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
116 func runEdit(cmd *command, args []string) error { |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
117 if len(args) != 1 { |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
118 return usageError("invalid number of arguments") |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
119 } |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
120 |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
121 scriptName := args[0] |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
122 |
11
29769b9e2f09
Switch to golang.org/x/term module
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
8
diff
changeset
|
123 if !term.IsTerminal(int(os.Stdin.Fd())) || |
29769b9e2f09
Switch to golang.org/x/term module
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
8
diff
changeset
|
124 !term.IsTerminal(int(os.Stdout.Fd())) { |
8
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
125 return fmt.Errorf("the edit subcommand can only be used interactively\n") |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
126 } |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
127 |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
128 editor := os.Getenv("EDITOR") |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
129 if editor == "" { |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
130 return fmt.Errorf("EDITOR environment variable not set") |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
131 } |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
132 |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
133 acct, err := getAccount(&conf, acctName) |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
134 if err != nil { |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
135 return err |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
136 } |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
137 |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
138 if err := lookupHostPort(acct); err != nil { |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
139 return err |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
140 } |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
141 |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
142 if err := readPassword(acct); err != nil { |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
143 return err |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
144 } |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
145 |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
146 c, err := dialPlainAuth(acct) |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
147 if err != nil { |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
148 return err |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
149 } |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
150 defer c.Logout() |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
151 |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
152 script, err := getScript(acct, scriptName) |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
153 if err != nil { |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
154 return err |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
155 } |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
156 |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
157 tmpDir, err := ioutil.TempDir(os.TempDir(), "sievemgr*") |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
158 if err != nil { |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
159 return fmt.Errorf("failed to create temporary directory: %s", err) |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
160 } |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
161 |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
162 tmpFile := filepath.Join(tmpDir, scriptName) |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
163 if err = ioutil.WriteFile(tmpFile, []byte(script), 0640); err != nil { |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
164 return fmt.Errorf("failed to create script file: %s", err) |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
165 } |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
166 defer func() { |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
167 // show filename if an error has occured and the file is |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
168 // preserved |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
169 if tmpFile != "" { |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
170 fmt.Fprintf(os.Stderr, |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
171 "the script has been preserved as %s\n", |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
172 tmpFile) |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
173 } |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
174 }() |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
175 |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
176 // modification time is used to detect changes |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
177 info, err := os.Stat(tmpFile) |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
178 if err != nil { |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
179 return fmt.Errorf("failed to stat file: %s", err) |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
180 } |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
181 origModTime := info.ModTime() |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
182 |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
183 for { |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
184 cmd := exec.Command(editor, tmpFile) |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
185 cmd.Stdin = os.Stdin |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
186 cmd.Stdout = os.Stdout |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
187 cmd.Stderr = os.Stderr |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
188 if err := cmd.Run(); err != nil { |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
189 return fmt.Errorf("failed to run editor: %s", err) |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
190 } |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
191 |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
192 // quit if the script has not been changed |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
193 if info, err := os.Stat(tmpFile); err != nil { |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
194 return fmt.Errorf("failed to stat file: %s", err) |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
195 } else if info.ModTime() == origModTime { |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
196 fmt.Fprintln(os.Stderr, "aborting, script was not modified") |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
197 break |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
198 } |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
199 |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
200 script, err = readScript(tmpFile) |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
201 if err != nil { |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
202 return fmt.Errorf("failed to read script: %s", err) |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
203 } |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
204 |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
205 warnings, err := putScript(acct, scriptName, script) |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
206 if err != nil { |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
207 // show error and try again if the script was rejected |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
208 // by the server |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
209 fmt.Fprintln(os.Stderr, err) |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
210 yesNo, err := promptYesNo("edit again [y/n]? ") |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
211 if err != nil { |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
212 return err |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
213 } else if !yesNo { |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
214 return fmt.Errorf("script not saved") |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
215 } |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
216 } else if warnings != "" { |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
217 fmt.Fprintln(os.Stderr, warnings) |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
218 break |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
219 } else { |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
220 break |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
221 } |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
222 } |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
223 |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
224 os.RemoveAll(tmpDir) |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
225 tmpFile = "" |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
226 |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
227 return nil |
8caacf702c0d
Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff
changeset
|
228 } |