1package install
2
3import (
4	"bufio"
5	"fmt"
6	"io"
7	"io/ioutil"
8	"os"
9	"path/filepath"
10)
11
12func 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
40func 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
58func 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
68func 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
87func 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		wf.WriteString(str + "\n")
119		prefix = prefix[:0]
120	}
121	return wf.Name(), nil
122}
123
124func copyFile(src string, dst string) error {
125	in, err := os.Open(src)
126	if err != nil {
127		return err
128	}
129	defer in.Close()
130	out, err := os.Create(dst)
131	if err != nil {
132		return err
133	}
134	defer out.Close()
135	_, err = io.Copy(out, in)
136	return err
137}
138