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/gitignore_test.go b/internal/fingerprint/gitignore_test.go index 507b34e8c2..8c511ac264 100644 --- a/internal/fingerprint/gitignore_test.go +++ b/internal/fingerprint/gitignore_test.go @@ -65,6 +65,16 @@ func TestGlobsWithGitignore(t *testing.T) { assert.Equal(t, 2, txtCount, "both .txt files should remain") } +func TestGlobsWithSingleQuoteInDirectory(t *testing.T) { + dir := filepath.Join(t.TempDir(), "task's directory") + require.NoError(t, os.Mkdir(dir, 0o755)) + require.NoError(t, os.WriteFile(filepath.Join(dir, "input.txt"), []byte("input"), 0o644)) + + files, err := Globs(dir, []*ast.Glob{{Glob: "input.txt"}}, false) + require.NoError(t, err) + assert.Equal(t, []string{filepath.ToSlash(filepath.Join(dir, "input.txt"))}, files) +} + func TestGlobsWithGitignoreParentDirIgnored(t *testing.T) { t.Parallel()