blob: 43582da9a5ea92bda2574f0ee8aa457cf231312d [file] [log] [blame]
Lars Hjemli14180342006-12-11 16:55:07 +01001/* ui-summary.c: functions for generating repo summary page
2 *
3 * Copyright (C) 2006 Lars Hjemli
4 *
5 * Licensed under GNU General Public License v2
6 * (see COPYING for full license text)
7 */
8
9#include "cgit.h"
10
Lars Hjemli495e3962007-05-15 00:07:37 +020011static int header;
Lars Hjemli9f48df62007-05-11 23:44:42 +020012
Lars Hjemlief1cc6e2007-10-25 20:33:04 +020013static int cmp_tag_age(void *a, void *b)
14{
15 struct refinfo *r1 = *(struct refinfo **)a;
16 struct refinfo *r2 = *(struct refinfo **)b;
17
18 if (r1->tag->tagger_date != 0 && r2->tag->tagger_date != 0)
19 return r2->tag->tagger_date - r1->tag->tagger_date;
20
21 if (r1->tag->tagger_date == 0 && r2->tag->tagger_date == 0)
22 return 0;
23
24 if (r1 == 0)
25 return +1;
26
27 return -1;
28}
29
Lars Hjemli0c1ebce2007-10-25 10:13:25 +020030static void cgit_print_branch(struct refinfo *ref)
Lars Hjemli14180342006-12-11 16:55:07 +010031{
32 struct commit *commit;
Lars Hjemli148fb962006-12-16 00:33:28 +010033 struct commitinfo *info;
Lars Hjemli0c1ebce2007-10-25 10:13:25 +020034 char *name = (char *)ref->refname;
Lars Hjemli14180342006-12-11 16:55:07 +010035
Lars Hjemli0c1ebce2007-10-25 10:13:25 +020036 commit = lookup_commit(ref->object->sha1);
Ondrej Jirman51a960a2007-05-26 03:33:41 +020037 // object is not really parsed at this point, because of some fallout
38 // from previous calls to git functions in cgit_print_log()
39 commit->object.parsed = 0;
Lars Hjemli14180342006-12-11 16:55:07 +010040 if (commit && !parse_commit(commit)){
Lars Hjemli148fb962006-12-16 00:33:28 +010041 info = cgit_parse_commit(commit);
Lars Hjemli14180342006-12-11 16:55:07 +010042 html("<tr><td>");
Lars Hjemli0c1ebce2007-10-25 10:13:25 +020043 cgit_log_link(name, NULL, NULL, name, NULL, NULL, 0);
Lars Hjemli14180342006-12-11 16:55:07 +010044 html("</td><td>");
Lars Hjemli237ef7b2007-05-22 23:15:36 +020045 cgit_print_age(commit->date, -1, NULL);
Lars Hjemli148fb962006-12-16 00:33:28 +010046 html("</td><td>");
Lars Hjemli23734c52007-01-17 01:10:39 +010047 html_txt(info->author);
48 html("</td><td>");
Lars Hjemli0c1ebce2007-10-25 10:13:25 +020049 cgit_commit_link(info->subject, NULL, NULL, name, NULL);
Lars Hjemli14180342006-12-11 16:55:07 +010050 html("</td></tr>\n");
Lars Hjemliaaa24bd2006-12-16 14:58:20 +010051 cgit_free_commitinfo(info);
Lars Hjemli14180342006-12-11 16:55:07 +010052 } else {
53 html("<tr><td>");
Lars Hjemli0c1ebce2007-10-25 10:13:25 +020054 html_txt(name);
Lars Hjemli23734c52007-01-17 01:10:39 +010055 html("</td><td colspan='3'>");
Lars Hjemli0c1ebce2007-10-25 10:13:25 +020056 htmlf("*** bad ref %s ***", sha1_to_hex(ref->object->sha1));
Lars Hjemli23734c52007-01-17 01:10:39 +010057 html("</td></tr>\n");
58 }
Lars Hjemli23734c52007-01-17 01:10:39 +010059}
60
Lars Hjemli495e3962007-05-15 00:07:37 +020061static void print_tag_header()
62{
63 html("<tr class='nohover'><th class='left'>Tag</th>"
Lars Hjemli237ef7b2007-05-22 23:15:36 +020064 "<th class='left'>Age</th>"
Lars Hjemli495e3962007-05-15 00:07:37 +020065 "<th class='left'>Author</th>"
66 "<th class='left'>Reference</th></tr>\n");
67 header = 1;
68}
69
Lars Hjemli502d7102007-10-25 10:28:15 +020070static int print_tag(struct refinfo *ref)
Lars Hjemli23734c52007-01-17 01:10:39 +010071{
72 struct tag *tag;
73 struct taginfo *info;
Lars Hjemli502d7102007-10-25 10:28:15 +020074 char *url, *name = (char *)ref->refname;
Lars Hjemli9927e632007-05-14 23:58:29 +020075
Lars Hjemli502d7102007-10-25 10:28:15 +020076 if (ref->object->type == OBJ_TAG) {
77 tag = lookup_tag(ref->object->sha1);
Lars Hjemli8fb2f052007-02-04 22:55:19 +010078 if (!tag || parse_tag(tag) || !(info = cgit_parse_tag(tag)))
79 return 2;
Lars Hjemli23734c52007-01-17 01:10:39 +010080 html("<tr><td>");
Lars Hjemli4e9107a2007-07-22 23:42:55 +020081 url = cgit_pageurl(cgit_query_repo, "tag",
Lars Hjemli502d7102007-10-25 10:28:15 +020082 fmt("id=%s", name));
Lars Hjemli23734c52007-01-17 01:10:39 +010083 html_link_open(url, NULL, NULL);
Lars Hjemli502d7102007-10-25 10:28:15 +020084 html_txt(name);
Lars Hjemli23734c52007-01-17 01:10:39 +010085 html_link_close();
Lars Hjemli14180342006-12-11 16:55:07 +010086 html("</td><td>");
Lars Hjemli23734c52007-01-17 01:10:39 +010087 if (info->tagger_date > 0)
Lars Hjemli237ef7b2007-05-22 23:15:36 +020088 cgit_print_age(info->tagger_date, -1, NULL);
Lars Hjemli23734c52007-01-17 01:10:39 +010089 html("</td><td>");
90 if (info->tagger)
91 html(info->tagger);
92 html("</td><td>");
Lars Hjemli4e9107a2007-07-22 23:42:55 +020093 cgit_object_link(tag->tagged);
Lars Hjemli23734c52007-01-17 01:10:39 +010094 html("</td></tr>\n");
95 } else {
Lars Hjemli495e3962007-05-15 00:07:37 +020096 if (!header)
97 print_tag_header();
Lars Hjemli23734c52007-01-17 01:10:39 +010098 html("<tr><td>");
Lars Hjemli502d7102007-10-25 10:28:15 +020099 html_txt(name);
Lars Hjemli8fb2f052007-02-04 22:55:19 +0100100 html("</td><td colspan='2'/><td>");
Lars Hjemli502d7102007-10-25 10:28:15 +0200101 cgit_object_link(ref->object);
Lars Hjemli14180342006-12-11 16:55:07 +0100102 html("</td></tr>\n");
103 }
104 return 0;
105}
106
Lars Hjemli9f48df62007-05-11 23:44:42 +0200107static int cgit_print_archive_cb(const char *refname, const unsigned char *sha1,
108 int flags, void *cb_data)
109{
110 struct tag *tag;
111 struct taginfo *info;
112 struct object *obj;
113 char buf[256], *url;
Lars Hjemlicfd2aa02007-05-15 01:05:39 +0200114 unsigned char fileid[20];
Lars Hjemli9f48df62007-05-11 23:44:42 +0200115
116 if (prefixcmp(refname, "refs/archives"))
117 return 0;
118 strncpy(buf, refname+14, sizeof(buf));
119 obj = parse_object(sha1);
120 if (!obj)
121 return 1;
122 if (obj->type == OBJ_TAG) {
123 tag = lookup_tag(sha1);
124 if (!tag || parse_tag(tag) || !(info = cgit_parse_tag(tag)))
125 return 0;
Lars Hjemlicfd2aa02007-05-15 01:05:39 +0200126 hashcpy(fileid, tag->tagged->sha1);
Lars Hjemli9f48df62007-05-11 23:44:42 +0200127 } else if (obj->type != OBJ_BLOB) {
128 return 0;
Lars Hjemlicfd2aa02007-05-15 01:05:39 +0200129 } else {
130 hashcpy(fileid, sha1);
Lars Hjemli9f48df62007-05-11 23:44:42 +0200131 }
Lars Hjemli495e3962007-05-15 00:07:37 +0200132 if (!header) {
Lars Hjemlibbcdc292007-05-23 22:46:54 +0200133 html("<table id='downloads'>");
Lars Hjemli9f48df62007-05-11 23:44:42 +0200134 html("<tr><th>Downloads</th></tr>");
Lars Hjemli495e3962007-05-15 00:07:37 +0200135 header = 1;
Lars Hjemli9f48df62007-05-11 23:44:42 +0200136 }
Lars Hjemli9f48df62007-05-11 23:44:42 +0200137 html("<tr><td>");
138 url = cgit_pageurl(cgit_query_repo, "blob",
Ondrej Jirman1a63cfc2007-05-26 01:15:10 +0200139 fmt("id=%s&amp;path=%s", sha1_to_hex(fileid),
Lars Hjemli9f48df62007-05-11 23:44:42 +0200140 buf));
141 html_link_open(url, NULL, NULL);
142 html_txt(buf);
143 html_link_close();
Lars Hjemli62dcc052007-05-24 00:02:18 +0200144 html("</td></tr>");
Lars Hjemli9f48df62007-05-11 23:44:42 +0200145 return 0;
146}
147
Lars Hjemli14180342006-12-11 16:55:07 +0100148static void cgit_print_branches()
149{
Lars Hjemli0c1ebce2007-10-25 10:13:25 +0200150 struct reflist list;
151 int i;
152
Lars Hjemli777faf72007-01-28 00:39:26 +0100153 html("<tr class='nohover'><th class='left'>Branch</th>"
Lars Hjemli237ef7b2007-05-22 23:15:36 +0200154 "<th class='left'>Idle</th>"
Lars Hjemli23734c52007-01-17 01:10:39 +0100155 "<th class='left'>Author</th>"
156 "<th class='left'>Head commit</th></tr>\n");
Lars Hjemli0c1ebce2007-10-25 10:13:25 +0200157
158 list.refs = NULL;
159 list.alloc = list.count = 0;
160 for_each_branch_ref(cgit_refs_cb, &list);
161 for(i=0; i<list.count; i++)
162 cgit_print_branch(list.refs[i]);
Lars Hjemli23734c52007-01-17 01:10:39 +0100163}
164
165static void cgit_print_tags()
166{
Lars Hjemli502d7102007-10-25 10:28:15 +0200167 struct reflist list;
168 int i;
169
Lars Hjemli495e3962007-05-15 00:07:37 +0200170 header = 0;
Lars Hjemli502d7102007-10-25 10:28:15 +0200171 list.refs = NULL;
172 list.alloc = list.count = 0;
173 for_each_tag_ref(cgit_refs_cb, &list);
174 if (list.count == 0)
175 return;
Lars Hjemlief1cc6e2007-10-25 20:33:04 +0200176 qsort(list.refs, list.count, sizeof(*list.refs), cmp_tag_age);
Lars Hjemli502d7102007-10-25 10:28:15 +0200177 print_tag_header();
178 for(i=0; i<list.count; i++)
179 print_tag(list.refs[i]);
Lars Hjemli14180342006-12-11 16:55:07 +0100180}
181
Lars Hjemli9f48df62007-05-11 23:44:42 +0200182static void cgit_print_archives()
183{
Lars Hjemli495e3962007-05-15 00:07:37 +0200184 header = 0;
Lars Hjemli9f48df62007-05-11 23:44:42 +0200185 for_each_ref(cgit_print_archive_cb, NULL);
Lars Hjemli495e3962007-05-15 00:07:37 +0200186 if (header)
Lars Hjemli9f48df62007-05-11 23:44:42 +0200187 html("</table>");
188}
189
Lars Hjemlid14c5f62006-12-11 17:04:19 +0100190void cgit_print_summary()
Lars Hjemli14180342006-12-11 16:55:07 +0100191{
Lars Hjemlibbcdc292007-05-23 22:46:54 +0200192 html("<div id='summary'>");
193 cgit_print_archives();
Lars Hjemli9f48df62007-05-11 23:44:42 +0200194 html("<h2>");
195 html_txt(cgit_repo->name);
196 html(" - ");
197 html_txt(cgit_repo->desc);
198 html("</h2>");
Lars Hjemlibbcdc292007-05-23 22:46:54 +0200199 if (cgit_repo->readme)
200 html_include(cgit_repo->readme);
201 html("</div>");
Ondrej Jirman51a960a2007-05-26 03:33:41 +0200202 if (cgit_summary_log > 0)
203 cgit_print_log(cgit_query_head, 0, cgit_summary_log, NULL, NULL, 0);
Lars Hjemlibbcdc292007-05-23 22:46:54 +0200204 html("<table class='list nowrap'>");
Ondrej Jirman51a960a2007-05-26 03:33:41 +0200205 if (cgit_summary_log > 0)
206 html("<tr class='nohover'><td colspan='4'>&nbsp;</td></tr>");
Lars Hjemli14180342006-12-11 16:55:07 +0100207 cgit_print_branches();
Lars Hjemli23734c52007-01-17 01:10:39 +0100208 html("<tr class='nohover'><td colspan='4'>&nbsp;</td></tr>");
209 cgit_print_tags();
210 html("</table>");
Lars Hjemli14180342006-12-11 16:55:07 +0100211}