github.com/divan/complete@v0.0.0-20170515130636-337e95201af7/cmd/install/utils.go (about) 1 package install 2 3 import ( 4 "bufio" 5 "fmt" 6 "io" 7 "io/ioutil" 8 "os" 9 ) 10 11 func 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 39 func 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 49 func 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 68 func 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 105 func 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 }