diff options
-rw-r--r-- | ui-refs.c | 24 | ||||
-rw-r--r-- | ui-shared.c | 26 | ||||
-rw-r--r-- | ui-shared.h | 2 |
3 files changed, 32 insertions, 20 deletions
diff --git a/ui-refs.c b/ui-refs.c index 5b4530e..75f2789 100644 --- a/ui-refs.c +++ b/ui-refs.c | |||
@@ -93,34 +93,28 @@ static void print_tag_header(void) | |||
93 | static void print_tag_downloads(const struct cgit_repo *repo, const char *ref) | 93 | static void print_tag_downloads(const struct cgit_repo *repo, const char *ref) |
94 | { | 94 | { |
95 | const struct cgit_snapshot_format* f; | 95 | const struct cgit_snapshot_format* f; |
96 | struct strbuf filename = STRBUF_INIT; | ||
97 | const char *basename; | 96 | const char *basename; |
98 | int free_ref = 0; | 97 | struct strbuf filename = STRBUF_INIT; |
98 | size_t prefixlen; | ||
99 | 99 | ||
100 | if (!ref || strlen(ref) < 1) | 100 | if (!ref || strlen(ref) < 1) |
101 | return; | 101 | return; |
102 | 102 | ||
103 | basename = cgit_repobasename(repo->url); | 103 | basename = cgit_repobasename(repo->url); |
104 | if (!starts_with(ref, basename)) { | 104 | if (starts_with(ref, basename)) |
105 | if ((ref[0] == 'v' || ref[0] == 'V') && isdigit(ref[1])) | 105 | strbuf_addstr(&filename, ref); |
106 | ref++; | 106 | else |
107 | if (isdigit(ref[0])) { | 107 | cgit_compose_snapshot_prefix(&filename, basename, ref); |
108 | ref = fmtalloc("%s-%s", basename, ref); | 108 | prefixlen = filename.len; |
109 | free_ref = 1; | ||
110 | } | ||
111 | } | ||
112 | |||
113 | for (f = cgit_snapshot_formats; f->suffix; f++) { | 109 | for (f = cgit_snapshot_formats; f->suffix; f++) { |
114 | if (!(repo->snapshots & f->bit)) | 110 | if (!(repo->snapshots & f->bit)) |
115 | continue; | 111 | continue; |
116 | strbuf_reset(&filename); | 112 | strbuf_setlen(&filename, prefixlen); |
117 | strbuf_addf(&filename, "%s%s", ref, f->suffix); | 113 | strbuf_addstr(&filename, f->suffix); |
118 | cgit_snapshot_link(filename.buf, NULL, NULL, NULL, NULL, filename.buf); | 114 | cgit_snapshot_link(filename.buf, NULL, NULL, NULL, NULL, filename.buf); |
119 | html(" "); | 115 | html(" "); |
120 | } | 116 | } |
121 | 117 | ||
122 | if (free_ref) | ||
123 | free((char *)ref); | ||
124 | strbuf_release(&filename); | 118 | strbuf_release(&filename); |
125 | } | 119 | } |
126 | 120 | ||
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)) |
diff --git a/ui-shared.h b/ui-shared.h index b457c97..87799f1 100644 --- a/ui-shared.h +++ b/ui-shared.h | |||
@@ -71,6 +71,8 @@ __attribute__((format (printf,3,4))) | |||
71 | extern void cgit_print_error_page(int code, const char *msg, const char *fmt, ...); | 71 | extern void cgit_print_error_page(int code, const char *msg, const char *fmt, ...); |
72 | extern void cgit_print_pageheader(void); | 72 | extern void cgit_print_pageheader(void); |
73 | extern void cgit_print_filemode(unsigned short mode); | 73 | extern void cgit_print_filemode(unsigned short mode); |
74 | extern void cgit_compose_snapshot_prefix(struct strbuf *filename, | ||
75 | const char *base, const char *ref); | ||
74 | extern void cgit_print_snapshot_links(const char *repo, const char *head, | 76 | extern void cgit_print_snapshot_links(const char *repo, const char *head, |
75 | const char *hex, int snapshots); | 77 | const char *hex, int snapshots); |
76 | extern void cgit_add_hidden_formfields(int incl_head, int incl_search, | 78 | extern void cgit_add_hidden_formfields(int incl_head, int incl_search, |