summaryrefslogtreecommitdiffabout
authorStefan Bühler <lighttpd@stbuehler.de>2009-08-16 17:35:18 (UTC)
committer Lars Hjemli <hjemli@gmail.com>2009-08-16 18:53:20 (UTC)
commit1bbe04c2c09d5dfbb2c66c4f8f490008b6e5fb25 (patch) (unidiff)
tree2f5eff9d46e490de0c6baddbd3c232935f47f534
parentff0ff807a3e03ade0fe04557e33593a3b32d9ab9 (diff)
downloadcgit-1bbe04c2c09d5dfbb2c66c4f8f490008b6e5fb25.zip
cgit-1bbe04c2c09d5dfbb2c66c4f8f490008b6e5fb25.tar.gz
cgit-1bbe04c2c09d5dfbb2c66c4f8f490008b6e5fb25.tar.bz2
ui-refs.c: improve handling of lightweight tags
When a lightweight tag is referencing a commit object, cgit now uses the commit date when comparing tag age. Also, the commitdate and author info is printed in the refs view, making lightweight tags appear similar to annotated tags. Signed-off-by: Stefan Bühler <lighttpd@stbuehler.de> Signed-off-by: Lars Hjemli <hjemli@gmail.com>
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--ui-refs.c19
1 files changed, 18 insertions, 1 deletions
diff --git a/ui-refs.c b/ui-refs.c
index 25da00a..d3b4f6e 100644
--- a/ui-refs.c
+++ b/ui-refs.c
@@ -1,98 +1,109 @@
1/* ui-refs.c: browse symbolic refs 1/* ui-refs.c: browse symbolic refs
2 * 2 *
3 * Copyright (C) 2006 Lars Hjemli 3 * Copyright (C) 2006 Lars Hjemli
4 * 4 *
5 * Licensed under GNU General Public License v2 5 * Licensed under GNU General Public License v2
6 * (see COPYING for full license text) 6 * (see COPYING for full license text)
7 */ 7 */
8 8
9#include "cgit.h" 9#include "cgit.h"
10#include "html.h" 10#include "html.h"
11#include "ui-shared.h" 11#include "ui-shared.h"
12 12
13static int header; 13static int header;
14 14
15static int cmp_age(int age1, int age2) 15static int cmp_age(int age1, int age2)
16{ 16{
17 if (age1 != 0 && age2 != 0) 17 if (age1 != 0 && age2 != 0)
18 return age2 - age1; 18 return age2 - age1;
19 19
20 if (age1 == 0 && age2 == 0) 20 if (age1 == 0 && age2 == 0)
21 return 0; 21 return 0;
22 22
23 if (age1 == 0) 23 if (age1 == 0)
24 return +1; 24 return +1;
25 25
26 return -1; 26 return -1;
27} 27}
28 28
29static int cmp_ref_name(const void *a, const void *b) 29static int cmp_ref_name(const void *a, const void *b)
30{ 30{
31 struct refinfo *r1 = *(struct refinfo **)a; 31 struct refinfo *r1 = *(struct refinfo **)a;
32 struct refinfo *r2 = *(struct refinfo **)b; 32 struct refinfo *r2 = *(struct refinfo **)b;
33 33
34 return strcmp(r1->refname, r2->refname); 34 return strcmp(r1->refname, r2->refname);
35} 35}
36 36
37static int cmp_branch_age(const void *a, const void *b) 37static int cmp_branch_age(const void *a, const void *b)
38{ 38{
39 struct refinfo *r1 = *(struct refinfo **)a; 39 struct refinfo *r1 = *(struct refinfo **)a;
40 struct refinfo *r2 = *(struct refinfo **)b; 40 struct refinfo *r2 = *(struct refinfo **)b;
41 41
42 return cmp_age(r1->commit->committer_date, r2->commit->committer_date); 42 return cmp_age(r1->commit->committer_date, r2->commit->committer_date);
43} 43}
44 44
45static int cmp_tag_age(const void *a, const void *b) 45static int cmp_tag_age(const void *a, const void *b)
46{ 46{
47 struct refinfo *r1 = *(struct refinfo **)a; 47 struct refinfo *r1 = *(struct refinfo **)a;
48 struct refinfo *r2 = *(struct refinfo **)b; 48 struct refinfo *r2 = *(struct refinfo **)b;
49 int r1date, r2date;
49 50
50 return cmp_age(r1->tag->tagger_date, r2->tag->tagger_date); 51 if (r1->object->type != OBJ_COMMIT)
52 r1date = r1->tag->tagger_date;
53 else
54 r1date = r1->commit->committer_date;
55
56 if (r2->object->type != OBJ_COMMIT)
57 r2date = r2->tag->tagger_date;
58 else
59 r2date = r2->commit->committer_date;
60
61 return cmp_age(r1date, r2date);
51} 62}
52 63
53static int print_branch(struct refinfo *ref) 64static int print_branch(struct refinfo *ref)
54{ 65{
55 struct commitinfo *info = ref->commit; 66 struct commitinfo *info = ref->commit;
56 char *name = (char *)ref->refname; 67 char *name = (char *)ref->refname;
57 68
58 if (!info) 69 if (!info)
59 return 1; 70 return 1;
60 html("<tr><td>"); 71 html("<tr><td>");
61 cgit_log_link(name, NULL, NULL, name, NULL, NULL, 0, NULL, NULL, 72 cgit_log_link(name, NULL, NULL, name, NULL, NULL, 0, NULL, NULL,
62 ctx.qry.showmsg); 73 ctx.qry.showmsg);
63 html("</td><td>"); 74 html("</td><td>");
64 75
65 if (ref->object->type == OBJ_COMMIT) { 76 if (ref->object->type == OBJ_COMMIT) {
66 cgit_commit_link(info->subject, NULL, NULL, name, NULL); 77 cgit_commit_link(info->subject, NULL, NULL, name, NULL);
67 html("</td><td>"); 78 html("</td><td>");
68 html_txt(info->author); 79 html_txt(info->author);
69 html("</td><td colspan='2'>"); 80 html("</td><td colspan='2'>");
70 cgit_print_age(info->commit->date, -1, NULL); 81 cgit_print_age(info->commit->date, -1, NULL);
71 } else { 82 } else {
72 html("</td><td></td><td>"); 83 html("</td><td></td><td>");
73 cgit_object_link(ref->object); 84 cgit_object_link(ref->object);
74 } 85 }
75 html("</td></tr>\n"); 86 html("</td></tr>\n");
76 return 0; 87 return 0;
77} 88}
78 89
79static void print_tag_header() 90static void print_tag_header()
80{ 91{
81 html("<tr class='nohover'><th class='left'>Tag</th>" 92 html("<tr class='nohover'><th class='left'>Tag</th>"
82 "<th class='left'>Download</th>" 93 "<th class='left'>Download</th>"
83 "<th class='left'>Author</th>" 94 "<th class='left'>Author</th>"
84 "<th class='left' colspan='2'>Age</th></tr>\n"); 95 "<th class='left' colspan='2'>Age</th></tr>\n");
85 header = 1; 96 header = 1;
86} 97}
87 98
88static void print_tag_downloads(const struct cgit_repo *repo, const char *ref) 99static void print_tag_downloads(const struct cgit_repo *repo, const char *ref)
89{ 100{
90 const struct cgit_snapshot_format* f; 101 const struct cgit_snapshot_format* f;
91 char *filename; 102 char *filename;
92 const char *basename; 103 const char *basename;
93 104
94 if (!ref || strlen(ref) < 2) 105 if (!ref || strlen(ref) < 2)
95 return; 106 return;
96 107
97 basename = cgit_repobasename(repo->url); 108 basename = cgit_repobasename(repo->url);
98 if (prefixcmp(ref, basename) != 0) { 109 if (prefixcmp(ref, basename) != 0) {
@@ -100,96 +111,102 @@ static void print_tag_downloads(const struct cgit_repo *repo, const char *ref)
100 ref++; 111 ref++;
101 if (isdigit(ref[0])) 112 if (isdigit(ref[0]))
102 ref = xstrdup(fmt("%s-%s", basename, ref)); 113 ref = xstrdup(fmt("%s-%s", basename, ref));
103 } 114 }
104 115
105 for (f = cgit_snapshot_formats; f->suffix; f++) { 116 for (f = cgit_snapshot_formats; f->suffix; f++) {
106 if (!(repo->snapshots & f->bit)) 117 if (!(repo->snapshots & f->bit))
107 continue; 118 continue;
108 filename = fmt("%s%s", ref, f->suffix); 119 filename = fmt("%s%s", ref, f->suffix);
109 cgit_snapshot_link(filename, NULL, NULL, NULL, NULL, filename); 120 cgit_snapshot_link(filename, NULL, NULL, NULL, NULL, filename);
110 html("&nbsp;&nbsp;"); 121 html("&nbsp;&nbsp;");
111 } 122 }
112} 123}
113static int print_tag(struct refinfo *ref) 124static int print_tag(struct refinfo *ref)
114{ 125{
115 struct tag *tag; 126 struct tag *tag;
116 struct taginfo *info; 127 struct taginfo *info;
117 char *name = (char *)ref->refname; 128 char *name = (char *)ref->refname;
118 129
119 if (ref->object->type == OBJ_TAG) { 130 if (ref->object->type == OBJ_TAG) {
120 tag = (struct tag *)ref->object; 131 tag = (struct tag *)ref->object;
121 info = ref->tag; 132 info = ref->tag;
122 if (!tag || !info) 133 if (!tag || !info)
123 return 1; 134 return 1;
124 html("<tr><td>"); 135 html("<tr><td>");
125 cgit_tag_link(name, NULL, NULL, ctx.qry.head, name); 136 cgit_tag_link(name, NULL, NULL, ctx.qry.head, name);
126 html("</td><td>"); 137 html("</td><td>");
127 if (ctx.repo->snapshots && (tag->tagged->type == OBJ_COMMIT)) 138 if (ctx.repo->snapshots && (tag->tagged->type == OBJ_COMMIT))
128 print_tag_downloads(ctx.repo, name); 139 print_tag_downloads(ctx.repo, name);
129 else 140 else
130 cgit_object_link(tag->tagged); 141 cgit_object_link(tag->tagged);
131 html("</td><td>"); 142 html("</td><td>");
132 if (info->tagger) 143 if (info->tagger)
133 html(info->tagger); 144 html(info->tagger);
134 html("</td><td colspan='2'>"); 145 html("</td><td colspan='2'>");
135 if (info->tagger_date > 0) 146 if (info->tagger_date > 0)
136 cgit_print_age(info->tagger_date, -1, NULL); 147 cgit_print_age(info->tagger_date, -1, NULL);
137 html("</td></tr>\n"); 148 html("</td></tr>\n");
138 } else { 149 } else {
139 if (!header) 150 if (!header)
140 print_tag_header(); 151 print_tag_header();
141 html("<tr><td>"); 152 html("<tr><td>");
142 cgit_tag_link(name, NULL, NULL, ctx.qry.head, name); 153 cgit_tag_link(name, NULL, NULL, ctx.qry.head, name);
143 html("</td><td>"); 154 html("</td><td>");
144 if (ctx.repo->snapshots && (ref->object->type == OBJ_COMMIT)) 155 if (ctx.repo->snapshots && (ref->object->type == OBJ_COMMIT))
145 print_tag_downloads(ctx.repo, name); 156 print_tag_downloads(ctx.repo, name);
146 else 157 else
147 cgit_object_link(ref->object); 158 cgit_object_link(ref->object);
159 html("</td><td>");
160 if (ref->object->type == OBJ_COMMIT)
161 html(ref->commit->author);
162 html("</td><td colspan='2'>");
163 if (ref->object->type == OBJ_COMMIT)
164 cgit_print_age(ref->commit->commit->date, -1, NULL);
148 html("</td></tr>\n"); 165 html("</td></tr>\n");
149 } 166 }
150 return 0; 167 return 0;
151} 168}
152 169
153static void print_refs_link(char *path) 170static void print_refs_link(char *path)
154{ 171{
155 html("<tr class='nohover'><td colspan='4'>"); 172 html("<tr class='nohover'><td colspan='4'>");
156 cgit_refs_link("[...]", NULL, NULL, ctx.qry.head, NULL, path); 173 cgit_refs_link("[...]", NULL, NULL, ctx.qry.head, NULL, path);
157 html("</td></tr>"); 174 html("</td></tr>");
158} 175}
159 176
160void cgit_print_branches(int maxcount) 177void cgit_print_branches(int maxcount)
161{ 178{
162 struct reflist list; 179 struct reflist list;
163 int i; 180 int i;
164 181
165 html("<tr class='nohover'><th class='left'>Branch</th>" 182 html("<tr class='nohover'><th class='left'>Branch</th>"
166 "<th class='left'>Commit message</th>" 183 "<th class='left'>Commit message</th>"
167 "<th class='left'>Author</th>" 184 "<th class='left'>Author</th>"
168 "<th class='left' colspan='2'>Age</th></tr>\n"); 185 "<th class='left' colspan='2'>Age</th></tr>\n");
169 186
170 list.refs = NULL; 187 list.refs = NULL;
171 list.alloc = list.count = 0; 188 list.alloc = list.count = 0;
172 for_each_branch_ref(cgit_refs_cb, &list); 189 for_each_branch_ref(cgit_refs_cb, &list);
173 190
174 if (maxcount == 0 || maxcount > list.count) 191 if (maxcount == 0 || maxcount > list.count)
175 maxcount = list.count; 192 maxcount = list.count;
176 193
177 if (maxcount < list.count) { 194 if (maxcount < list.count) {
178 qsort(list.refs, list.count, sizeof(*list.refs), cmp_branch_age); 195 qsort(list.refs, list.count, sizeof(*list.refs), cmp_branch_age);
179 qsort(list.refs, maxcount, sizeof(*list.refs), cmp_ref_name); 196 qsort(list.refs, maxcount, sizeof(*list.refs), cmp_ref_name);
180 } 197 }
181 198
182 for(i=0; i<maxcount; i++) 199 for(i=0; i<maxcount; i++)
183 print_branch(list.refs[i]); 200 print_branch(list.refs[i]);
184 201
185 if (maxcount < list.count) 202 if (maxcount < list.count)
186 print_refs_link("heads"); 203 print_refs_link("heads");
187} 204}
188 205
189void cgit_print_tags(int maxcount) 206void cgit_print_tags(int maxcount)
190{ 207{
191 struct reflist list; 208 struct reflist list;
192 int i; 209 int i;
193 210
194 header = 0; 211 header = 0;
195 list.refs = NULL; 212 list.refs = NULL;