annotate cmd/sievemgr/edit.go @ 11:29769b9e2f09

Switch to golang.org/x/term module Switch from golang.org/x/crypto/ssh/terminal to the new golang.org/x/term module.
author Guido Berhoerster <guido+sievemgr@berhoerster.name>
date Sat, 12 Dec 2020 20:44:35 +0100
parents 8caacf702c0d
children fc5e6970a0d5
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")
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
41 }
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 var cmdEdit = &command{
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
44 UsageLine: "edit [options] name",
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
45 Run: runEdit,
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
46 }
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 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
49 var tty *os.File
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
50 var r io.Reader
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
51 var w io.Writer
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
52 if runtime.GOOS == "windows" {
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
53 r = os.Stdin
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
54 w = os.Stdout
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
55 } else {
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
56 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
57 if err != nil {
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
58 return
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
59 }
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
60 r = tty
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
61 w = tty
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
62 defer tty.Close()
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
63 }
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 for {
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
66 io.WriteString(w, prompt)
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
67
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
68 var response string
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
69 _, err = fmt.Fscanln(r, &response)
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
70 if err != nil {
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
71 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
72 return
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
73 }
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 switch strings.ToLower(response) {
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
76 case "y", "yes":
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
77 yesNo = true
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
78 return
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
79 case "n", "no":
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
80 return
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
81 }
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 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
86 c, err := dialPlainAuth(acct)
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
87 if err != nil {
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
88 return "", err
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
89 }
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
90 defer c.Logout()
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
91
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
92 return c.GetScript(scriptName)
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
93 }
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 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
96 f, err := os.Open(filename)
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
97 if err != nil {
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
98 return "", err
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
99 }
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
100 defer f.Close()
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
101
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
102 return readLimitedString(f, managesieve.ReadLimit)
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
103 }
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 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
106 c, err := dialPlainAuth(acct)
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
107 if err != nil {
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
108 return "", err
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
109 }
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
110 defer c.Logout()
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
111
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
112 return c.PutScript(scriptName, script)
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
113 }
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 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
116 if len(args) != 1 {
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
117 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
118 }
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 scriptName := args[0]
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
121
11
29769b9e2f09 Switch to golang.org/x/term module
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents: 8
diff changeset
122 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
123 !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
124 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
125 }
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 editor := os.Getenv("EDITOR")
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
128 if editor == "" {
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
129 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
130 }
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 acct, err := getAccount(&conf, acctName)
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
133 if err != nil {
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
134 return err
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
135 }
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 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
138 return err
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
139 }
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 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
142 return err
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
143 }
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 c, err := dialPlainAuth(acct)
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
146 if err != nil {
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
147 return err
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
148 }
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
149 defer c.Logout()
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
150
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
151 script, err := getScript(acct, scriptName)
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
152 if err != nil {
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
153 return err
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
154 }
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 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
157 if err != nil {
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
158 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
159 }
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 tmpFile := filepath.Join(tmpDir, scriptName)
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
162 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
163 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
164 }
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
165 defer func() {
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
166 // 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
167 // preserved
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
168 if tmpFile != "" {
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
169 fmt.Fprintf(os.Stderr,
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
170 "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
171 tmpFile)
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
172 }
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 // 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
176 info, err := os.Stat(tmpFile)
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
177 if err != nil {
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
178 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
179 }
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
180 origModTime := info.ModTime()
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
181
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
182 for {
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
183 cmd := exec.Command(editor, tmpFile)
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
184 cmd.Stdin = os.Stdin
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
185 cmd.Stdout = os.Stdout
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
186 cmd.Stderr = os.Stderr
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
187 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
188 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
189 }
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 // 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
192 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
193 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
194 } else if info.ModTime() == origModTime {
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
195 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
196 break
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
197 }
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 script, err = readScript(tmpFile)
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
200 if err != nil {
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
201 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
202 }
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 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
205 if err != nil {
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
206 // 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
207 // by the server
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
208 fmt.Fprintln(os.Stderr, err)
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
209 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
210 if err != nil {
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
211 return err
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
212 } else if !yesNo {
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
213 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
214 }
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
215 } else if warnings != "" {
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
216 fmt.Fprintln(os.Stderr, warnings)
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
217 break
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
218 } else {
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
219 break
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
220 }
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 os.RemoveAll(tmpDir)
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
224 tmpFile = ""
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
225
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
226 return nil
8caacf702c0d Add edit subcommand for interactive editing of a script
Guido Berhoerster <guido+sievemgr@berhoerster.name>
parents:
diff changeset
227 }