@@ -444,6 +444,60 @@ func TestFastWalk_DirEntryType(t *testing.T) {
444
444
})
445
445
}
446
446
447
+ func TestFastWalk_DirEntryStat (t * testing.T ) {
448
+ testFastWalk (t , map [string ]string {
449
+ "foo/foo.go" : "one" ,
450
+ "bar/bar.go" : "LINK:../foo/foo.go" ,
451
+ "symdir" : "LINK:foo" ,
452
+ },
453
+ func (path string , d fs.DirEntry , err error ) error {
454
+ requireNoError (t , err )
455
+ de := d .(fastwalk.DirEntry )
456
+ if _ , ok := de .(fastwalk.DirEntry ); ! ok {
457
+ t .Errorf ("%q: not a fastwalk.DirEntry: %T" , path , de )
458
+ }
459
+ ls1 , err := os .Lstat (path )
460
+ if err != nil {
461
+ t .Error (err )
462
+ }
463
+ ls2 , err := de .Info ()
464
+ if err != nil {
465
+ t .Error (err )
466
+ }
467
+ if ! os .SameFile (ls1 , ls2 ) {
468
+ t .Errorf ("Info(%q) = %v; want: %v" , path , ls2 , ls1 )
469
+ }
470
+ st1 , err := os .Stat (path )
471
+ if err != nil {
472
+ t .Error (err )
473
+ }
474
+ st2 , err := de .Stat ()
475
+ if err != nil {
476
+ t .Error (err )
477
+ }
478
+ if ! os .SameFile (st1 , st2 ) {
479
+ t .Errorf ("Stat(%q) = %v; want: %v" , path , st2 , st1 )
480
+ }
481
+ if de .Name () != filepath .Base (path ) {
482
+ t .Errorf ("Name() = %q; want: %q" , de .Name (), filepath .Base (path ))
483
+ }
484
+ if de .Type () != de .Type ().Type () {
485
+ t .Errorf ("%s: type mismatch got: %q want: %q" ,
486
+ path , de .Type (), de .Type ().Type ())
487
+ }
488
+ return nil
489
+ },
490
+ map [string ]os.FileMode {
491
+ "" : os .ModeDir ,
492
+ "/src" : os .ModeDir ,
493
+ "/src/bar" : os .ModeDir ,
494
+ "/src/bar/bar.go" : os .ModeSymlink ,
495
+ "/src/foo" : os .ModeDir ,
496
+ "/src/foo/foo.go" : 0 ,
497
+ "/src/symdir" : os .ModeSymlink ,
498
+ })
499
+ }
500
+
447
501
func TestFastWalk_SkipDir (t * testing.T ) {
448
502
test := func (t * testing.T , mode fastwalk.SortMode ) {
449
503
conf := fastwalk .DefaultConfig .Copy ()
@@ -485,6 +539,28 @@ func TestFastWalk_SkipDir(t *testing.T) {
485
539
}
486
540
}
487
541
542
+ // Test that returning SkipDir for the root directory aborts the walk
543
+ func TestFastWalk_SkipDir_Root (t * testing.T ) {
544
+ want := map [string ]os.FileMode {
545
+ "" : os .ModeDir ,
546
+ }
547
+ conf := fastwalk .DefaultConfig .Copy ()
548
+ conf .Sort = fastwalk .SortLexical // Needed for ordering
549
+ testFastWalkConf (t , conf , map [string ]string {
550
+ "a.go" : "a" ,
551
+ "b.go" : "b" ,
552
+ },
553
+ func (path string , de fs.DirEntry , err error ) error {
554
+ requireNoError (t , err )
555
+ return fastwalk .SkipDir
556
+ },
557
+ want )
558
+ if len (want ) != 1 {
559
+ t .Errorf ("invalid number of files visited: wanted 1, got %v (%q)" ,
560
+ len (want ), want )
561
+ }
562
+ }
563
+
488
564
func TestFastWalk_SkipFiles (t * testing.T ) {
489
565
mapKeys := func (m map [string ]os.FileMode ) []string {
490
566
a := make ([]string , 0 , len (m ))
@@ -542,6 +618,117 @@ func TestFastWalk_SkipFiles(t *testing.T) {
542
618
}
543
619
}
544
620
621
+ func TestFastWalk_SkipAll (t * testing.T ) {
622
+ mapKeys := func (m map [string ]os.FileMode ) []string {
623
+ a := make ([]string , 0 , len (m ))
624
+ for k := range m {
625
+ a = append (a , k )
626
+ }
627
+ return a
628
+ }
629
+
630
+ t .Run ("Root" , func (t * testing.T ) {
631
+ want := map [string ]os.FileMode {
632
+ "" : os .ModeDir ,
633
+ }
634
+ conf := fastwalk .DefaultConfig .Copy ()
635
+ conf .Sort = fastwalk .SortLexical // Needed for ordering
636
+ testFastWalkConf (t , conf , map [string ]string {
637
+ "a.go" : "a" ,
638
+ "b.go" : "b" ,
639
+ },
640
+ func (path string , de fs.DirEntry , err error ) error {
641
+ requireNoError (t , err )
642
+ return fastwalk .SkipAll
643
+ },
644
+ want )
645
+ if len (want ) != 1 {
646
+ t .Errorf ("invalid number of files visited: wanted 1, got %v (%q)" ,
647
+ len (want ), mapKeys (want ))
648
+ }
649
+ })
650
+
651
+ t .Run ("File" , func (t * testing.T ) {
652
+ want := map [string ]os.FileMode {
653
+ "" : os .ModeDir ,
654
+ "/src" : os .ModeDir ,
655
+ "/src/a.go" : 0 ,
656
+ }
657
+ conf := fastwalk .DefaultConfig .Copy ()
658
+ conf .Sort = fastwalk .SortLexical // Needed for ordering
659
+ testFastWalkConf (t , conf , map [string ]string {
660
+ "a.go" : "a" ,
661
+ "b.go" : "b" ,
662
+ },
663
+ func (path string , de fs.DirEntry , err error ) error {
664
+ requireNoError (t , err )
665
+ if de .Name () == "a.go" {
666
+ return fastwalk .SkipAll
667
+ }
668
+ return nil
669
+ },
670
+ want )
671
+ if len (want ) != 3 {
672
+ t .Errorf ("invalid number of files visited: wanted 3, got %v (%q)" ,
673
+ len (want ), mapKeys (want ))
674
+ }
675
+ })
676
+
677
+ t .Run ("Directory" , func (t * testing.T ) {
678
+ want := map [string ]os.FileMode {
679
+ "" : os .ModeDir ,
680
+ "/src" : os .ModeDir ,
681
+ "/src/dir1" : os .ModeDir ,
682
+ }
683
+ conf := fastwalk .DefaultConfig .Copy ()
684
+ conf .Sort = fastwalk .SortDirsFirst // Needed for ordering
685
+ testFastWalkConf (t , conf , map [string ]string {
686
+ "dir1/a.go" : "a" ,
687
+ "dir2/a.go" : "a" ,
688
+ },
689
+ func (path string , de fs.DirEntry , err error ) error {
690
+ requireNoError (t , err )
691
+ if de .Name () == "dir1" {
692
+ return fastwalk .SkipAll
693
+ }
694
+ return nil
695
+ },
696
+ want )
697
+ if len (want ) != 3 {
698
+ t .Errorf ("invalid number of files visited: wanted 3, got %v (%q)" ,
699
+ len (want ), mapKeys (want ))
700
+ }
701
+ })
702
+
703
+ t .Run ("Symlink" , func (t * testing.T ) {
704
+ want := map [string ]os.FileMode {
705
+ "" : os .ModeDir ,
706
+ "/src" : os .ModeDir ,
707
+ "/src/a.go" : 0 ,
708
+ "/src/symdir" : os .ModeSymlink ,
709
+ }
710
+ conf := fastwalk .DefaultConfig .Copy ()
711
+ conf .Sort = fastwalk .SortFilesFirst // Needed for ordering
712
+ testFastWalkConf (t , conf , map [string ]string {
713
+ "a.go" : "a" ,
714
+ "foo/foo.go" : "one" ,
715
+ "symdir" : "LINK:foo" ,
716
+ },
717
+ func (path string , de fs.DirEntry , err error ) error {
718
+ requireNoError (t , err )
719
+ if de .Type ()& fs .ModeSymlink != 0 {
720
+ return fastwalk .SkipAll
721
+ }
722
+ return nil
723
+ },
724
+ want )
725
+ if len (want ) != 4 {
726
+ t .Errorf ("invalid number of files visited: wanted 4, got %v (%q)" ,
727
+ len (want ), mapKeys (want ))
728
+ }
729
+ })
730
+ }
731
+
545
732
func TestFastWalk_TraverseSymlink (t * testing.T ) {
546
733
testFastWalk (t , map [string ]string {
547
734
"foo/foo.go" : "one" ,
0 commit comments