about summary refs log tree commit diff stats
path: root/ui-refs.c
diff options
context:
space:
mode:
authorLukas Fleischer2016-05-24 18:15:18 +0200
committerJason A. Donenfeld2016-07-05 16:14:40 +0200
commit9984e7ab49c59e49a0d7e62c3435e7133f7a53ec (patch)
tree1f3a53622746e5fe43e9d5c7c9bc27ab2da22761 /ui-refs.c
parentgit: update to v2.9.0 (diff)
downloadcgit-9984e7ab49c59e49a0d7e62c3435e7133f7a53ec.tar.gz
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.c24
1 files changed, 9 insertions, 15 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)
93static void print_tag_downloads(const struct cgit_repo *repo, const char *ref) 93static 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("&nbsp;&nbsp;"); 115 html("&nbsp;&nbsp;");
120 } 116 }
121 117
122 if (free_ref)
123 free((char *)ref);
124 strbuf_release(&filename); 118 strbuf_release(&filename);
125} 119}
126 120