aboutsummaryrefslogtreecommitdiffhomepage
path: root/vendor/github.com/posener/complete/cmd/install/utils.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/posener/complete/cmd/install/utils.go')
-rw-r--r--vendor/github.com/posener/complete/cmd/install/utils.go118
1 files changed, 118 insertions, 0 deletions
diff --git a/vendor/github.com/posener/complete/cmd/install/utils.go b/vendor/github.com/posener/complete/cmd/install/utils.go
new file mode 100644
index 0000000..2c8b44c
--- /dev/null
+++ b/vendor/github.com/posener/complete/cmd/install/utils.go
@@ -0,0 +1,118 @@
1package install
2
3import (
4 "bufio"
5 "fmt"
6 "io"
7 "io/ioutil"
8 "os"
9)
10
11func lineInFile(name string, lookFor string) bool {
12 f, err := os.Open(name)
13 if err != nil {
14 return false
15 }
16 defer f.Close()
17 r := bufio.NewReader(f)
18 prefix := []byte{}
19 for {
20 line, isPrefix, err := r.ReadLine()
21 if err == io.EOF {
22 return false
23 }
24 if err != nil {
25 return false
26 }
27 if isPrefix {
28 prefix = append(prefix, line...)
29 continue
30 }
31 line = append(prefix, line...)
32 if string(line) == lookFor {
33 return true
34 }
35 prefix = prefix[:0]
36 }
37}
38
39func appendToFile(name string, content string) error {
40 f, err := os.OpenFile(name, os.O_RDWR|os.O_APPEND, 0)
41 if err != nil {
42 return err
43 }
44 defer f.Close()
45 _, err = f.WriteString(fmt.Sprintf("\n%s\n", content))
46 return err
47}
48
49func removeFromFile(name string, content string) error {
50 backup := name + ".bck"
51 err := copyFile(name, backup)
52 if err != nil {
53 return err
54 }
55 temp, err := removeContentToTempFile(name, content)
56 if err != nil {
57 return err
58 }
59
60 err = copyFile(temp, name)
61 if err != nil {
62 return err
63 }
64
65 return os.Remove(backup)
66}
67
68func removeContentToTempFile(name, content string) (string, error) {
69 rf, err := os.Open(name)
70 if err != nil {
71 return "", err
72 }
73 defer rf.Close()
74 wf, err := ioutil.TempFile("/tmp", "complete-")
75 if err != nil {
76 return "", err
77 }
78 defer wf.Close()
79
80 r := bufio.NewReader(rf)
81 prefix := []byte{}
82 for {
83 line, isPrefix, err := r.ReadLine()
84 if err == io.EOF {
85 break
86 }
87 if err != nil {
88 return "", err
89 }
90 if isPrefix {
91 prefix = append(prefix, line...)
92 continue
93 }
94 line = append(prefix, line...)
95 str := string(line)
96 if str == content {
97 continue
98 }
99 wf.WriteString(str + "\n")
100 prefix = prefix[:0]
101 }
102 return wf.Name(), nil
103}
104
105func copyFile(src string, dst string) error {
106 in, err := os.Open(src)
107 if err != nil {
108 return err
109 }
110 defer in.Close()
111 out, err := os.Create(dst)
112 if err != nil {
113 return err
114 }
115 defer out.Close()
116 _, err = io.Copy(out, in)
117 return err
118}