diff options
Diffstat (limited to 'ui-blob.c')
| -rw-r--r-- | ui-blob.c | 28 |
1 files changed, 27 insertions, 1 deletions
| @@ -13,7 +13,7 @@ | |||
| 13 | #include "ui-shared.h" | 13 | #include "ui-shared.h" |
| 14 | 14 | ||
| 15 | struct walk_tree_context { | 15 | struct walk_tree_context { |
| 16 | char *match_path; | 16 | const char *match_path; |
| 17 | unsigned char *matched_sha1; | 17 | unsigned char *matched_sha1; |
| 18 | int found_path; | 18 | int found_path; |
| 19 | }; | 19 | }; |
| @@ -31,6 +31,32 @@ static int walk_tree(const unsigned char *sha1, const char *base, int baselen, | |||
| 31 | return 0; | 31 | return 0; |
| 32 | } | 32 | } |
| 33 | 33 | ||
| 34 | int cgit_ref_path_exists(const char *path, const char *ref) | ||
| 35 | { | ||
| 36 | unsigned char sha1[20]; | ||
| 37 | unsigned long size; | ||
| 38 | struct pathspec_item path_items = { | ||
| 39 | .match = path, | ||
| 40 | .len = strlen(path) | ||
| 41 | }; | ||
| 42 | struct pathspec paths = { | ||
| 43 | .nr = 1, | ||
| 44 | .items = &path_items | ||
| 45 | }; | ||
| 46 | struct walk_tree_context walk_tree_ctx = { | ||
| 47 | .match_path = path, | ||
| 48 | .matched_sha1 = sha1, | ||
| 49 | .found_path = 0 | ||
| 50 | }; | ||
| 51 | |||
| 52 | if (get_sha1(ref, sha1)) | ||
| 53 | return 0; | ||
| 54 | if (sha1_object_info(sha1, &size) != OBJ_COMMIT) | ||
| 55 | return 0; | ||
| 56 | read_tree_recursive(lookup_commit_reference(sha1)->tree, "", 0, 0, &paths, walk_tree, &walk_tree_ctx); | ||
| 57 | return walk_tree_ctx.found_path; | ||
| 58 | } | ||
| 59 | |||
| 34 | int cgit_print_file(char *path, const char *head) | 60 | int cgit_print_file(char *path, const char *head) |
| 35 | { | 61 | { |
| 36 | unsigned char sha1[20]; | 62 | unsigned char sha1[20]; |
