diff options
author | Lukas Fleischer | 2016-05-24 18:15:18 +0200 |
---|---|---|
committer | Jason A. Donenfeld | 2016-07-05 16:14:40 +0200 |
commit | 9984e7ab49c59e49a0d7e62c3435e7133f7a53ec (patch) | |
tree | 1f3a53622746e5fe43e9d5c7c9bc27ab2da22761 /ui-refs.c | |
parent | 1e039ada8554c7e2fc65524827c61613a24256fb (diff) | |
download | cgit-9984e7ab49c59e49a0d7e62c3435e7133f7a53ec.tar.gz cgit-9984e7ab49c59e49a0d7e62c3435e7133f7a53ec.tar.bz2 cgit-9984e7ab49c59e49a0d7e62c3435e7133f7a53ec.zip |
Avoid ambiguities when prettifying snapshot names
When composing snapshot file names for a tag with a prefix of the form
v[0-9] (resp. V[0-9]), the leading "v" (resp. "V") is stripped. This
leads to conflicts if a tag with the stripped name already exists or if
there are tags only differing in the capitalization of the leading "v".
Make sure we do not strip the "v" in these cases.
Reported-by: Juuso Lapinlampi <wub@partyvan.eu>
Signed-off-by: Lukas Fleischer <lfleischer@lfos.de>
Diffstat (limited to 'ui-refs.c')
-rw-r--r-- | ui-refs.c | 24 |
1 files changed, 9 insertions, 15 deletions
@@ -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 | ||