diff options
| author | Eyal Posener <[email protected]> | 2017-05-13 11:10:46 +0300 |
|---|---|---|
| committer | GitHub <[email protected]> | 2017-05-13 11:10:46 +0300 |
| commit | 758253551ecf81fc5fb107ef8bdad2745d3525fb (patch) | |
| tree | 49ef787eeb6071d84adb7c8f35051d474351f11f /cmd/install/utils.go | |
| parent | cc2d0e6974a8644191666e9e1e466b06c8bd6cde (diff) | |
| parent | 87f385425a98490ad44c01e33d16e6a4324696f0 (diff) | |
Merge pull request #18 from posener/zsh
zsh support
Diffstat (limited to 'cmd/install/utils.go')
| -rw-r--r-- | cmd/install/utils.go | 118 |
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 +} |
