| 432 | } |
| 433 | |
| 434 | int traverse_trees(struct index_state *istate, |
| 435 | int n, struct tree_desc *t, |
| 436 | struct traverse_info *info) |
| 437 | { |
| 438 | int ret = 0; |
| 439 | struct name_entry *entry; |
| 440 | int i; |
| 441 | struct tree_desc_x *tx; |
| 442 | struct strbuf base = STRBUF_INIT; |
| 443 | int interesting = 1; |
| 444 | char *traverse_path; |
| 445 | struct repository *r = istate ? istate->repo : the_repository; |
| 446 | |
| 447 | if (traverse_trees_cur_depth > r->settings.max_allowed_tree_depth) |
| 448 | return error("exceeded maximum allowed tree depth"); |
| 449 | |
| 450 | traverse_trees_count++; |
| 451 | traverse_trees_cur_depth++; |
| 452 | |
| 453 | if (traverse_trees_cur_depth > traverse_trees_max_depth) |
| 454 | traverse_trees_max_depth = traverse_trees_cur_depth; |
| 455 | |
| 456 | ALLOC_ARRAY(entry, n); |
| 457 | ALLOC_ARRAY(tx, n); |
| 458 | |
| 459 | for (i = 0; i < n; i++) { |
| 460 | tx[i].d = t[i]; |
| 461 | tx[i].skip = NULL; |
| 462 | } |
| 463 | |
| 464 | if (info->prev) { |
| 465 | strbuf_make_traverse_path(&base, info->prev, |
| 466 | info->name, info->namelen); |
| 467 | strbuf_addch(&base, '/'); |
| 468 | traverse_path = xstrndup(base.buf, base.len); |
| 469 | } else { |
| 470 | traverse_path = xstrndup(info->name, info->pathlen); |
| 471 | } |
| 472 | info->traverse_path = traverse_path; |
| 473 | for (;;) { |
| 474 | int trees_used; |
| 475 | unsigned long mask, dirmask; |
| 476 | const char *first = NULL; |
| 477 | int first_len = 0; |
| 478 | struct name_entry *e = NULL; |
| 479 | int len; |
| 480 | |
| 481 | for (i = 0; i < n; i++) { |
| 482 | e = entry + i; |
| 483 | extended_entry_extract(tx + i, e, NULL, 0); |
| 484 | } |
| 485 | |
| 486 | /* |
| 487 | * A tree may have "t-2" at the current location even |
| 488 | * though it may have "t" that is a subtree behind it, |
| 489 | * and another tree may return "t". We want to grab |
| 490 | * all "t" from all trees to match in such a case. |
| 491 | */ |
no test coverage detected