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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 }