@@ -81,72 +81,89 @@ mod baseline {
8181 }
8282}
8383
84- macro_rules! mktest {
85- ( $name: ident, $case: expr, $number_of_lines: literal) => {
86- #[ test]
87- fn $name( ) {
88- let worktree_path = fixture_path( ) ;
84+ struct Fixture {
85+ worktree_path : PathBuf ,
86+ odb : gix_odb:: Handle ,
87+ resource_cache : gix_diff:: blob:: Platform ,
88+ commits : Vec < Result < gix_traverse:: commit:: Info , gix_traverse:: commit:: simple:: Error > > ,
89+ }
8990
90- use gix_ref:: store:: WriteReflog ;
91+ impl Fixture {
92+ fn new ( ) -> gix_testtools:: Result < Fixture > {
93+ let worktree_path = fixture_path ( ) ;
94+ use gix_ref:: store:: WriteReflog ;
9195
92- let store = gix_ref:: file:: Store :: at(
93- worktree_path. join( ".git" ) ,
94- gix_ref:: store:: init:: Options {
95- write_reflog: WriteReflog :: Disable ,
96- ..Default :: default ( )
97- } ,
98- ) ;
99- let odb = gix_odb:: at( worktree_path. join( ".git/objects" ) ) . unwrap ( ) ;
96+ let store = gix_ref:: file:: Store :: at (
97+ worktree_path. join ( ".git" ) ,
98+ gix_ref:: store:: init:: Options {
99+ write_reflog : WriteReflog :: Disable ,
100+ ..Default :: default ( )
101+ } ,
102+ ) ;
103+ let odb = gix_odb:: at ( worktree_path. join ( ".git/objects" ) ) ? ;
100104
101- let mut reference = gix_ref:: file:: Store :: find( & store, "HEAD" ) . unwrap ( ) ;
105+ let mut reference = gix_ref:: file:: Store :: find ( & store, "HEAD" ) ? ;
102106
103- // Needed for `peel_to_id_in_place`.
104- use gix_ref:: file:: ReferenceExt ;
107+ // Needed for `peel_to_id_in_place`.
108+ use gix_ref:: file:: ReferenceExt ;
105109
106- let head_id = reference. peel_to_id_in_place( & store, & odb) . unwrap ( ) ;
110+ let head_id = reference. peel_to_id_in_place ( & store, & odb) ? ;
107111
108- let mut traverse = gix_traverse:: commit:: Simple :: new( Some ( head_id) , & odb) ;
112+ let commits : Vec < _ > = gix_traverse:: commit:: Simple :: new ( Some ( head_id) , & odb) . collect ( ) ;
109113
110- let git_dir = worktree_path. join( ".git" ) ;
111- let index = gix_index:: File :: at(
112- git_dir. join( "index" ) ,
113- gix_hash:: Kind :: Sha1 ,
114- false ,
115- Default :: default ( ) ,
116- )
117- . unwrap( ) ;
118- let stack = gix_worktree:: Stack :: from_state_and_ignore_case(
119- worktree_path. clone( ) ,
120- false ,
121- gix_worktree:: stack:: State :: AttributesAndIgnoreStack {
122- attributes: Default :: default ( ) ,
123- ignore: Default :: default ( ) ,
114+ let git_dir = worktree_path. join ( ".git" ) ;
115+ let index = gix_index:: File :: at ( git_dir. join ( "index" ) , gix_hash:: Kind :: Sha1 , false , Default :: default ( ) ) ?;
116+ let stack = gix_worktree:: Stack :: from_state_and_ignore_case (
117+ worktree_path. clone ( ) ,
118+ false ,
119+ gix_worktree:: stack:: State :: AttributesAndIgnoreStack {
120+ attributes : Default :: default ( ) ,
121+ ignore : Default :: default ( ) ,
122+ } ,
123+ & index,
124+ index. path_backing ( ) ,
125+ ) ;
126+ let capabilities = gix_fs:: Capabilities :: probe ( & git_dir) ;
127+ let resource_cache = gix_diff:: blob:: Platform :: new (
128+ Default :: default ( ) ,
129+ gix_diff:: blob:: Pipeline :: new (
130+ gix_diff:: blob:: pipeline:: WorktreeRoots {
131+ old_root : None ,
132+ new_root : None ,
133+ } ,
134+ gix_filter:: Pipeline :: new ( Default :: default ( ) , Default :: default ( ) ) ,
135+ vec ! [ ] ,
136+ gix_diff:: blob:: pipeline:: Options {
137+ large_file_threshold_bytes : 0 ,
138+ fs : capabilities,
124139 } ,
125- & index,
126- index. path_backing( ) ,
127- ) ;
128- let capabilities = gix_fs:: Capabilities :: probe( & git_dir) ;
129- let mut resource_cache = gix_diff:: blob:: Platform :: new(
130- Default :: default ( ) ,
131- gix_diff:: blob:: Pipeline :: new(
132- gix_diff:: blob:: pipeline:: WorktreeRoots {
133- old_root: None ,
134- new_root: None ,
135- } ,
136- gix_filter:: Pipeline :: new( Default :: default ( ) , Default :: default ( ) ) ,
137- vec![ ] ,
138- gix_diff:: blob:: pipeline:: Options {
139- large_file_threshold_bytes: 0 ,
140- fs: capabilities,
141- } ,
142- ) ,
143- gix_diff:: blob:: pipeline:: Mode :: ToGit ,
144- stack,
145- ) ;
140+ ) ,
141+ gix_diff:: blob:: pipeline:: Mode :: ToGit ,
142+ stack,
143+ ) ;
144+ Ok ( Fixture {
145+ odb,
146+ worktree_path,
147+ commits,
148+ resource_cache,
149+ } )
150+ }
151+ }
152+
153+ macro_rules! mktest {
154+ ( $name: ident, $case: expr, $number_of_lines: literal) => {
155+ #[ test]
156+ fn $name( ) {
157+ let Fixture {
158+ worktree_path,
159+ odb,
160+ mut resource_cache,
161+ commits,
162+ } = Fixture :: new( ) . unwrap( ) ;
146163
147164 let lines_blamed = blame_file(
148165 & odb,
149- & mut traverse ,
166+ commits ,
150167 & mut resource_cache,
151168 worktree_path,
152169 format!( "{}.txt" , $case) . as_str( ) . into( ) ,
@@ -181,11 +198,36 @@ mktest!(added_line_before_changed_line, "added-line-before-changed-line", 3);
181198mktest ! ( same_line_changed_twice, "same-line-changed-twice" , 2 ) ;
182199mktest ! ( coalesce_adjacent_hunks, "coalesce-adjacent-hunks" , 1 ) ;
183200
201+ #[ test]
202+ #[ ignore = "TBD: figure out what the problem is" ]
184203// As of 2024-09-24, these tests are expected to fail.
185204//
186205// Context: https://github.com/Byron/gitoxide/pull/1453#issuecomment-2371013904
187- mktest ! ( empty_lines_histogram, "empty-lines-histogram" , 5 ) ;
188- mktest ! ( empty_lines_myers, "empty-lines-myers" , 5 ) ;
206+ fn diff_disparity ( ) {
207+ for case in [ "empty-lines-myers" , "empty-lines-histogram" ] {
208+ let Fixture {
209+ worktree_path,
210+ odb,
211+ mut resource_cache,
212+ commits,
213+ } = Fixture :: new ( ) . unwrap ( ) ;
214+ let lines_blamed = blame_file (
215+ & odb,
216+ commits,
217+ & mut resource_cache,
218+ worktree_path,
219+ format ! ( "{case}.txt" ) . as_str ( ) . into ( ) ,
220+ )
221+ . unwrap ( ) ;
222+
223+ assert_eq ! ( lines_blamed. len( ) , 5 ) ;
224+
225+ let git_dir = fixture_path ( ) . join ( ".git" ) ;
226+ let baseline = Baseline :: collect ( git_dir. join ( format ! ( "{case}.baseline" ) ) ) . unwrap ( ) ;
227+
228+ assert_eq ! ( lines_blamed, baseline, "{case}" ) ;
229+ }
230+ }
189231
190232#[ test]
191233fn process_change_works ( ) {
0 commit comments