]> git.immae.eu Git - github/fretlink/terraform-provider-statuscake.git/blob - vendor/github.com/posener/complete/cmd/install/utils.go
Upgrade to 0.12
[github/fretlink/terraform-provider-statuscake.git] / vendor / github.com / posener / complete / cmd / install / utils.go
1 package install
2
3 import (
4 "bufio"
5 "fmt"
6 "io"
7 "io/ioutil"
8 "os"
9 "path/filepath"
10 )
11
12 func lineInFile(name string, lookFor string) bool {
13 f, err := os.Open(name)
14 if err != nil {
15 return false
16 }
17 defer f.Close()
18 r := bufio.NewReader(f)
19 prefix := []byte{}
20 for {
21 line, isPrefix, err := r.ReadLine()
22 if err == io.EOF {
23 return false
24 }
25 if err != nil {
26 return false
27 }
28 if isPrefix {
29 prefix = append(prefix, line...)
30 continue
31 }
32 line = append(prefix, line...)
33 if string(line) == lookFor {
34 return true
35 }
36 prefix = prefix[:0]
37 }
38 }
39
40 func createFile(name string, content string) error {
41 // make sure file directory exists
42 if err := os.MkdirAll(filepath.Dir(name), 0775); err != nil {
43 return err
44 }
45
46 // create the file
47 f, err := os.Create(name)
48 if err != nil {
49 return err
50 }
51 defer f.Close()
52
53 // write file content
54 _, err = f.WriteString(fmt.Sprintf("%s\n", content))
55 return err
56 }
57
58 func appendToFile(name string, content string) error {
59 f, err := os.OpenFile(name, os.O_RDWR|os.O_APPEND, 0)
60 if err != nil {
61 return err
62 }
63 defer f.Close()
64 _, err = f.WriteString(fmt.Sprintf("\n%s\n", content))
65 return err
66 }
67
68 func removeFromFile(name string, content string) error {
69 backup := name + ".bck"
70 err := copyFile(name, backup)
71 if err != nil {
72 return err
73 }
74 temp, err := removeContentToTempFile(name, content)
75 if err != nil {
76 return err
77 }
78
79 err = copyFile(temp, name)
80 if err != nil {
81 return err
82 }
83
84 return os.Remove(backup)
85 }
86
87 func removeContentToTempFile(name, content string) (string, error) {
88 rf, err := os.Open(name)
89 if err != nil {
90 return "", err
91 }
92 defer rf.Close()
93 wf, err := ioutil.TempFile("/tmp", "complete-")
94 if err != nil {
95 return "", err
96 }
97 defer wf.Close()
98
99 r := bufio.NewReader(rf)
100 prefix := []byte{}
101 for {
102 line, isPrefix, err := r.ReadLine()
103 if err == io.EOF {
104 break
105 }
106 if err != nil {
107 return "", err
108 }
109 if isPrefix {
110 prefix = append(prefix, line...)
111 continue
112 }
113 line = append(prefix, line...)
114 str := string(line)
115 if str == content {
116 continue
117 }
118 _, err = wf.WriteString(str + "\n")
119 if err != nil {
120 return "", err
121 }
122 prefix = prefix[:0]
123 }
124 return wf.Name(), nil
125 }
126
127 func copyFile(src string, dst string) error {
128 in, err := os.Open(src)
129 if err != nil {
130 return err
131 }
132 defer in.Close()
133 out, err := os.Create(dst)
134 if err != nil {
135 return err
136 }
137 defer out.Close()
138 _, err = io.Copy(out, in)
139 return err
140 }