summaryrefslogtreecommitdiff
path: root/cmd/install/utils.go
diff options
context:
space:
mode:
authorEyal Posener <[email protected]>2017-05-13 11:03:22 +0300
committerEyal Posener <[email protected]>2017-05-13 11:06:15 +0300
commit3776c7286e833a6e77db93979c7c1fd01ec8d5fd (patch)
tree9cc5ed9f3c11220631d24cde877d4b94fc6e11dc /cmd/install/utils.go
parentc7377ba2de5df7097776c07f1ca68ca0fc8ee90e (diff)
cmd/install: add support for zsh
Fixes: #9
Diffstat (limited to 'cmd/install/utils.go')
-rw-r--r--cmd/install/utils.go118
1 files changed, 118 insertions, 0 deletions
diff --git a/cmd/install/utils.go b/cmd/install/utils.go
new file mode 100644
index 0000000..2c8b44c
--- /dev/null
+++ b/cmd/install/utils.go
@@ -0,0 +1,118 @@
+package install
+
+import (
+ "bufio"
+ "fmt"
+ "io"
+ "io/ioutil"
+ "os"
+)
+
+func lineInFile(name string, lookFor string) bool {
+ f, err := os.Open(name)
+ if err != nil {
+ return false
+ }
+ defer f.Close()
+ r := bufio.NewReader(f)
+ prefix := []byte{}
+ for {
+ line, isPrefix, err := r.ReadLine()
+ if err == io.EOF {
+ return false
+ }
+ if err != nil {
+ return false
+ }
+ if isPrefix {
+ prefix = append(prefix, line...)
+ continue
+ }
+ line = append(prefix, line...)
+ if string(line) == lookFor {
+ return true
+ }
+ prefix = prefix[:0]
+ }
+}
+
+func appendToFile(name string, content string) error {
+ f, err := os.OpenFile(name, os.O_RDWR|os.O_APPEND, 0)
+ if err != nil {
+ return err
+ }
+ defer f.Close()
+ _, err = f.WriteString(fmt.Sprintf("\n%s\n", content))
+ return err
+}
+
+func removeFromFile(name string, content string) error {
+ backup := name + ".bck"
+ err := copyFile(name, backup)
+ if err != nil {
+ return err
+ }
+ temp, err := removeContentToTempFile(name, content)
+ if err != nil {
+ return err
+ }
+
+ err = copyFile(temp, name)
+ if err != nil {
+ return err
+ }
+
+ return os.Remove(backup)
+}
+
+func removeContentToTempFile(name, content string) (string, error) {
+ rf, err := os.Open(name)
+ if err != nil {
+ return "", err
+ }
+ defer rf.Close()
+ wf, err := ioutil.TempFile("/tmp", "complete-")
+ if err != nil {
+ return "", err
+ }
+ defer wf.Close()
+
+ r := bufio.NewReader(rf)
+ prefix := []byte{}
+ for {
+ line, isPrefix, err := r.ReadLine()
+ if err == io.EOF {
+ break
+ }
+ if err != nil {
+ return "", err
+ }
+ if isPrefix {
+ prefix = append(prefix, line...)
+ continue
+ }
+ line = append(prefix, line...)
+ str := string(line)
+ if str == content {
+ continue
+ }
+ wf.WriteString(str + "\n")
+ prefix = prefix[:0]
+ }
+ return wf.Name(), nil
+}
+
+func copyFile(src string, dst string) error {
+ in, err := os.Open(src)
+ if err != nil {
+ return err
+ }
+ defer in.Close()
+ out, err := os.Create(dst)
+ if err != nil {
+ return err
+ }
+ defer out.Close()
+ _, err = io.Copy(out, in)
+ return err
+}