@@ -255,7 +255,7 @@ fn no_packed_available_thus_no_iteration_possible() -> crate::Result {
255255#[ test]
256256fn packed_file_iter ( ) -> crate :: Result {
257257 let store = store_with_packed_refs ( ) ?;
258- assert_eq ! ( store. open_packed_buffer( ) ?. expect( "pack available" ) . iter( ) ?. count( ) , 9 ) ;
258+ assert_eq ! ( store. open_packed_buffer( ) ?. expect( "pack available" ) . iter( ) ?. count( ) , 11 ) ;
259259 Ok ( ( ) )
260260}
261261
@@ -264,7 +264,7 @@ fn loose_iter_with_broken_refs() -> crate::Result {
264264 let store = store ( ) ?;
265265
266266 let mut actual: Vec < _ > = store. loose_iter ( ) ?. collect ( ) ;
267- assert_eq ! ( actual. len( ) , 19 ) ;
267+ assert_eq ! ( actual. len( ) , 18 ) ;
268268 actual. sort_by_key ( Result :: is_err) ;
269269 let first_error = actual
270270 . iter ( )
@@ -273,7 +273,7 @@ fn loose_iter_with_broken_refs() -> crate::Result {
273273 . expect ( "there is an error" ) ;
274274
275275 assert_eq ! (
276- first_error, 18 ,
276+ first_error, 17 ,
277277 "there is exactly one invalid item, and it didn't abort the iterator most importantly"
278278 ) ;
279279 #[ cfg( not( windows) ) ]
@@ -293,18 +293,17 @@ fn loose_iter_with_broken_refs() -> crate::Result {
293293 ref_paths,
294294 vec![
295295 "d1" ,
296- "heads-loose" ,
297296 "heads/A" ,
298297 "heads/d1" ,
299298 "heads/dt1" ,
300299 "heads/main" ,
301300 "heads/multi-link-target1" ,
302- "heads/sub/dir/loose" ,
303301 "loop-a" ,
304302 "loop-b" ,
305303 "multi-link" ,
304+ "prefix/feature-suffix" ,
305+ "prefix/feature/sub/dir/algo" ,
306306 "remotes/origin/HEAD" ,
307- "remotes/origin/heads" ,
308307 "remotes/origin/main" ,
309308 "remotes/origin/multi-link-target3" ,
310309 "tags/dt1" ,
@@ -355,7 +354,6 @@ fn loose_iter_with_prefix() -> crate::Result {
355354 "refs/heads/dt1" ,
356355 "refs/heads/main" ,
357356 "refs/heads/multi-link-target1" ,
358- "refs/heads/sub/dir/loose" ,
359357 ]
360358 . into_iter( )
361359 . map( String :: from)
@@ -381,13 +379,11 @@ fn loose_iter_with_partial_prefix_dir() -> crate::Result {
381379 assert_eq ! (
382380 actual,
383381 vec![
384- "refs/heads-loose" ,
385382 "refs/heads/A" ,
386383 "refs/heads/d1" ,
387384 "refs/heads/dt1" ,
388385 "refs/heads/main" ,
389386 "refs/heads/multi-link-target1" ,
390- "refs/heads/sub/dir/loose" ,
391387 ]
392388 . into_iter( )
393389 . map( String :: from)
@@ -435,14 +431,11 @@ fn overlay_iter() -> crate::Result {
435431 assert_eq ! (
436432 ref_names,
437433 vec![
438- ( "refs/heads-packed" . into( ) , Symbolic ( "refs/heads/main" . try_into( ) ?) , ) ,
439434 ( b"refs/heads/A" . as_bstr( ) . to_owned( ) , Object ( c1) ) ,
440435 ( b"refs/heads/main" . into( ) , Object ( c1) ) ,
441436 ( "refs/heads/newer-as-loose" . into( ) , Object ( c2) ) ,
442- (
443- "refs/heads/sub/dir/packed" . into( ) ,
444- Symbolic ( "refs/heads/main" . try_into( ) ?) ,
445- ) ,
437+ ( "refs/prefix/feature-suffix" . into( ) , Object ( c1) ) ,
438+ ( "refs/prefix/feature/sub/dir/algo" . into( ) , Object ( c1) ) ,
446439 (
447440 "refs/remotes/origin/HEAD" . into( ) ,
448441 Symbolic ( "refs/remotes/origin/main" . try_into( ) ?) ,
@@ -558,7 +551,6 @@ fn overlay_iter_with_prefix_wont_allow_absolute_paths() -> crate::Result {
558551
559552#[ test]
560553fn overlay_prefixed_iter ( ) -> crate :: Result {
561- // Test 'refs/heads/' with slash.
562554 use gix_ref:: Target :: * ;
563555
564556 let store = store_at ( "make_packed_ref_repository_for_overlay.sh" ) ?;
@@ -575,58 +567,74 @@ fn overlay_prefixed_iter() -> crate::Result {
575567 ( b"refs/heads/A" . as_bstr( ) . to_owned( ) , Object ( c1) ) ,
576568 ( b"refs/heads/main" . into( ) , Object ( c1) ) ,
577569 ( "refs/heads/newer-as-loose" . into( ) , Object ( c2) ) ,
578- (
579- b"refs/heads/sub/dir/packed" . into( ) ,
580- Symbolic ( "refs/heads/main" . try_into( ) ?)
581- ) ,
582570 ]
583571 ) ;
584572 Ok ( ( ) )
585573}
586574
587575#[ test]
588- fn overlay_partial_prefix_dir_iter ( ) -> crate :: Result {
589- // Test 'refs/heads/' without slash.
576+ fn overlay_partial_prefix_iter ( ) -> crate :: Result {
590577 use gix_ref:: Target :: * ;
591578
592579 let store = store_at ( "make_packed_ref_repository_for_overlay.sh" ) ?;
593580 let ref_names = store
594581 . iter ( ) ?
595- . prefixed ( b"refs/heads" . as_bstr ( ) . into ( ) ) ?
582+ . prefixed ( b"refs/heads/m " . as_bstr ( ) . into ( ) ) ? // 'm' is partial
596583 . map ( |r| r. map ( |r| ( r. name . as_bstr ( ) . to_owned ( ) , r. target ) ) )
597584 . collect :: < Result < Vec < _ > , _ > > ( ) ?;
598585 let c1 = hex_to_id ( "134385f6d781b7e97062102c6a483440bfda2a03" ) ;
599- let c2 = hex_to_id ( "9902e3c3e8f0c569b4ab295ddf473e6de763e1e7" ) ;
600- assert_eq ! (
601- ref_names,
602- vec![
603- (
604- b"refs/heads-packed" . as_bstr( ) . to_owned( ) ,
605- Symbolic ( "refs/heads/main" . try_into( ) ?)
606- ) ,
607- ( b"refs/heads/A" . as_bstr( ) . to_owned( ) , Object ( c1) ) ,
608- ( b"refs/heads/main" . into( ) , Object ( c1) ) ,
609- ( "refs/heads/newer-as-loose" . into( ) , Object ( c2) ) ,
610- (
611- b"refs/heads/sub/dir/packed" . into( ) ,
612- Symbolic ( "refs/heads/main" . try_into( ) ?)
613- ) ,
614- ]
615- ) ;
586+ assert_eq ! ( ref_names, vec![ ( b"refs/heads/main" . as_bstr( ) . to_owned( ) , Object ( c1) ) , ] ) ;
616587 Ok ( ( ) )
617588}
618589
619590#[ test]
620- fn overlay_partial_prefix_iter ( ) -> crate :: Result {
591+ /// The prefix `refs/d` should match `refs/d1` but not `refs/heads/d1`.
592+ fn overlay_partial_prefix_iter_reproduce_1934 ( ) -> crate :: Result {
621593 use gix_ref:: Target :: * ;
622594
623- let store = store_at ( "make_packed_ref_repository_for_overlay.sh" ) ?;
595+ let store = store_at ( "make_ref_repository.sh" ) ?;
596+ let c1 = hex_to_id ( "134385f6d781b7e97062102c6a483440bfda2a03" ) ;
597+
624598 let ref_names = store
625599 . iter ( ) ?
626- . prefixed ( b"refs/heads/m " . as_bstr ( ) . into ( ) ) ? // 'm' is partial
600+ . prefixed ( b"refs/d " . as_bstr ( ) . into ( ) ) ?
627601 . map ( |r| r. map ( |r| ( r. name . as_bstr ( ) . to_owned ( ) , r. target ) ) )
628602 . collect :: < Result < Vec < _ > , _ > > ( ) ?;
603+ // Should not match `refs/heads/d1`.
604+ assert_eq ! ( ref_names, vec![ ( "refs/d1" . into( ) , Object ( c1) ) , ] ) ;
605+ Ok ( ( ) )
606+ }
607+
608+ #[ test]
609+ fn overlay_partial_prefix_iter_when_prefix_is_dir ( ) -> crate :: Result {
610+ // Test 'refs/prefix/' with and without trailing slash.
611+ use gix_ref:: Target :: * ;
612+
613+ let store = store_at ( "make_packed_ref_repository_for_overlay.sh" ) ?;
629614 let c1 = hex_to_id ( "134385f6d781b7e97062102c6a483440bfda2a03" ) ;
630- assert_eq ! ( ref_names, vec![ ( b"refs/heads/main" . as_bstr( ) . to_owned( ) , Object ( c1) ) , ] ) ;
615+
616+ let ref_names = store
617+ . iter ( ) ?
618+ . prefixed ( b"refs/prefix/feature" . as_bstr ( ) . into ( ) ) ?
619+ . map ( |r| r. map ( |r| ( r. name . as_bstr ( ) . to_owned ( ) , r. target ) ) )
620+ . collect :: < Result < Vec < _ > , _ > > ( ) ?;
621+ assert_eq ! (
622+ ref_names,
623+ vec![
624+ ( "refs/prefix/feature-suffix" . into( ) , Object ( c1) ) ,
625+ ( "refs/prefix/feature/sub/dir/algo" . into( ) , Object ( c1) ) ,
626+ ]
627+ ) ;
628+
629+ let ref_names = store
630+ . iter ( ) ?
631+ . prefixed ( b"refs/prefix/feature/" . as_bstr ( ) . into ( ) ) ?
632+ . map ( |r| r. map ( |r| ( r. name . as_bstr ( ) . to_owned ( ) , r. target ) ) )
633+ . collect :: < Result < Vec < _ > , _ > > ( ) ?;
634+ assert_eq ! (
635+ ref_names,
636+ vec![ ( "refs/prefix/feature/sub/dir/algo" . into( ) , Object ( c1) ) , ]
637+ ) ;
638+
631639 Ok ( ( ) )
632640}
0 commit comments