in pkg/fix_git_ignore.go [26:80]
func (g *GitIgnoreFix) Apply() error {
fs := FsFactory()
gitIgnoreFile := ".gitignore"
exist, err := afero.Exists(fs, gitIgnoreFile)
if err != nil {
return fmt.Errorf("error on checking existing gitignore: %+v, fix.%s.%s, %s", err, g.BlockType(), g.Name(), g.HclBlock().Range().String())
}
if !exist {
err := afero.WriteFile(fs, gitIgnoreFile, []byte{}, 0600)
if err != nil {
return fmt.Errorf("error on ensuring gitignore: %+v, fix.%s.%s, %s", err, g.BlockType(), g.Name(), g.HclBlock().Range().String())
}
}
f, err := fs.Open(gitIgnoreFile)
if err != nil {
return fmt.Errorf("error on reading gitignore: %+v, fix.%s.%s, %s", err, g.BlockType(), g.Name(), g.HclBlock().Range().String())
}
linq.From(g.NotExist).Select(g.trimLineAny).ToSlice(&g.NotExist)
linq.From(g.Exist).Select(g.trimLineAny).ToSlice(&g.Exist)
notAllowed := hashset.New()
for _, i := range g.NotExist {
notAllowed.Add(i)
}
sb := strings.Builder{}
scanner := bufio.NewScanner(f)
existed := hashset.New()
for scanner.Scan() {
line := scanner.Text()
raw := line
line = g.trimLine(line)
existed.Add(line)
if notAllowed.Contains(line) {
continue
}
sb.WriteString(raw)
sb.WriteString("\n")
}
err = f.Close()
if err != nil {
return fmt.Errorf("error on closing gitignore: %+v, fix.%s.%s, %s", err, g.BlockType(), g.Name(), g.HclBlock().Range().String())
}
for _, item := range g.Exist {
if !existed.Contains(item) {
sb.WriteString(item)
sb.WriteString("\n")
}
}
err = afero.WriteFile(fs, gitIgnoreFile, []byte(sb.String()), 0600)
if err != nil {
return fmt.Errorf("error on writing gitignore: %+v, fix.%s.%s, %s", err, g.BlockType(), g.Name(), g.HclBlock().Range().String())
}
return nil
}