Skip to content

Commit 9f8daf6

Browse files
committed
add a core.autocrlf (filter) test
This for the first time actually runs filters, and it seems to work fine.
1 parent 5b6e5c8 commit 9f8daf6

File tree

4 files changed

+159
-27
lines changed

4 files changed

+159
-27
lines changed

gix-status/tests/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ gix-dir = { path = "../../gix-dir" }
3030
gix-odb = { path = "../../gix-odb" }
3131
gix-hash = { path = "../../gix-hash" }
3232
gix-object = { path = "../../gix-object" }
33-
gix-features = { path = "../../gix-features" }
33+
gix-features = { path = "../../gix-features", features = ["parallel"] }
3434
gix-pathspec = { path = "../../gix-pathspec" }
3535
gix-worktree = { path = "../../gix-worktree" }
3636
filetime = "0.2.15"

gix-status/tests/fixtures/generated-archives/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,4 @@ status_unchanged.tar
22
status_changed.tar
33
symlink_stack.tar
44
status_nonfile.tar
5+
status_unchanged_filter.tar
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
#!/usr/bin/env bash
2+
set -eu -o pipefail
3+
4+
git init -q
5+
6+
touch empty
7+
echo -n "content" >executable
8+
chmod +x executable
9+
10+
mkdir dir
11+
echo "other content" >dir/content
12+
seq 5 >dir/content2
13+
mkdir dir/sub-dir
14+
(cd dir/sub-dir && ln -sf ../content symlink)
15+
16+
git add -A
17+
git update-index --chmod=+x executable # For Windows.
18+
git commit -m "Commit"
19+
20+
git ls-files | xargs rm
21+
22+
git config core.autocrlf true
23+
git checkout -f HEAD

gix-status/tests/status/index_as_worktree.rs

Lines changed: 134 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ use std::sync::{
55

66
use bstr::BStr;
77
use filetime::{set_file_mtime, FileTime};
8+
use gix_filter::eol::AutoCrlf;
89
use gix_index as index;
910
use gix_index::Entry;
1011
use gix_status::index_as_worktree::Context;
@@ -38,31 +39,85 @@ fn fixture(name: &str, expected_status: &[Expectation<'_>]) -> Outcome {
3839
}
3940

4041
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+
)
4252
}
4353

4454
fn fixture_with_index(
4555
name: &str,
4656
prepare_index: impl FnMut(&mut gix_index::State),
4757
expected_status: &[Expectation<'_>],
4858
) -> 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+
)
5069
}
5170

5271
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+
)
5482
}
5583

5684
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+
)
5895
}
5996

6097
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+
)
62108
}
63109

64110
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+
)
66121
}
67122

68123
fn fixture_filtered_detailed(
@@ -72,6 +127,8 @@ fn fixture_filtered_detailed(
72127
expected_status: &[Expectation<'_>],
73128
mut prepare_index: impl FnMut(&mut gix_index::State),
74129
submodule_dirty: bool,
130+
auto_crlf: gix_filter::eol::AutoCrlf,
131+
use_odb: bool,
75132
) -> Outcome {
76133
// This can easily happen in some fixtures, which can cause flakiness. It's time-dependent after all.
77134
fn ignore_racyclean(mut out: Outcome) -> Outcome {
@@ -105,26 +162,53 @@ fn fixture_filtered_detailed(
105162
&index,
106163
index.path_backing(),
107164
);
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+
}
128212
.unwrap();
129213
recorder.records.sort_unstable_by_key(|r| r.relative_path);
130214
assert_eq!(records_to_tuple(recorder.records), expected_status);
@@ -256,6 +340,8 @@ fn replace_dir_with_file() {
256340
],
257341
|_| {},
258342
false,
343+
Default::default(),
344+
false,
259345
);
260346
assert_eq!(
261347
out,
@@ -453,6 +539,28 @@ fn unchanged() {
453539
fixture("status_unchanged", &[]);
454540
}
455541

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+
456564
#[test]
457565
fn refresh() {
458566
let expected_outcome = Outcome {

0 commit comments

Comments
 (0)