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