diff options
Diffstat (limited to 'ui-shared.c')
-rw-r--r-- | ui-shared.c | 26 |
1 files changed, 21 insertions, 5 deletions
diff --git a/ui-shared.c b/ui-shared.c index 562fa0e..b1a6c46 100644 --- a/ui-shared.c +++ b/ui-shared.c | |||
@@ -1069,18 +1069,34 @@ void cgit_print_filemode(unsigned short mode) | |||
1069 | html_fileperm(mode); | 1069 | html_fileperm(mode); |
1070 | } | 1070 | } |
1071 | 1071 | ||
1072 | void cgit_compose_snapshot_prefix(struct strbuf *filename, const char *base, | ||
1073 | const char *ref) | ||
1074 | { | ||
1075 | unsigned char sha1[20]; | ||
1076 | |||
1077 | /* | ||
1078 | * Prettify snapshot names by stripping leading "v" or "V" if the tag | ||
1079 | * name starts with {v,V}[0-9] and the prettify mapping is injective, | ||
1080 | * i.e. each stripped tag can be inverted without ambiguities. | ||
1081 | */ | ||
1082 | if (get_sha1(fmt("refs/tags/%s", ref), sha1) == 0 && | ||
1083 | (ref[0] == 'v' || ref[0] == 'V') && isdigit(ref[1]) && | ||
1084 | ((get_sha1(fmt("refs/tags/%s", ref + 1), sha1) == 0) + | ||
1085 | (get_sha1(fmt("refs/tags/v%s", ref + 1), sha1) == 0) + | ||
1086 | (get_sha1(fmt("refs/tags/V%s", ref + 1), sha1) == 0) == 1)) | ||
1087 | ref++; | ||
1088 | |||
1089 | strbuf_addf(filename, "%s-%s", base, ref); | ||
1090 | } | ||
1091 | |||
1072 | void cgit_print_snapshot_links(const char *repo, const char *head, | 1092 | void cgit_print_snapshot_links(const char *repo, const char *head, |
1073 | const char *hex, int snapshots) | 1093 | const char *hex, int snapshots) |
1074 | { | 1094 | { |
1075 | const struct cgit_snapshot_format* f; | 1095 | const struct cgit_snapshot_format* f; |
1076 | struct strbuf filename = STRBUF_INIT; | 1096 | struct strbuf filename = STRBUF_INIT; |
1077 | size_t prefixlen; | 1097 | size_t prefixlen; |
1078 | unsigned char sha1[20]; | ||
1079 | 1098 | ||
1080 | if (get_sha1(fmt("refs/tags/%s", hex), sha1) == 0 && | 1099 | cgit_compose_snapshot_prefix(&filename, cgit_repobasename(repo), hex); |
1081 | (hex[0] == 'v' || hex[0] == 'V') && isdigit(hex[1])) | ||
1082 | hex++; | ||
1083 | strbuf_addf(&filename, "%s-%s", cgit_repobasename(repo), hex); | ||
1084 | prefixlen = filename.len; | 1100 | prefixlen = filename.len; |
1085 | for (f = cgit_snapshot_formats; f->suffix; f++) { | 1101 | for (f = cgit_snapshot_formats; f->suffix; f++) { |
1086 | if (!(snapshots & f->bit)) | 1102 | if (!(snapshots & f->bit)) |