| 566 | }; |
| 567 | |
| 568 | static int find_tree_entry(struct repository *r, struct tree_desc *t, |
| 569 | const char *name, struct object_id *result, |
| 570 | unsigned short *mode) |
| 571 | { |
| 572 | int namelen = strlen(name); |
| 573 | while (t->size) { |
| 574 | const char *entry; |
| 575 | struct object_id oid; |
| 576 | int entrylen, cmp; |
| 577 | |
| 578 | oidcpy(&oid, tree_entry_extract(t, &entry, mode)); |
| 579 | entrylen = tree_entry_len(&t->entry); |
| 580 | update_tree_entry(t); |
| 581 | if (entrylen > namelen) |
| 582 | continue; |
| 583 | cmp = memcmp(name, entry, entrylen); |
| 584 | if (cmp > 0) |
| 585 | continue; |
| 586 | if (cmp < 0) |
| 587 | break; |
| 588 | if (entrylen == namelen) { |
| 589 | oidcpy(result, &oid); |
| 590 | return 0; |
| 591 | } |
| 592 | if (name[entrylen] != '/') |
| 593 | continue; |
| 594 | if (!S_ISDIR(*mode)) |
| 595 | break; |
| 596 | if (++entrylen == namelen) { |
| 597 | oidcpy(result, &oid); |
| 598 | return 0; |
| 599 | } |
| 600 | return get_tree_entry(r, &oid, name + entrylen, result, mode); |
| 601 | } |
| 602 | return -1; |
| 603 | } |
| 604 | |
| 605 | int get_tree_entry(struct repository *r, |
| 606 | const struct object_id *tree_oid, |
no test coverage detected