summaryrefslogtreecommitdiffabout
path: root/ui-refs.c
authorLars Hjemli <hjemli@gmail.com>2008-11-29 17:39:41 (UTC)
committer Lars Hjemli <hjemli@gmail.com>2008-11-29 17:39:41 (UTC)
commit0274b57d55a12ed38259757dbfae96b79cfa2e0b (patch) (unidiff)
tree34c7204f88168f791ef48f603bb8ab66e9df523c /ui-refs.c
parent7b5cee65fd9cf31e4f19ce4ff613778cb95512a9 (diff)
downloadcgit-0274b57d55a12ed38259757dbfae96b79cfa2e0b.zip
cgit-0274b57d55a12ed38259757dbfae96b79cfa2e0b.tar.gz
cgit-0274b57d55a12ed38259757dbfae96b79cfa2e0b.tar.bz2
ui-log: add support for showing the full commit message
Some users prefer to see the full message, so to make these users happy the new querystring parameter "showmsg" can be used to print the full commit message per log entry. A link is provided in the log heading to make this function accessible, and all links and forms tries to preserve the users preference. Note: the new link is not displayed on the summary page since the point of the summary page is to be a summary, but it is still obeyed if specified manually. Signed-off-by: Lars Hjemli <hjemli@gmail.com>
Diffstat (limited to 'ui-refs.c') (more/less context) (ignore whitespace changes)
-rw-r--r--ui-refs.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/ui-refs.c b/ui-refs.c
index 32e0429..7eb16d5 100644
--- a/ui-refs.c
+++ b/ui-refs.c
@@ -1,196 +1,197 @@
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 49
50 return cmp_age(r1->tag->tagger_date, r2->tag->tagger_date); 50 return cmp_age(r1->tag->tagger_date, r2->tag->tagger_date);
51} 51}
52 52
53static int print_branch(struct refinfo *ref) 53static int print_branch(struct refinfo *ref)
54{ 54{
55 struct commitinfo *info = ref->commit; 55 struct commitinfo *info = ref->commit;
56 char *name = (char *)ref->refname; 56 char *name = (char *)ref->refname;
57 57
58 if (!info) 58 if (!info)
59 return 1; 59 return 1;
60 html("<tr><td>"); 60 html("<tr><td>");
61 cgit_log_link(name, NULL, NULL, name, NULL, NULL, 0, NULL, NULL); 61 cgit_log_link(name, NULL, NULL, name, NULL, NULL, 0, NULL, NULL,
62 ctx.qry.showmsg);
62 html("</td><td>"); 63 html("</td><td>");
63 64
64 if (ref->object->type == OBJ_COMMIT) { 65 if (ref->object->type == OBJ_COMMIT) {
65 cgit_commit_link(info->subject, NULL, NULL, name, NULL); 66 cgit_commit_link(info->subject, NULL, NULL, name, NULL);
66 html("</td><td>"); 67 html("</td><td>");
67 html_txt(info->author); 68 html_txt(info->author);
68 html("</td><td colspan='2'>"); 69 html("</td><td colspan='2'>");
69 cgit_print_age(info->commit->date, -1, NULL); 70 cgit_print_age(info->commit->date, -1, NULL);
70 } else { 71 } else {
71 html("</td><td></td><td>"); 72 html("</td><td></td><td>");
72 cgit_object_link(ref->object); 73 cgit_object_link(ref->object);
73 } 74 }
74 html("</td></tr>\n"); 75 html("</td></tr>\n");
75 return 0; 76 return 0;
76} 77}
77 78
78static void print_tag_header() 79static void print_tag_header()
79{ 80{
80 html("<tr class='nohover'><th class='left'>Tag</th>" 81 html("<tr class='nohover'><th class='left'>Tag</th>"
81 "<th class='left'>Reference</th>" 82 "<th class='left'>Reference</th>"
82 "<th class='left'>Author</th>" 83 "<th class='left'>Author</th>"
83 "<th class='left' colspan='2'>Age</th></tr>\n"); 84 "<th class='left' colspan='2'>Age</th></tr>\n");
84 header = 1; 85 header = 1;
85} 86}
86 87
87static int print_tag(struct refinfo *ref) 88static int print_tag(struct refinfo *ref)
88{ 89{
89 struct tag *tag; 90 struct tag *tag;
90 struct taginfo *info; 91 struct taginfo *info;
91 char *name = (char *)ref->refname; 92 char *name = (char *)ref->refname;
92 93
93 if (ref->object->type == OBJ_TAG) { 94 if (ref->object->type == OBJ_TAG) {
94 tag = (struct tag *)ref->object; 95 tag = (struct tag *)ref->object;
95 info = ref->tag; 96 info = ref->tag;
96 if (!tag || !info) 97 if (!tag || !info)
97 return 1; 98 return 1;
98 html("<tr><td>"); 99 html("<tr><td>");
99 cgit_tag_link(name, NULL, NULL, ctx.qry.head, name); 100 cgit_tag_link(name, NULL, NULL, ctx.qry.head, name);
100 html("</td><td>"); 101 html("</td><td>");
101 cgit_object_link(tag->tagged); 102 cgit_object_link(tag->tagged);
102 html("</td><td>"); 103 html("</td><td>");
103 if (info->tagger) 104 if (info->tagger)
104 html(info->tagger); 105 html(info->tagger);
105 html("</td><td colspan='2'>"); 106 html("</td><td colspan='2'>");
106 if (info->tagger_date > 0) 107 if (info->tagger_date > 0)
107 cgit_print_age(info->tagger_date, -1, NULL); 108 cgit_print_age(info->tagger_date, -1, NULL);
108 html("</td></tr>\n"); 109 html("</td></tr>\n");
109 } else { 110 } else {
110 if (!header) 111 if (!header)
111 print_tag_header(); 112 print_tag_header();
112 html("<tr><td>"); 113 html("<tr><td>");
113 html_txt(name); 114 html_txt(name);
114 html("</td><td>"); 115 html("</td><td>");
115 cgit_object_link(ref->object); 116 cgit_object_link(ref->object);
116 html("</td></tr>\n"); 117 html("</td></tr>\n");
117 } 118 }
118 return 0; 119 return 0;
119} 120}
120 121
121static void print_refs_link(char *path) 122static void print_refs_link(char *path)
122{ 123{
123 html("<tr class='nohover'><td colspan='4'>"); 124 html("<tr class='nohover'><td colspan='4'>");
124 cgit_refs_link("[...]", NULL, NULL, ctx.qry.head, NULL, path); 125 cgit_refs_link("[...]", NULL, NULL, ctx.qry.head, NULL, path);
125 html("</td></tr>"); 126 html("</td></tr>");
126} 127}
127 128
128void cgit_print_branches(int maxcount) 129void cgit_print_branches(int maxcount)
129{ 130{
130 struct reflist list; 131 struct reflist list;
131 int i; 132 int i;
132 133
133 html("<tr class='nohover'><th class='left'>Branch</th>" 134 html("<tr class='nohover'><th class='left'>Branch</th>"
134 "<th class='left'>Commit message</th>" 135 "<th class='left'>Commit message</th>"
135 "<th class='left'>Author</th>" 136 "<th class='left'>Author</th>"
136 "<th class='left' colspan='2'>Age</th></tr>\n"); 137 "<th class='left' colspan='2'>Age</th></tr>\n");
137 138
138 list.refs = NULL; 139 list.refs = NULL;
139 list.alloc = list.count = 0; 140 list.alloc = list.count = 0;
140 for_each_branch_ref(cgit_refs_cb, &list); 141 for_each_branch_ref(cgit_refs_cb, &list);
141 142
142 if (maxcount == 0 || maxcount > list.count) 143 if (maxcount == 0 || maxcount > list.count)
143 maxcount = list.count; 144 maxcount = list.count;
144 145
145 if (maxcount < list.count) { 146 if (maxcount < list.count) {
146 qsort(list.refs, list.count, sizeof(*list.refs), cmp_branch_age); 147 qsort(list.refs, list.count, sizeof(*list.refs), cmp_branch_age);
147 qsort(list.refs, maxcount, sizeof(*list.refs), cmp_ref_name); 148 qsort(list.refs, maxcount, sizeof(*list.refs), cmp_ref_name);
148 } 149 }
149 150
150 for(i=0; i<maxcount; i++) 151 for(i=0; i<maxcount; i++)
151 print_branch(list.refs[i]); 152 print_branch(list.refs[i]);
152 153
153 if (maxcount < list.count) 154 if (maxcount < list.count)
154 print_refs_link("heads"); 155 print_refs_link("heads");
155} 156}
156 157
157void cgit_print_tags(int maxcount) 158void cgit_print_tags(int maxcount)
158{ 159{
159 struct reflist list; 160 struct reflist list;
160 int i; 161 int i;
161 162
162 header = 0; 163 header = 0;
163 list.refs = NULL; 164 list.refs = NULL;
164 list.alloc = list.count = 0; 165 list.alloc = list.count = 0;
165 for_each_tag_ref(cgit_refs_cb, &list); 166 for_each_tag_ref(cgit_refs_cb, &list);
166 if (list.count == 0) 167 if (list.count == 0)
167 return; 168 return;
168 qsort(list.refs, list.count, sizeof(*list.refs), cmp_tag_age); 169 qsort(list.refs, list.count, sizeof(*list.refs), cmp_tag_age);
169 if (!maxcount) 170 if (!maxcount)
170 maxcount = list.count; 171 maxcount = list.count;
171 else if (maxcount > list.count) 172 else if (maxcount > list.count)
172 maxcount = list.count; 173 maxcount = list.count;
173 print_tag_header(); 174 print_tag_header();
174 for(i=0; i<maxcount; i++) 175 for(i=0; i<maxcount; i++)
175 print_tag(list.refs[i]); 176 print_tag(list.refs[i]);
176 177
177 if (maxcount < list.count) 178 if (maxcount < list.count)
178 print_refs_link("tags"); 179 print_refs_link("tags");
179} 180}
180 181
181void cgit_print_refs() 182void cgit_print_refs()
182{ 183{
183 184
184 html("<table class='list nowrap'>"); 185 html("<table class='list nowrap'>");
185 186
186 if (ctx.qry.path && !strncmp(ctx.qry.path, "heads", 5)) 187 if (ctx.qry.path && !strncmp(ctx.qry.path, "heads", 5))
187 cgit_print_branches(0); 188 cgit_print_branches(0);
188 else if (ctx.qry.path && !strncmp(ctx.qry.path, "tags", 4)) 189 else if (ctx.qry.path && !strncmp(ctx.qry.path, "tags", 4))
189 cgit_print_tags(0); 190 cgit_print_tags(0);
190 else { 191 else {
191 cgit_print_branches(0); 192 cgit_print_branches(0);
192 html("<tr class='nohover'><td colspan='4'>&nbsp;</td></tr>"); 193 html("<tr class='nohover'><td colspan='4'>&nbsp;</td></tr>");
193 cgit_print_tags(0); 194 cgit_print_tags(0);
194 } 195 }
195 html("</table>"); 196 html("</table>");
196} 197}