@@ -255,7 +255,7 @@ fn no_packed_available_thus_no_iteration_possible() -> crate::Result {
255
255
#[ test]
256
256
fn packed_file_iter ( ) -> crate :: Result {
257
257
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 ) ;
259
259
Ok ( ( ) )
260
260
}
261
261
@@ -264,7 +264,7 @@ fn loose_iter_with_broken_refs() -> crate::Result {
264
264
let store = store ( ) ?;
265
265
266
266
let mut actual: Vec < _ > = store. loose_iter ( ) ?. collect ( ) ;
267
- assert_eq ! ( actual. len( ) , 19 ) ;
267
+ assert_eq ! ( actual. len( ) , 18 ) ;
268
268
actual. sort_by_key ( Result :: is_err) ;
269
269
let first_error = actual
270
270
. iter ( )
@@ -273,7 +273,7 @@ fn loose_iter_with_broken_refs() -> crate::Result {
273
273
. expect ( "there is an error" ) ;
274
274
275
275
assert_eq ! (
276
- first_error, 18 ,
276
+ first_error, 17 ,
277
277
"there is exactly one invalid item, and it didn't abort the iterator most importantly"
278
278
) ;
279
279
#[ cfg( not( windows) ) ]
@@ -293,18 +293,17 @@ fn loose_iter_with_broken_refs() -> crate::Result {
293
293
ref_paths,
294
294
vec![
295
295
"d1" ,
296
- "heads-loose" ,
297
296
"heads/A" ,
298
297
"heads/d1" ,
299
298
"heads/dt1" ,
300
299
"heads/main" ,
301
300
"heads/multi-link-target1" ,
302
- "heads/sub/dir/loose" ,
303
301
"loop-a" ,
304
302
"loop-b" ,
305
303
"multi-link" ,
304
+ "prefix/feature-suffix" ,
305
+ "prefix/feature/sub/dir/algo" ,
306
306
"remotes/origin/HEAD" ,
307
- "remotes/origin/heads" ,
308
307
"remotes/origin/main" ,
309
308
"remotes/origin/multi-link-target3" ,
310
309
"tags/dt1" ,
@@ -355,7 +354,6 @@ fn loose_iter_with_prefix() -> crate::Result {
355
354
"refs/heads/dt1" ,
356
355
"refs/heads/main" ,
357
356
"refs/heads/multi-link-target1" ,
358
- "refs/heads/sub/dir/loose" ,
359
357
]
360
358
. into_iter( )
361
359
. map( String :: from)
@@ -381,13 +379,11 @@ fn loose_iter_with_partial_prefix_dir() -> crate::Result {
381
379
assert_eq ! (
382
380
actual,
383
381
vec![
384
- "refs/heads-loose" ,
385
382
"refs/heads/A" ,
386
383
"refs/heads/d1" ,
387
384
"refs/heads/dt1" ,
388
385
"refs/heads/main" ,
389
386
"refs/heads/multi-link-target1" ,
390
- "refs/heads/sub/dir/loose" ,
391
387
]
392
388
. into_iter( )
393
389
. map( String :: from)
@@ -435,14 +431,11 @@ fn overlay_iter() -> crate::Result {
435
431
assert_eq ! (
436
432
ref_names,
437
433
vec![
438
- ( "refs/heads-packed" . into( ) , Symbolic ( "refs/heads/main" . try_into( ) ?) , ) ,
439
434
( b"refs/heads/A" . as_bstr( ) . to_owned( ) , Object ( c1) ) ,
440
435
( b"refs/heads/main" . into( ) , Object ( c1) ) ,
441
436
( "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) ) ,
446
439
(
447
440
"refs/remotes/origin/HEAD" . into( ) ,
448
441
Symbolic ( "refs/remotes/origin/main" . try_into( ) ?) ,
@@ -558,7 +551,6 @@ fn overlay_iter_with_prefix_wont_allow_absolute_paths() -> crate::Result {
558
551
559
552
#[ test]
560
553
fn overlay_prefixed_iter ( ) -> crate :: Result {
561
- // Test 'refs/heads/' with slash.
562
554
use gix_ref:: Target :: * ;
563
555
564
556
let store = store_at ( "make_packed_ref_repository_for_overlay.sh" ) ?;
@@ -575,58 +567,74 @@ fn overlay_prefixed_iter() -> crate::Result {
575
567
( b"refs/heads/A" . as_bstr( ) . to_owned( ) , Object ( c1) ) ,
576
568
( b"refs/heads/main" . into( ) , Object ( c1) ) ,
577
569
( "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
- ) ,
582
570
]
583
571
) ;
584
572
Ok ( ( ) )
585
573
}
586
574
587
575
#[ test]
588
- fn overlay_partial_prefix_dir_iter ( ) -> crate :: Result {
589
- // Test 'refs/heads/' without slash.
576
+ fn overlay_partial_prefix_iter ( ) -> crate :: Result {
590
577
use gix_ref:: Target :: * ;
591
578
592
579
let store = store_at ( "make_packed_ref_repository_for_overlay.sh" ) ?;
593
580
let ref_names = store
594
581
. iter ( ) ?
595
- . prefixed ( b"refs/heads" . as_bstr ( ) . into ( ) ) ?
582
+ . prefixed ( b"refs/heads/m " . as_bstr ( ) . into ( ) ) ? // 'm' is partial
596
583
. map ( |r| r. map ( |r| ( r. name . as_bstr ( ) . to_owned ( ) , r. target ) ) )
597
584
. collect :: < Result < Vec < _ > , _ > > ( ) ?;
598
585
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) ) , ] ) ;
616
587
Ok ( ( ) )
617
588
}
618
589
619
590
#[ 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 {
621
593
use gix_ref:: Target :: * ;
622
594
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
+
624
598
let ref_names = store
625
599
. iter ( ) ?
626
- . prefixed ( b"refs/heads/m " . as_bstr ( ) . into ( ) ) ? // 'm' is partial
600
+ . prefixed ( b"refs/d " . as_bstr ( ) . into ( ) ) ?
627
601
. map ( |r| r. map ( |r| ( r. name . as_bstr ( ) . to_owned ( ) , r. target ) ) )
628
602
. 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" ) ?;
629
614
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
+
631
639
Ok ( ( ) )
632
640
}
0 commit comments