diff --git a/internal/execext/exec.go b/internal/execext/exec.go index a418a2aa11..78e90d9ea2 100644 --- a/internal/execext/exec.go +++ b/internal/execext/exec.go @@ -96,6 +96,7 @@ func escape(s string) string { s = strings.ReplaceAll(s, "&", `\&`) s = strings.ReplaceAll(s, "(", `\(`) s = strings.ReplaceAll(s, ")", `\)`) + s = strings.ReplaceAll(s, "'", `\'`) return s } diff --git a/internal/fingerprint/glob_test.go b/internal/fingerprint/glob_test.go new file mode 100644 index 0000000000..222cd2ca01 --- /dev/null +++ b/internal/fingerprint/glob_test.go @@ -0,0 +1,25 @@ +package fingerprint + +import ( + "os" + "path/filepath" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/go-task/task/v3/taskfile/ast" +) + +func TestGlobsInDirectoryContainingQuote(t *testing.T) { + t.Parallel() + + dir := filepath.Join(t.TempDir(), "test'd") + require.NoError(t, os.Mkdir(dir, 0o755)) + file := filepath.Join(dir, "test.in") + require.NoError(t, os.WriteFile(file, nil, 0o644)) + + files, err := Globs(dir, []*ast.Glob{{Glob: "test.in"}}, false) + + require.NoError(t, err) + require.Equal(t, []string{filepath.ToSlash(file)}, files) +}