author | Lars Hjemli <hjemli@gmail.com> | 2008-11-29 17:39:41 (UTC) |
---|---|---|
committer | Lars Hjemli <hjemli@gmail.com> | 2008-11-29 17:39:41 (UTC) |
commit | 0274b57d55a12ed38259757dbfae96b79cfa2e0b (patch) (unidiff) | |
tree | 34c7204f88168f791ef48f603bb8ab66e9df523c /ui-refs.c | |
parent | 7b5cee65fd9cf31e4f19ce4ff613778cb95512a9 (diff) | |
download | cgit-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>
-rw-r--r-- | ui-refs.c | 3 |
1 files changed, 2 insertions, 1 deletions
@@ -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 | ||
13 | static int header; | 13 | static int header; |
14 | 14 | ||
15 | static int cmp_age(int age1, int age2) | 15 | static 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 | ||
29 | static int cmp_ref_name(const void *a, const void *b) | 29 | static 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 | ||
37 | static int cmp_branch_age(const void *a, const void *b) | 37 | static 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 | ||
45 | static int cmp_tag_age(const void *a, const void *b) | 45 | static 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 | ||
53 | static int print_branch(struct refinfo *ref) | 53 | static 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 | ||
78 | static void print_tag_header() | 79 | static 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 | ||
87 | static int print_tag(struct refinfo *ref) | 88 | static 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 | ||
121 | static void print_refs_link(char *path) | 122 | static 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 | ||
128 | void cgit_print_branches(int maxcount) | 129 | void 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 | ||
157 | void cgit_print_tags(int maxcount) | 158 | void 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 | ||
181 | void cgit_print_refs() | 182 | void 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'> </td></tr>"); | 193 | html("<tr class='nohover'><td colspan='4'> </td></tr>"); |
193 | cgit_print_tags(0); | 194 | cgit_print_tags(0); |
194 | } | 195 | } |
195 | html("</table>"); | 196 | html("</table>"); |
196 | } | 197 | } |