@@ -397,6 +397,9 @@ impl<'tree> Iterator for TreeIter<'tree> {
397
397
fn size_hint ( & self ) -> ( usize , Option < usize > ) {
398
398
self . range . size_hint ( )
399
399
}
400
+ fn nth ( & mut self , n : usize ) -> Option < TreeEntry < ' tree > > {
401
+ self . range . nth ( n) . and_then ( |i| self . tree . get ( i) )
402
+ }
400
403
}
401
404
impl < ' tree > DoubleEndedIterator for TreeIter < ' tree > {
402
405
fn next_back ( & mut self ) -> Option < TreeEntry < ' tree > > {
@@ -472,20 +475,41 @@ mod tests {
472
475
473
476
let tree = repo. find_tree ( commit. tree_id ( ) ) . unwrap ( ) ;
474
477
assert_eq ! ( tree. id( ) , commit. tree_id( ) ) ;
475
- assert_eq ! ( tree. len( ) , 1 ) ;
478
+ assert_eq ! ( tree. len( ) , 8 ) ;
476
479
477
480
for entry in tree_iter ( & tree, & repo) {
478
481
println ! ( "iter entry {:?}" , entry. name( ) ) ;
479
482
}
480
483
}
481
484
485
+ #[ test]
486
+ fn smoke_tree_nth ( ) {
487
+ let ( td, repo) = crate :: test:: repo_init ( ) ;
488
+
489
+ setup_repo ( & td, & repo) ;
490
+
491
+ let head = repo. head ( ) . unwrap ( ) ;
492
+ let target = head. target ( ) . unwrap ( ) ;
493
+ let commit = repo. find_commit ( target) . unwrap ( ) ;
494
+
495
+ let tree = repo. find_tree ( commit. tree_id ( ) ) . unwrap ( ) ;
496
+ assert_eq ! ( tree. id( ) , commit. tree_id( ) ) ;
497
+ assert_eq ! ( tree. len( ) , 8 ) ;
498
+ let mut it = tree. iter ( ) ;
499
+ let e = it. nth ( 4 ) . unwrap ( ) ;
500
+ assert_eq ! ( e. name( ) , Some ( "f4" ) ) ;
501
+ }
502
+
482
503
fn setup_repo ( td : & TempDir , repo : & Repository ) {
483
504
let mut index = repo. index ( ) . unwrap ( ) ;
484
- File :: create ( & td. path ( ) . join ( "foo" ) )
485
- . unwrap ( )
486
- . write_all ( b"foo" )
487
- . unwrap ( ) ;
488
- index. add_path ( Path :: new ( "foo" ) ) . unwrap ( ) ;
505
+ for n in 0 ..8 {
506
+ let name = format ! ( "f{n}" ) ;
507
+ File :: create ( & td. path ( ) . join ( & name) )
508
+ . unwrap ( )
509
+ . write_all ( name. as_bytes ( ) )
510
+ . unwrap ( ) ;
511
+ index. add_path ( Path :: new ( & name) ) . unwrap ( ) ;
512
+ }
489
513
let id = index. write_tree ( ) . unwrap ( ) ;
490
514
let sig = repo. signature ( ) . unwrap ( ) ;
491
515
let tree = repo. find_tree ( id) . unwrap ( ) ;
@@ -515,14 +539,22 @@ mod tests {
515
539
516
540
let tree = repo. find_tree ( commit. tree_id ( ) ) . unwrap ( ) ;
517
541
assert_eq ! ( tree. id( ) , commit. tree_id( ) ) ;
518
- assert_eq ! ( tree. len( ) , 1 ) ;
542
+ assert_eq ! ( tree. len( ) , 8 ) ;
519
543
{
520
- let e1 = tree. get ( 0 ) . unwrap ( ) ;
544
+ let e0 = tree. get ( 0 ) . unwrap ( ) ;
545
+ assert ! ( e0 == tree. get_id( e0. id( ) ) . unwrap( ) ) ;
546
+ assert ! ( e0 == tree. get_name( "f0" ) . unwrap( ) ) ;
547
+ assert ! ( e0 == tree. get_name_bytes( b"f0" ) . unwrap( ) ) ;
548
+ assert ! ( e0 == tree. get_path( Path :: new( "f0" ) ) . unwrap( ) ) ;
549
+ assert_eq ! ( e0. name( ) , Some ( "f0" ) ) ;
550
+ e0. to_object ( & repo) . unwrap ( ) ;
551
+
552
+ let e1 = tree. get ( 1 ) . unwrap ( ) ;
521
553
assert ! ( e1 == tree. get_id( e1. id( ) ) . unwrap( ) ) ;
522
- assert ! ( e1 == tree. get_name( "foo " ) . unwrap( ) ) ;
523
- assert ! ( e1 == tree. get_name_bytes( b"foo " ) . unwrap( ) ) ;
524
- assert ! ( e1 == tree. get_path( Path :: new( "foo " ) ) . unwrap( ) ) ;
525
- assert_eq ! ( e1. name( ) , Some ( "foo " ) ) ;
554
+ assert ! ( e1 == tree. get_name( "f1 " ) . unwrap( ) ) ;
555
+ assert ! ( e1 == tree. get_name_bytes( b"f1 " ) . unwrap( ) ) ;
556
+ assert ! ( e1 == tree. get_path( Path :: new( "f1 " ) ) . unwrap( ) ) ;
557
+ assert_eq ! ( e1. name( ) , Some ( "f1 " ) ) ;
526
558
e1. to_object ( & repo) . unwrap ( ) ;
527
559
}
528
560
tree. into_object ( ) ;
@@ -551,20 +583,20 @@ mod tests {
551
583
552
584
let mut ct = 0 ;
553
585
tree. walk ( TreeWalkMode :: PreOrder , |_, entry| {
554
- assert_eq ! ( entry. name( ) , Some ( "foo" ) ) ;
586
+ assert_eq ! ( entry. name( ) , Some ( format! ( "f{ct}" ) . as_str ( ) ) ) ;
555
587
ct += 1 ;
556
588
0
557
589
} )
558
590
. unwrap ( ) ;
559
- assert_eq ! ( ct, 1 ) ;
591
+ assert_eq ! ( ct, 8 ) ;
560
592
561
593
let mut ct = 0 ;
562
594
tree. walk ( TreeWalkMode :: PreOrder , |_, entry| {
563
- assert_eq ! ( entry. name( ) , Some ( "foo" ) ) ;
595
+ assert_eq ! ( entry. name( ) , Some ( format! ( "f{ct}" ) . as_str ( ) ) ) ;
564
596
ct += 1 ;
565
597
TreeWalkResult :: Ok
566
598
} )
567
599
. unwrap ( ) ;
568
- assert_eq ! ( ct, 1 ) ;
600
+ assert_eq ! ( ct, 8 ) ;
569
601
}
570
602
}
0 commit comments