Skip to content

Commit d401f1f

Browse files
authored
Fix gitignore glob behavior introduced in #1234 (#1236)
1 parent 07987af commit d401f1f

File tree

2 files changed

+48
-25
lines changed

2 files changed

+48
-25
lines changed

src/Spago/Glob.purs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ gitignoreGlob base =
4949
( \line -> do
5050
let
5151
resolve a = Path.concat [ base, a ]
52-
pat a = resolve $ unpackPattern a
52+
pat a = withForwardSlashes $ resolve $ unpackPattern a
5353
case String.stripPrefix (String.Pattern "!") line of
5454
Just negated -> Left $ pat negated
5555
Nothing -> Right $ pat line
@@ -78,16 +78,18 @@ fsWalk cwd ignorePatterns includePatterns = Aff.makeAff \cb -> do
7878

7979
-- If this Ref contains `true` because this Aff has been canceled, then deepFilter will always return false.
8080
canceled <- Ref.new false
81+
8182
let
8283
entryGitignore :: Entry -> Effect Unit
8384
entryGitignore entry =
8485
try (SyncFS.readTextFile UTF8 entry.path)
8586
>>= traverse_ \gitignore ->
8687
let
8788
base = Path.relative cwd $ Path.dirname entry.path
88-
pats = splitGlob $ gitignoreGlob base gitignore
89-
patIsOk g = not $ any (testGlob g) includePatterns
90-
newPats = filter (patIsOk) pats
89+
glob = gitignoreGlob base gitignore
90+
pats = splitGlob glob
91+
patOk g = not $ any (testGlob g) includePatterns
92+
newPats = filter patOk pats
9193
in
9294
void $ Ref.modify (_ <> fold newPats) $ ignoreMatcherRef
9395

test/Spago/Glob.purs

Lines changed: 42 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@ module Test.Spago.Glob where
22

33
import Test.Prelude
44

5+
import Data.Array as Array
56
import Data.Foldable (intercalate)
67
import Data.String.Gen (genAlphaLowercaseString)
78
import Effect.Aff as Aff
89
import Node.Path as Path
10+
import Node.Process as Process
911
import Spago.FS as FS
1012
import Spago.Glob as Glob
1113
import Test.QuickCheck.Gen (randomSample', resize)
@@ -29,10 +31,10 @@ globTmpDir m = Aff.bracket make cleanup m
2931
base
3032
dir
3133
"fruits"
32-
[ touch "apple"
33-
, touch "orange"
34-
, touch "banana"
35-
, dir "special"
34+
[ dir "left"
35+
[ touch "apple"
36+
]
37+
, dir "right"
3638
[ touch "apple"
3739
]
3840
]
@@ -48,36 +50,55 @@ globTmpDir m = Aff.bracket make cleanup m
4850
spec :: Spec Unit
4951
spec = Spec.around globTmpDir do
5052
Spec.describe "glob" do
53+
Spec.describe "glob behavior" do
54+
Spec.it "'**/..' matches 0 or more directories" \p -> do
55+
a <- Glob.gitignoringGlob (Path.concat [p, "fruits/left"]) ["**/apple"]
56+
b <- Glob.gitignoringGlob (Path.concat [p, "fruits"]) ["**/apple"]
57+
Array.sort a `Assert.shouldEqual` ["apple"]
58+
Array.sort b `Assert.shouldEqual` ["left/apple", "right/apple"]
59+
60+
Spec.it "'../**/..' matches 0 or more directories" \p -> do
61+
a <- Glob.gitignoringGlob p ["fruits/**/apple"]
62+
Array.sort a `Assert.shouldEqual` ["fruits/left/apple", "fruits/right/apple"]
63+
64+
Spec.it "'../**' matches 0 or more directories" \p -> do
65+
a <- Glob.gitignoringGlob p ["fruits/left/**"]
66+
Array.sort a `Assert.shouldEqual` ["fruits/left", "fruits/left/apple"]
67+
5168
Spec.describe "gitignoringGlob" do
5269
Spec.it "when no .gitignore, yields all matches" \p -> do
5370
a <- Glob.gitignoringGlob p ["**/apple"]
54-
a `Assert.shouldEqual` ["fruits/apple", "fruits/special/apple", "src/fruits/apple"]
71+
Array.sort a `Assert.shouldEqual` ["fruits/left/apple", "fruits/right/apple", "src/fruits/apple"]
5572

5673
Spec.it "respects a .gitignore pattern that doesn't conflict with search" \p -> do
57-
FS.writeTextFile (Path.concat [p, ".gitignore"]) "/fruits"
58-
a <- Glob.gitignoringGlob p ["**/apple"]
59-
a `Assert.shouldEqual` ["src/fruits/apple"]
74+
FS.writeTextFile (Path.concat [p, ".gitignore"]) "fruits/right"
75+
a <- Glob.gitignoringGlob p ["fruits/**/apple"]
76+
Array.sort a `Assert.shouldEqual` ["fruits/left/apple"]
77+
78+
Spec.it "respects some .gitignore patterns" \p -> do
79+
FS.writeTextFile (Path.concat [p, ".gitignore"]) "fruits\nfruits/right"
80+
a <- Glob.gitignoringGlob p ["fruits/**/apple"]
81+
Array.sort a `Assert.shouldEqual` ["fruits/left/apple"]
6082

6183
Spec.it "respects a negated .gitignore pattern" \p -> do
62-
FS.writeTextFile (Path.concat [p, ".gitignore"]) "!/fruits/special/apple\n/fruits/apple"
84+
FS.writeTextFile (Path.concat [p, ".gitignore"]) "!/fruits/left/apple\n/fruits/**/apple"
6385
a <- Glob.gitignoringGlob p ["**/apple"]
64-
a `Assert.shouldEqual` ["fruits/special/apple", "src/fruits/apple"]
86+
Array.sort a `Assert.shouldEqual` ["fruits/left/apple", "src/fruits/apple"]
6587

6688
for_ ["/fruits", "fruits", "fruits/", "**/fruits", "fruits/**", "**/fruits/**"] \gitignore -> do
67-
Spec.focus $ Spec.it
89+
Spec.it
6890
("does not respect a .gitignore pattern that conflicts with search: " <> gitignore)
6991
\p -> do
7092
FS.writeTextFile (Path.concat [p, ".gitignore"]) gitignore
71-
a <- Glob.gitignoringGlob p ["fruits/apple/**"]
72-
a `Assert.shouldEqual` ["fruits/apple"]
73-
74-
Spec.it "respects some .gitignore patterns" \p -> do
75-
FS.writeTextFile (Path.concat [p, ".gitignore"]) """/fruits\n/src"""
76-
a <- Glob.gitignoringGlob p ["fruits/apple/**"]
77-
a `Assert.shouldEqual` ["fruits/apple"]
93+
a <- Glob.gitignoringGlob p ["fruits/**/apple"]
94+
Array.sort a `Assert.shouldEqual` ["fruits/left/apple", "fruits/right/apple"]
7895

7996
Spec.it "is stacksafe" \p -> do
80-
hugeGitignore <- liftEffect $ intercalate "\n" <$> randomSample' 10000 (resize 4 $ genAlphaLowercaseString)
97+
let
98+
chars = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k"]
99+
-- 10,000-line gitignore
100+
words = [\a b c d -> a <> b <> c <> d] <*> chars <*> chars <*> chars <*> chars
101+
hugeGitignore = intercalate "\n" words
81102
FS.writeTextFile (Path.concat [p, ".gitignore"]) hugeGitignore
82-
a <- Glob.gitignoringGlob p ["fruits/apple/**"]
83-
a `Assert.shouldEqual` ["fruits/apple"]
103+
a <- Glob.gitignoringGlob p ["fruits/**/apple"]
104+
Array.sort a `Assert.shouldEqual` ["fruits/left/apple", "fruits/right/apple"]

0 commit comments

Comments
 (0)