github.com/gechr/complete@v0.0.0-20191016221035-401475e3ce1e/cmd/install/utils.go (about)

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