From 9f8ae1c39ac3ccaf5a14e8dd4336db00982579dd Mon Sep 17 00:00:00 2001 From: Lorenz Bauer Date: Mon, 28 Aug 2023 13:17:46 +0100 Subject: [PATCH] pkg/diff: respect global .gitignore (#25) Respect patterns from ~/.gitignore, /etc/gitconfig or core.excludesFile if present. This avoids the "current git tree is dirty" in some circumstances. Fixes #20 Signed-off-by: Lorenz Bauer --- pkg/diff/run.go | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/pkg/diff/run.go b/pkg/diff/run.go index eda4e02..0afc8b9 100644 --- a/pkg/diff/run.go +++ b/pkg/diff/run.go @@ -25,6 +25,7 @@ import ( "github.com/go-git/go-git/v5" "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/format/gitignore" "golang.org/x/exp/apidiff" "golang.org/x/tools/go/packages" @@ -57,6 +58,23 @@ func Run(opts Options) (*Diff, error) { return nil, fmt.Errorf("failed to set worktree filesystem interface: %v", err) } + rootFS, err := osfs.New("/") + if err != nil { + return nil, fmt.Errorf("failed to create root filesystem interface: %v", err) + } + + globalIgnores, err := gitignore.LoadGlobalPatterns(rootFS) + if err != nil { + return nil, fmt.Errorf("failed to load global gitignore: %v", err) + } + wt.Excludes = append(wt.Excludes, globalIgnores...) + + systemIgnores, err := gitignore.LoadSystemPatterns(rootFS) + if err != nil { + return nil, fmt.Errorf("failed to load system gitignore: %v", err) + } + wt.Excludes = append(wt.Excludes, systemIgnores...) + if stat, err := wt.Status(); err != nil { return nil, fmt.Errorf("failed to get git status: %w", err) } else if !stat.IsClean() {