@@ -1128,14 +1128,14 @@ static int filesystem_iterator_is_submodule(
1128
1128
1129
1129
static void filesystem_iterator_frame_push_ignores (
1130
1130
filesystem_iterator * iter ,
1131
- filesystem_iterator_entry * frame_entry ,
1131
+ filesystem_iterator_frame * previous_frame ,
1132
1132
filesystem_iterator_frame * new_frame )
1133
1133
{
1134
- filesystem_iterator_frame * previous_frame ;
1135
- const char * path = frame_entry ? frame_entry -> path : "" ;
1136
-
1137
- if (! iterator__honor_ignores ( & iter -> base ))
1138
- return ;
1134
+ const char * path = "" ;
1135
+ if ( previous_frame ) {
1136
+ path = filesystem_iterator_current_entry ( previous_frame ) -> path ;
1137
+ assert ( path && * path );
1138
+ }
1139
1139
1140
1140
if (git_ignore__lookup (& new_frame -> is_ignored ,
1141
1141
& iter -> ignores , path , GIT_DIR_FLAG_TRUE ) < 0 ) {
@@ -1144,27 +1144,31 @@ static void filesystem_iterator_frame_push_ignores(
1144
1144
}
1145
1145
1146
1146
/* if this is not the top level directory... */
1147
- if (frame_entry ) {
1147
+ if (previous_frame ) {
1148
1148
const char * relative_path ;
1149
1149
1150
- previous_frame = filesystem_iterator_parent_frame (iter );
1151
-
1152
1150
/* push new ignores for files in this directory */
1153
- relative_path = frame_entry -> path + previous_frame -> path_len ;
1151
+ relative_path = path + previous_frame -> path_len ;
1154
1152
1155
1153
/* inherit ignored from parent if no rule specified */
1156
1154
if (new_frame -> is_ignored <= GIT_IGNORE_NOTFOUND )
1157
1155
new_frame -> is_ignored = previous_frame -> is_ignored ;
1158
1156
1159
1157
git_ignore__push_dir (& iter -> ignores , relative_path );
1160
1158
}
1159
+
1160
+ assert ((size_t )iter -> ignores .depth <= iter -> frames .size );
1161
1161
}
1162
1162
1163
1163
static void filesystem_iterator_frame_pop_ignores (
1164
1164
filesystem_iterator * iter )
1165
1165
{
1166
- if (iterator__honor_ignores (& iter -> base ))
1167
- git_ignore__pop_dir (& iter -> ignores );
1166
+ if (iterator__honor_ignores (& iter -> base )) {
1167
+ assert ((size_t )iter -> ignores .depth <= iter -> frames .size + 1 );
1168
+ if ((size_t )iter -> ignores .depth == iter -> frames .size + 1 ) {
1169
+ git_ignore__pop_dir (& iter -> ignores );
1170
+ }
1171
+ }
1168
1172
}
1169
1173
1170
1174
GIT_INLINE (bool ) filesystem_iterator_examine_path (
@@ -1335,6 +1339,8 @@ static int filesystem_iterator_frame_push(
1335
1339
size_t path_len ;
1336
1340
int error ;
1337
1341
1342
+ assert (!frame_entry == !iter -> frames .size );
1343
+
1338
1344
if (iter -> frames .size == FILESYSTEM_MAX_DEPTH ) {
1339
1345
git_error_set (GIT_ERROR_REPOSITORY ,
1340
1346
"directory nesting too deep (%" PRIuZ ")" , iter -> frames .size );
@@ -1345,6 +1351,7 @@ static int filesystem_iterator_frame_push(
1345
1351
GIT_ERROR_CHECK_ALLOC (new_frame );
1346
1352
1347
1353
memset (new_frame , 0 , sizeof (filesystem_iterator_frame ));
1354
+ new_frame -> is_ignored = GIT_IGNORE_UNCHECKED ;
1348
1355
1349
1356
if (frame_entry )
1350
1357
git_buf_joinpath (& root , iter -> root , frame_entry -> path );
@@ -1373,9 +1380,6 @@ static int filesystem_iterator_frame_push(
1373
1380
1374
1381
git_pool_init (& new_frame -> entry_pool , 1 );
1375
1382
1376
- /* check if this directory is ignored */
1377
- filesystem_iterator_frame_push_ignores (iter , frame_entry , new_frame );
1378
-
1379
1383
while ((error = git_path_diriter_next (& diriter )) == 0 ) {
1380
1384
iterator_pathlist_search_t pathlist_match = ITERATOR_PATHLIST_FULL ;
1381
1385
bool dir_expected = false;
@@ -1693,9 +1697,21 @@ GIT_INLINE(git_dir_flag) entry_dir_flag(git_index_entry *entry)
1693
1697
1694
1698
static void filesystem_iterator_update_ignored (filesystem_iterator * iter )
1695
1699
{
1700
+ size_t i ;
1696
1701
filesystem_iterator_frame * frame ;
1697
1702
git_dir_flag dir_flag = entry_dir_flag (& iter -> entry );
1698
1703
1704
+ for (i = iter -> frames .size ;
1705
+ i && iter -> frames .ptr [i - 1 ].is_ignored == GIT_IGNORE_UNCHECKED ;
1706
+ -- i ) {
1707
+ // empty body
1708
+ }
1709
+
1710
+ for (; i != iter -> frames .size ; ++ i ) {
1711
+ frame = iter -> frames .ptr + i ;
1712
+ filesystem_iterator_frame_push_ignores (iter , i ? frame - 1 : NULL , frame );
1713
+ }
1714
+
1699
1715
if (git_ignore__lookup (& iter -> current_is_ignored ,
1700
1716
& iter -> ignores , iter -> entry .path , dir_flag ) < 0 ) {
1701
1717
git_error_clear ();
0 commit comments