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  }