@@ -5,6 +5,7 @@ use std::sync::{
5
5
6
6
use bstr:: BStr ;
7
7
use filetime:: { set_file_mtime, FileTime } ;
8
+ use gix_filter:: eol:: AutoCrlf ;
8
9
use gix_index as index;
9
10
use gix_index:: Entry ;
10
11
use gix_status:: index_as_worktree:: Context ;
@@ -38,31 +39,85 @@ fn fixture(name: &str, expected_status: &[Expectation<'_>]) -> Outcome {
38
39
}
39
40
40
41
fn nonfile_fixture ( name : & str , expected_status : & [ Expectation < ' _ > ] ) -> Outcome {
41
- fixture_filtered_detailed ( "status_nonfile" , name, & [ ] , expected_status, |_| { } , false )
42
+ fixture_filtered_detailed (
43
+ "status_nonfile" ,
44
+ name,
45
+ & [ ] ,
46
+ expected_status,
47
+ |_| { } ,
48
+ false ,
49
+ Default :: default ( ) ,
50
+ false ,
51
+ )
42
52
}
43
53
44
54
fn fixture_with_index (
45
55
name : & str ,
46
56
prepare_index : impl FnMut ( & mut gix_index:: State ) ,
47
57
expected_status : & [ Expectation < ' _ > ] ,
48
58
) -> Outcome {
49
- fixture_filtered_detailed ( name, "" , & [ ] , expected_status, prepare_index, false )
59
+ fixture_filtered_detailed (
60
+ name,
61
+ "" ,
62
+ & [ ] ,
63
+ expected_status,
64
+ prepare_index,
65
+ false ,
66
+ Default :: default ( ) ,
67
+ false ,
68
+ )
50
69
}
51
70
52
71
fn submodule_fixture ( name : & str , expected_status : & [ Expectation < ' _ > ] ) -> Outcome {
53
- fixture_filtered_detailed ( "status_submodule" , name, & [ ] , expected_status, |_| { } , false )
72
+ fixture_filtered_detailed (
73
+ "status_submodule" ,
74
+ name,
75
+ & [ ] ,
76
+ expected_status,
77
+ |_| { } ,
78
+ false ,
79
+ Default :: default ( ) ,
80
+ false ,
81
+ )
54
82
}
55
83
56
84
fn conflict_fixture ( name : & str , expected_status : & [ Expectation < ' _ > ] ) -> Outcome {
57
- fixture_filtered_detailed ( "conflicts" , name, & [ ] , expected_status, |_| { } , false )
85
+ fixture_filtered_detailed (
86
+ "conflicts" ,
87
+ name,
88
+ & [ ] ,
89
+ expected_status,
90
+ |_| { } ,
91
+ false ,
92
+ Default :: default ( ) ,
93
+ false ,
94
+ )
58
95
}
59
96
60
97
fn submodule_fixture_status ( name : & str , expected_status : & [ Expectation < ' _ > ] , submodule_dirty : bool ) -> Outcome {
61
- fixture_filtered_detailed ( "status_submodule" , name, & [ ] , expected_status, |_| { } , submodule_dirty)
98
+ fixture_filtered_detailed (
99
+ "status_submodule" ,
100
+ name,
101
+ & [ ] ,
102
+ expected_status,
103
+ |_| { } ,
104
+ submodule_dirty,
105
+ Default :: default ( ) ,
106
+ false ,
107
+ )
62
108
}
63
109
64
110
fn fixture_filtered ( name : & str , pathspecs : & [ & str ] , expected_status : & [ Expectation < ' _ > ] ) -> Outcome {
65
- fixture_filtered_detailed ( name, "" , pathspecs, expected_status, |_| { } , false )
111
+ fixture_filtered_detailed (
112
+ name,
113
+ "" ,
114
+ pathspecs,
115
+ expected_status,
116
+ |_| { } ,
117
+ false ,
118
+ Default :: default ( ) ,
119
+ false ,
120
+ )
66
121
}
67
122
68
123
fn fixture_filtered_detailed (
@@ -72,6 +127,8 @@ fn fixture_filtered_detailed(
72
127
expected_status : & [ Expectation < ' _ > ] ,
73
128
mut prepare_index : impl FnMut ( & mut gix_index:: State ) ,
74
129
submodule_dirty : bool ,
130
+ auto_crlf : gix_filter:: eol:: AutoCrlf ,
131
+ use_odb : bool ,
75
132
) -> Outcome {
76
133
// This can easily happen in some fixtures, which can cause flakiness. It's time-dependent after all.
77
134
fn ignore_racyclean ( mut out : Outcome ) -> Outcome {
@@ -105,26 +162,53 @@ fn fixture_filtered_detailed(
105
162
& index,
106
163
index. path_backing ( ) ,
107
164
) ;
108
- let outcome = index_as_worktree (
109
- & index,
110
- & worktree,
111
- & mut recorder,
112
- FastEq ,
113
- SubmoduleStatusMock { dirty : submodule_dirty } ,
114
- gix_object:: find:: Never ,
115
- & mut gix_features:: progress:: Discard ,
116
- Context {
117
- pathspec : search,
118
- stack,
119
- filter : Default :: default ( ) ,
120
- should_interrupt : & AtomicBool :: default ( ) ,
121
- } ,
122
- Options {
123
- fs : gix_fs:: Capabilities :: probe ( & git_dir) ,
124
- stat : TEST_OPTIONS ,
125
- ..Options :: default ( )
126
- } ,
127
- )
165
+ let ctx = Context {
166
+ pathspec : search,
167
+ stack,
168
+ filter : gix_filter:: Pipeline :: new (
169
+ Default :: default ( ) ,
170
+ gix_filter:: pipeline:: Options {
171
+ eol_config : gix_filter:: eol:: Configuration {
172
+ auto_crlf,
173
+ ..Default :: default ( )
174
+ } ,
175
+ ..Default :: default ( )
176
+ } ,
177
+ ) ,
178
+ should_interrupt : & AtomicBool :: default ( ) ,
179
+ } ;
180
+ let options = Options {
181
+ fs : gix_fs:: Capabilities :: probe ( & git_dir) ,
182
+ stat : TEST_OPTIONS ,
183
+ ..Options :: default ( )
184
+ } ;
185
+ let outcome = if use_odb {
186
+ let odb = gix_odb:: at ( git_dir. join ( "objects" ) ) . unwrap ( ) . into_arc ( ) . unwrap ( ) ;
187
+ index_as_worktree (
188
+ & index,
189
+ & worktree,
190
+ & mut recorder,
191
+ FastEq ,
192
+ SubmoduleStatusMock { dirty : submodule_dirty } ,
193
+ odb,
194
+ & mut gix_features:: progress:: Discard ,
195
+ ctx,
196
+ options,
197
+ )
198
+ } else {
199
+ let odb = gix_object:: find:: Never ;
200
+ index_as_worktree (
201
+ & index,
202
+ & worktree,
203
+ & mut recorder,
204
+ FastEq ,
205
+ SubmoduleStatusMock { dirty : submodule_dirty } ,
206
+ & odb,
207
+ & mut gix_features:: progress:: Discard ,
208
+ ctx,
209
+ options,
210
+ )
211
+ }
128
212
. unwrap ( ) ;
129
213
recorder. records . sort_unstable_by_key ( |r| r. relative_path ) ;
130
214
assert_eq ! ( records_to_tuple( recorder. records) , expected_status) ;
@@ -256,6 +340,8 @@ fn replace_dir_with_file() {
256
340
] ,
257
341
|_| { } ,
258
342
false ,
343
+ Default :: default ( ) ,
344
+ false ,
259
345
) ;
260
346
assert_eq ! (
261
347
out,
@@ -453,6 +539,28 @@ fn unchanged() {
453
539
fixture ( "status_unchanged" , & [ ] ) ;
454
540
}
455
541
542
+ #[ test]
543
+ fn unchanged_despite_filter ( ) {
544
+ let actual_outcome = fixture_filtered_detailed (
545
+ "status_unchanged_filter" ,
546
+ "" ,
547
+ & [ ] ,
548
+ & [ ] ,
549
+ |_| { } ,
550
+ false ,
551
+ AutoCrlf :: Enabled ,
552
+ true , /* make ODB available */
553
+ ) ;
554
+
555
+ let expected_outcome = Outcome {
556
+ entries_to_process : 5 ,
557
+ entries_processed : 5 ,
558
+ symlink_metadata_calls : 5 ,
559
+ ..Default :: default ( )
560
+ } ;
561
+ assert_eq ! ( actual_outcome, expected_outcome, ) ;
562
+ }
563
+
456
564
#[ test]
457
565
fn refresh ( ) {
458
566
let expected_outcome = Outcome {
0 commit comments