func()

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
}