mirror of
https://github.com/go-task/task.git
synced 2026-06-30 16:14:19 +00:00
Walk up from task dir to find .git instead of threading rootDir through Globs, checkers, and itemsFromFor. Gitignore rules are discarded if no .git is found, matching ripgrep's require_git behavior. This keeps the Globs signature clean and makes the future .taskignore integration straightforward (loaded at setup like .taskrc, separate boundary).
113 lines
2.9 KiB
Go
113 lines
2.9 KiB
Go
package fingerprint
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
|
|
"github.com/go-task/task/v3/taskfile/ast"
|
|
)
|
|
|
|
func initGitRepo(t *testing.T, dir string) {
|
|
t.Helper()
|
|
require.NoError(t, os.MkdirAll(filepath.Join(dir, ".git"), 0o755))
|
|
}
|
|
|
|
func TestGlobsWithGitignore(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
dir := t.TempDir()
|
|
initGitRepo(t, dir)
|
|
|
|
require.NoError(t, os.WriteFile(filepath.Join(dir, "included.txt"), []byte("included"), 0o644))
|
|
require.NoError(t, os.WriteFile(filepath.Join(dir, "ignored.log"), []byte("ignored"), 0o644))
|
|
require.NoError(t, os.WriteFile(filepath.Join(dir, "also-included.txt"), []byte("also included"), 0o644))
|
|
require.NoError(t, os.WriteFile(filepath.Join(dir, ".gitignore"), []byte("*.log\n"), 0o644))
|
|
|
|
globs := []*ast.Glob{
|
|
{Glob: "./*"},
|
|
}
|
|
|
|
filesWithout, err := Globs(dir, globs, false)
|
|
require.NoError(t, err)
|
|
|
|
filesWith, err := Globs(dir, globs, true)
|
|
require.NoError(t, err)
|
|
|
|
hasLog := false
|
|
for _, f := range filesWithout {
|
|
if filepath.Base(f) == "ignored.log" {
|
|
hasLog = true
|
|
break
|
|
}
|
|
}
|
|
assert.True(t, hasLog, "ignored.log should be present without gitignore filter")
|
|
|
|
hasLog = false
|
|
for _, f := range filesWith {
|
|
if filepath.Base(f) == "ignored.log" {
|
|
hasLog = true
|
|
break
|
|
}
|
|
}
|
|
assert.False(t, hasLog, "ignored.log should be excluded with gitignore filter")
|
|
|
|
txtCount := 0
|
|
for _, f := range filesWith {
|
|
if filepath.Ext(f) == ".txt" {
|
|
txtCount++
|
|
}
|
|
}
|
|
assert.Equal(t, 2, txtCount, "both .txt files should remain")
|
|
}
|
|
|
|
func TestGlobsWithGitignoreNested(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
dir := t.TempDir()
|
|
initGitRepo(t, dir)
|
|
|
|
subDir := filepath.Join(dir, "sub")
|
|
require.NoError(t, os.MkdirAll(subDir, 0o755))
|
|
|
|
require.NoError(t, os.WriteFile(filepath.Join(subDir, "keep.txt"), []byte("keep"), 0o644))
|
|
require.NoError(t, os.WriteFile(filepath.Join(subDir, "build.out"), []byte("build"), 0o644))
|
|
|
|
require.NoError(t, os.WriteFile(filepath.Join(dir, ".gitignore"), []byte("*.log\n"), 0o644))
|
|
require.NoError(t, os.WriteFile(filepath.Join(subDir, ".gitignore"), []byte("*.out\n"), 0o644))
|
|
|
|
globs := []*ast.Glob{
|
|
{Glob: "./*"},
|
|
}
|
|
|
|
files, err := Globs(subDir, globs, true)
|
|
require.NoError(t, err)
|
|
|
|
for _, f := range files {
|
|
assert.NotEqual(t, "build.out", filepath.Base(f), "build.out should be excluded by nested .gitignore")
|
|
}
|
|
}
|
|
|
|
func TestGlobsWithGitignoreNoRepo(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
// Cannot use t.TempDir() here because it creates a dir inside the
|
|
// go-task repo which has a .git parent, defeating the "no repo" test.
|
|
dir, err := os.MkdirTemp("", "task-gitignore-norepo-*") //nolint:usetesting
|
|
require.NoError(t, err)
|
|
t.Cleanup(func() { os.RemoveAll(dir) })
|
|
|
|
require.NoError(t, os.WriteFile(filepath.Join(dir, "file.txt"), []byte("content"), 0o644))
|
|
|
|
globs := []*ast.Glob{
|
|
{Glob: "./*"},
|
|
}
|
|
|
|
files, err := Globs(dir, globs, true)
|
|
require.NoError(t, err)
|
|
assert.Len(t, files, 1)
|
|
}
|