func listFiles()

in pkg/header/check.go [56:126]


func listFiles(config *ConfigHeader) ([]string, error) {
	var fileList []string

	repo, err := git.PlainOpen("./")

	if err != nil { // we're not in a Git workspace, fallback to glob paths
		var localFileList []string
		for _, pattern := range config.Paths {
			if pattern == "." {
				pattern = "./"
			}
			files, err := doublestar.Glob(pattern)
			if err != nil {
				return nil, err
			}
			localFileList = append(localFileList, files...)
		}

		seen := make(map[string]bool)
		for _, file := range localFileList {
			files, err := walkFile(file, seen)
			if err != nil {
				return nil, err
			}
			fileList = append(fileList, files...)
		}
	} else {
		var candidates []string

		t, _ := repo.Worktree()
		if t.Excludes == nil {
			t.Excludes = make([]gitignore.Pattern, 0)
		}
		addIgnorePatterns(t)
		s, _ := t.Status()
		for file := range s {
			candidates = append(candidates, file)
		}

		head, _ := repo.Head()
		commit, _ := repo.CommitObject(head.Hash())
		tree, err := commit.Tree()
		if err != nil {
			return nil, err
		}
		if err := tree.Files().ForEach(func(file *object.File) error {
			if file == nil {
				return errors.New("file pointer is nil")
			}
			candidates = append(candidates, file.Name)
			return nil
		}); err != nil {
			return nil, err
		}

		seen := make(map[string]bool)
		for _, file := range candidates {
			if !seen[file] {
				seen[file] = true
				_, err := os.Stat(file)
				if err == nil {
					fileList = append(fileList, file)
				} else if !os.IsNotExist(err) {
					return nil, err
				}
			}
		}
	}

	return fileList, nil
}