@@ -33,13 +33,62 @@ impl<'a> Iterator for IgnoreExpectations<'a> {
33
33
}
34
34
}
35
35
36
+ #[ test]
37
+ fn special_exclude_cases_we_handle_differently ( ) {
38
+ let dir = git_testtools:: scripted_fixture_repo_read_only ( "make_special_exclude_case.sh" ) . unwrap ( ) ;
39
+ let git_dir = dir. join ( ".git" ) ;
40
+
41
+ let mut buf = Vec :: new ( ) ;
42
+ let case = git_glob:: pattern:: Case :: Sensitive ;
43
+ let state = git_worktree:: fs:: cache:: State :: for_add (
44
+ Default :: default ( ) ,
45
+ git_worktree:: fs:: cache:: state:: Ignore :: new (
46
+ Default :: default ( ) ,
47
+ git_attributes:: MatchGroup :: from_git_dir ( & git_dir, None , & mut buf) . unwrap ( ) ,
48
+ None ,
49
+ case,
50
+ ) ,
51
+ ) ;
52
+ let mut cache = fs:: Cache :: new ( & dir, state, case, buf, Default :: default ( ) ) ;
53
+ let baseline = std:: fs:: read ( git_dir. parent ( ) . unwrap ( ) . join ( "git-check-ignore.baseline" ) ) . unwrap ( ) ;
54
+ let expectations = IgnoreExpectations {
55
+ lines : baseline. lines ( ) ,
56
+ } ;
57
+ for ( relative_entry, source_and_line) in expectations {
58
+ let ( source, line, pattern) = source_and_line. expect ( "every value is matched" ) ;
59
+ assert_eq ! (
60
+ pattern, "tld/" ,
61
+ "each entry matches on the main directory exclude, ignoring negations entirely"
62
+ ) ;
63
+ assert_eq ! ( line, 2 ) ;
64
+ assert_eq ! ( source, ".gitignore" ) ;
65
+
66
+ let relative_path = git_path:: from_byte_slice ( relative_entry) ;
67
+ let is_dir = dir. join ( & relative_path) . metadata ( ) . ok ( ) . map ( |m| m. is_dir ( ) ) ;
68
+
69
+ let platform = cache
70
+ . at_entry ( relative_entry, is_dir, |oid, buf| {
71
+ Err ( std:: io:: Error :: new ( std:: io:: ErrorKind :: Other , "unreachable" ) )
72
+ } )
73
+ . unwrap ( ) ;
74
+ let match_ = platform. matching_exclude_pattern ( ) . expect ( "match all values" ) ;
75
+ let is_excluded = platform. is_excluded ( ) ;
76
+
77
+ match relative_entry. as_ref ( ) {
78
+ b"tld" | b"tld/" | b"tld/file" | b"tld/sd" | b"tld/sd/" => {
79
+ assert_eq ! ( match_. pattern. to_string( ) , "tld/" ) ;
80
+ }
81
+ _ => unreachable ! ( ) ,
82
+ }
83
+ }
84
+ }
85
+
36
86
#[ test]
37
87
fn check_against_baseline ( ) -> crate :: Result {
38
88
let dir = git_testtools:: scripted_fixture_repo_read_only ( "make_ignore_and_attributes_setup.sh" ) ?;
39
89
let worktree_dir = dir. join ( "repo" ) ;
40
90
let git_dir = worktree_dir. join ( ".git" ) ;
41
91
let mut buf = Vec :: new ( ) ;
42
- let baseline = std:: fs:: read ( git_dir. parent ( ) . unwrap ( ) . join ( "git-check-ignore.baseline" ) ) ?;
43
92
let user_exclude_path = dir. join ( "user.exclude" ) ;
44
93
assert ! ( user_exclude_path. is_file( ) ) ;
45
94
@@ -66,9 +115,11 @@ fn check_against_baseline() -> crate::Result {
66
115
) ;
67
116
let mut cache = fs:: Cache :: new ( & worktree_dir, state, case, buf, attribute_files_in_index) ;
68
117
69
- for ( relative_entry, source_and_line) in ( IgnoreExpectations {
118
+ let baseline = std:: fs:: read ( git_dir. parent ( ) . unwrap ( ) . join ( "git-check-ignore.baseline" ) ) ?;
119
+ let expectations = IgnoreExpectations {
70
120
lines : baseline. lines ( ) ,
71
- } ) {
121
+ } ;
122
+ for ( relative_entry, source_and_line) in expectations {
72
123
let relative_path = git_path:: from_byte_slice ( relative_entry) ;
73
124
let is_dir = worktree_dir. join ( & relative_path) . metadata ( ) . ok ( ) . map ( |m| m. is_dir ( ) ) ;
74
125
0 commit comments