@@ -19,10 +19,10 @@ struct test_entry {
1919
2020static struct test_entry test_entries [] = {
2121 {4 , "Makefile" , 5064 , 0x4C3F7F33 },
22- {62 , "tests/Makefile" , 2631 , 0x4C3F7F33 },
23- {36 , "src/index.c" , 10014 , 0x4C43368D },
2422 {6 , "git.git-authors" , 2709 , 0x4C3F7F33 },
25- {48 , "src/revobject.h" , 1448 , 0x4C3F7FE2 }
23+ {36 , "src/index.c" , 10014 , 0x4C43368D },
24+ {48 , "src/revobject.h" , 1448 , 0x4C3F7FE2 },
25+ {62 , "tests/Makefile" , 2631 , 0x4C3F7F33 }
2626};
2727
2828/* Helpers */
@@ -991,3 +991,90 @@ void test_index_tests__can_lock_index(void)
991991 git_index_free (index );
992992 cl_git_sandbox_cleanup ();
993993}
994+
995+ void test_index_tests__can_iterate (void )
996+ {
997+ git_index * index ;
998+ git_index_iterator * iterator ;
999+ const git_index_entry * entry ;
1000+ size_t i , iterator_idx = 0 , found = 0 ;
1001+ int ret ;
1002+
1003+ cl_git_pass (git_index_open (& index , TEST_INDEX_PATH ));
1004+ cl_git_pass (git_index_iterator_new (& iterator , index ));
1005+
1006+ cl_assert (git_vector_is_sorted (& iterator -> snap ));
1007+
1008+ for (i = 0 ; i < ARRAY_SIZE (test_entries ); i ++ ) {
1009+ /* Advance iterator to next test entry index */
1010+ do {
1011+ ret = git_index_iterator_next (& entry , iterator );
1012+
1013+ if (ret == GIT_ITEROVER )
1014+ cl_fail ("iterator did not contain all test entries" );
1015+
1016+ cl_git_pass (ret );
1017+ } while (iterator_idx ++ < test_entries [i ].index );
1018+
1019+ cl_assert_equal_s (entry -> path , test_entries [i ].path );
1020+ cl_assert_equal_i (entry -> mtime .seconds , test_entries [i ].mtime );
1021+ cl_assert_equal_i (entry -> file_size , test_entries [i ].file_size );
1022+ found ++ ;
1023+ }
1024+
1025+ while ((ret = git_index_iterator_next (& entry , iterator )) == 0 )
1026+ ;
1027+
1028+ if (ret != GIT_ITEROVER )
1029+ cl_git_fail (ret );
1030+
1031+ cl_assert_equal_i (found , ARRAY_SIZE (test_entries ));
1032+
1033+ git_index_iterator_free (iterator );
1034+ git_index_free (index );
1035+ }
1036+
1037+ void test_index_tests__can_modify_while_iterating (void )
1038+ {
1039+ git_index * index ;
1040+ git_index_iterator * iterator ;
1041+ const git_index_entry * entry ;
1042+ git_index_entry new_entry = {{0 }};
1043+ size_t expected = 0 , seen = 0 ;
1044+ int ret ;
1045+
1046+ cl_git_pass (git_index_open (& index , TEST_INDEX_PATH ));
1047+ cl_git_pass (git_index_iterator_new (& iterator , index ));
1048+
1049+ expected = git_index_entrycount (index );
1050+ cl_assert (git_vector_is_sorted (& iterator -> snap ));
1051+
1052+ /*
1053+ * After we've counted the entries, add a new one and change another;
1054+ * ensure that our iterator is backed by a snapshot and thus returns
1055+ * the number of entries from when the iterator was created.
1056+ */
1057+ cl_git_pass (git_oid_fromstr (& new_entry .id , "8312e0a89a9cbab77c732b6bc39b51a783e3a318" ));
1058+ new_entry .path = "newfile" ;
1059+ new_entry .mode = GIT_FILEMODE_BLOB ;
1060+ cl_git_pass (git_index_add (index , & new_entry ));
1061+
1062+ cl_git_pass (git_oid_fromstr (& new_entry .id , "4141414141414141414141414141414141414141" ));
1063+ new_entry .path = "Makefile" ;
1064+ new_entry .mode = GIT_FILEMODE_BLOB ;
1065+ cl_git_pass (git_index_add (index , & new_entry ));
1066+
1067+ while (true) {
1068+ ret = git_index_iterator_next (& entry , iterator );
1069+
1070+ if (ret == GIT_ITEROVER )
1071+ break ;
1072+
1073+ seen ++ ;
1074+ }
1075+
1076+ cl_assert_equal_i (expected , seen );
1077+
1078+ git_index_iterator_free (iterator );
1079+ git_index_free (index );
1080+ }
0 commit comments