diff options
Diffstat (limited to 'ui-blob.c')
| -rw-r--r-- | ui-blob.c | 61 |
1 files changed, 34 insertions, 27 deletions
| @@ -1,7 +1,7 @@ | |||
| 1 | /* ui-blob.c: show blob content | 1 | /* ui-blob.c: show blob content |
| 2 | * | 2 | * |
| 3 | * Copyright (C) 2008 Lars Hjemli | 3 | * Copyright (C) 2008 Lars Hjemli |
| 4 | * Copyright (C) 2010 Jason A. Donenfeld <Jason@zx2c4.com> | 4 | * Copyright (C) 2010-2013 Jason A. Donenfeld <Jason@zx2c4.com> |
| 5 | * | 5 | * |
| 6 | * Licensed under GNU General Public License v2 | 6 | * Licensed under GNU General Public License v2 |
| 7 | * (see COPYING for full license text) | 7 | * (see COPYING for full license text) |
| @@ -15,7 +15,8 @@ | |||
| 15 | struct walk_tree_context { | 15 | struct walk_tree_context { |
| 16 | const 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:1; |
| 19 | int file_only:1; | ||
| 19 | }; | 20 | }; |
| 20 | 21 | ||
| 21 | static int walk_tree(const unsigned char *sha1, const char *base, int baselen, | 22 | static int walk_tree(const unsigned char *sha1, const char *base, int baselen, |
| @@ -23,6 +24,8 @@ static int walk_tree(const unsigned char *sha1, const char *base, int baselen, | |||
| 23 | { | 24 | { |
| 24 | struct walk_tree_context *walk_tree_ctx = cbdata; | 25 | struct walk_tree_context *walk_tree_ctx = cbdata; |
| 25 | 26 | ||
| 27 | if (walk_tree_ctx->file_only && !S_ISREG(mode)) | ||
| 28 | return READ_TREE_RECURSIVE; | ||
| 26 | if (strncmp(base, walk_tree_ctx->match_path, baselen) | 29 | if (strncmp(base, walk_tree_ctx->match_path, baselen) |
| 27 | || strcmp(walk_tree_ctx->match_path + baselen, pathname)) | 30 | || strcmp(walk_tree_ctx->match_path + baselen, pathname)) |
| 28 | return READ_TREE_RECURSIVE; | 31 | return READ_TREE_RECURSIVE; |
| @@ -31,33 +34,34 @@ static int walk_tree(const unsigned char *sha1, const char *base, int baselen, | |||
| 31 | return 0; | 34 | return 0; |
| 32 | } | 35 | } |
| 33 | 36 | ||
| 34 | int cgit_ref_path_exists(const char *path, const char *ref) | 37 | int cgit_ref_path_exists(const char *path, const char *ref, int file_only) |
| 35 | { | 38 | { |
| 36 | unsigned char sha1[20]; | 39 | unsigned char sha1[20]; |
| 37 | unsigned long size; | 40 | unsigned long size; |
| 38 | struct pathspec_item path_items = { | 41 | struct pathspec_item path_items = { |
| 39 | .match = path, | 42 | .match = path, |
| 40 | .len = strlen(path) | 43 | .len = strlen(path) |
| 41 | }; | 44 | }; |
| 42 | struct pathspec paths = { | 45 | struct pathspec paths = { |
| 43 | .nr = 1, | 46 | .nr = 1, |
| 44 | .items = &path_items | 47 | .items = &path_items |
| 45 | }; | 48 | }; |
| 46 | struct walk_tree_context walk_tree_ctx = { | 49 | struct walk_tree_context walk_tree_ctx = { |
| 47 | .match_path = path, | 50 | .match_path = path, |
| 48 | .matched_sha1 = sha1, | 51 | .matched_sha1 = sha1, |
| 49 | .found_path = 0 | 52 | .found_path = 0, |
| 50 | }; | 53 | .file_only = file_only |
| 54 | }; | ||
| 51 | 55 | ||
| 52 | if (get_sha1(ref, sha1)) | 56 | if (get_sha1(ref, sha1)) |
| 53 | return 0; | 57 | return 0; |
| 54 | if (sha1_object_info(sha1, &size) != OBJ_COMMIT) | 58 | if (sha1_object_info(sha1, &size) != OBJ_COMMIT) |
| 55 | return 0; | 59 | return 0; |
| 56 | read_tree_recursive(lookup_commit_reference(sha1)->tree, "", 0, 0, &paths, walk_tree, &walk_tree_ctx); | 60 | read_tree_recursive(lookup_commit_reference(sha1)->tree, "", 0, 0, &paths, walk_tree, &walk_tree_ctx); |
| 57 | return walk_tree_ctx.found_path; | 61 | return walk_tree_ctx.found_path; |
| 58 | } | 62 | } |
| 59 | 63 | ||
| 60 | int cgit_print_file(char *path, const char *head) | 64 | int cgit_print_file(char *path, const char *head, int file_only) |
| 61 | { | 65 | { |
| 62 | unsigned char sha1[20]; | 66 | unsigned char sha1[20]; |
| 63 | enum object_type type; | 67 | enum object_type type; |
| @@ -75,7 +79,8 @@ int cgit_print_file(char *path, const char *head) | |||
| 75 | struct walk_tree_context walk_tree_ctx = { | 79 | struct walk_tree_context walk_tree_ctx = { |
| 76 | .match_path = path, | 80 | .match_path = path, |
| 77 | .matched_sha1 = sha1, | 81 | .matched_sha1 = sha1, |
| 78 | .found_path = 0 | 82 | .found_path = 0, |
| 83 | .file_only = file_only | ||
| 79 | }; | 84 | }; |
| 80 | 85 | ||
| 81 | if (get_sha1(head, sha1)) | 86 | if (get_sha1(head, sha1)) |
| @@ -98,7 +103,7 @@ int cgit_print_file(char *path, const char *head) | |||
| 98 | return 0; | 103 | return 0; |
| 99 | } | 104 | } |
| 100 | 105 | ||
| 101 | void cgit_print_blob(const char *hex, char *path, const char *head) | 106 | void cgit_print_blob(const char *hex, char *path, const char *head, int file_only) |
| 102 | { | 107 | { |
| 103 | unsigned char sha1[20]; | 108 | unsigned char sha1[20]; |
| 104 | enum object_type type; | 109 | enum object_type type; |
| @@ -116,6 +121,8 @@ void cgit_print_blob(const char *hex, char *path, const char *head) | |||
| 116 | struct walk_tree_context walk_tree_ctx = { | 121 | struct walk_tree_context walk_tree_ctx = { |
| 117 | .match_path = path, | 122 | .match_path = path, |
| 118 | .matched_sha1 = sha1, | 123 | .matched_sha1 = sha1, |
| 124 | .found_path = 0, | ||
| 125 | .file_only = file_only | ||
| 119 | }; | 126 | }; |
| 120 | 127 | ||
| 121 | if (hex) { | 128 | if (hex) { |
