blob: 5c1fc33d603fe2298d3ef3e48e5879b465500f20 [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 Hjemli14180342006-12-11 16:55:07 +010013static int cgit_print_branch_cb(const char *refname, const unsigned char *sha1,
14 int flags, void *cb_data)
15{
16 struct commit *commit;
Lars Hjemli148fb962006-12-16 00:33:28 +010017 struct commitinfo *info;
Lars Hjemli14180342006-12-11 16:55:07 +010018 char buf[256], *url;
19
Lars Hjemli23734c52007-01-17 01:10:39 +010020 strncpy(buf, refname, sizeof(buf));
Lars Hjemli14180342006-12-11 16:55:07 +010021 commit = lookup_commit(sha1);
22 if (commit && !parse_commit(commit)){
Lars Hjemli148fb962006-12-16 00:33:28 +010023 info = cgit_parse_commit(commit);
Lars Hjemli14180342006-12-11 16:55:07 +010024 html("<tr><td>");
Lars Hjemli9927e632007-05-14 23:58:29 +020025 url = cgit_pageurl(cgit_query_repo, "log",
Lars Hjemli14180342006-12-11 16:55:07 +010026 fmt("h=%s", refname));
27 html_link_open(url, NULL, NULL);
Lars Hjemli14180342006-12-11 16:55:07 +010028 html_txt(buf);
29 html_link_close();
30 html("</td><td>");
Lars Hjemli237ef7b2007-05-22 23:15:36 +020031 cgit_print_age(commit->date, -1, NULL);
Lars Hjemli148fb962006-12-16 00:33:28 +010032 html("</td><td>");
Lars Hjemli23734c52007-01-17 01:10:39 +010033 html_txt(info->author);
34 html("</td><td>");
Lars Hjemli9927e632007-05-14 23:58:29 +020035 url = cgit_pageurl(cgit_query_repo, "commit",
Lars Hjemlia2ddc102007-05-16 00:26:23 +020036 fmt("h=%s", sha1_to_hex(sha1)));
Lars Hjemli148fb962006-12-16 00:33:28 +010037 html_link_open(url, NULL, NULL);
Lars Hjemli7dd50c92007-01-28 12:17:03 +010038 html_ntxt(cgit_max_msg_len, info->subject);
Lars Hjemli148fb962006-12-16 00:33:28 +010039 html_link_close();
Lars Hjemli14180342006-12-11 16:55:07 +010040 html("</td></tr>\n");
Lars Hjemliaaa24bd2006-12-16 14:58:20 +010041 cgit_free_commitinfo(info);
Lars Hjemli14180342006-12-11 16:55:07 +010042 } else {
43 html("<tr><td>");
44 html_txt(buf);
Lars Hjemli23734c52007-01-17 01:10:39 +010045 html("</td><td colspan='3'>");
46 htmlf("*** bad ref %s ***", sha1_to_hex(sha1));
47 html("</td></tr>\n");
48 }
49 return 0;
50}
51
Lars Hjemli8fb2f052007-02-04 22:55:19 +010052
53static void cgit_print_object_ref(struct object *obj)
54{
Lars Hjemlia2ddc102007-05-16 00:26:23 +020055 char *page, *arg, *url;
Lars Hjemli8fb2f052007-02-04 22:55:19 +010056
Lars Hjemlia2ddc102007-05-16 00:26:23 +020057 if (obj->type == OBJ_COMMIT) {
Lars Hjemli8fb2f052007-02-04 22:55:19 +010058 page = "commit";
Lars Hjemlia2ddc102007-05-16 00:26:23 +020059 arg = "h";
60 } else if (obj->type == OBJ_TREE) {
Lars Hjemli8fb2f052007-02-04 22:55:19 +010061 page = "tree";
Lars Hjemlia2ddc102007-05-16 00:26:23 +020062 arg = "id";
63 } else {
Lars Hjemli8fb2f052007-02-04 22:55:19 +010064 page = "view";
Lars Hjemlia2ddc102007-05-16 00:26:23 +020065 arg = "id";
66 }
Lars Hjemli8fb2f052007-02-04 22:55:19 +010067
Lars Hjemli9927e632007-05-14 23:58:29 +020068 url = cgit_pageurl(cgit_query_repo, page,
Lars Hjemlia2ddc102007-05-16 00:26:23 +020069 fmt("%s=%s", arg, sha1_to_hex(obj->sha1)));
Lars Hjemli8fb2f052007-02-04 22:55:19 +010070 html_link_open(url, NULL, NULL);
Lars Hjemli9927e632007-05-14 23:58:29 +020071 htmlf("%s %s", typename(obj->type),
Lars Hjemli8fb2f052007-02-04 22:55:19 +010072 sha1_to_hex(obj->sha1));
73 html_link_close();
74}
75
Lars Hjemli495e3962007-05-15 00:07:37 +020076static void print_tag_header()
77{
78 html("<tr class='nohover'><th class='left'>Tag</th>"
Lars Hjemli237ef7b2007-05-22 23:15:36 +020079 "<th class='left'>Age</th>"
Lars Hjemli495e3962007-05-15 00:07:37 +020080 "<th class='left'>Author</th>"
81 "<th class='left'>Reference</th></tr>\n");
82 header = 1;
83}
84
Lars Hjemli23734c52007-01-17 01:10:39 +010085static int cgit_print_tag_cb(const char *refname, const unsigned char *sha1,
86 int flags, void *cb_data)
87{
88 struct tag *tag;
89 struct taginfo *info;
Lars Hjemli8fb2f052007-02-04 22:55:19 +010090 struct object *obj;
91 char buf[256], *url;
Lars Hjemli9927e632007-05-14 23:58:29 +020092
Lars Hjemli23734c52007-01-17 01:10:39 +010093 strncpy(buf, refname, sizeof(buf));
Lars Hjemli8fb2f052007-02-04 22:55:19 +010094 obj = parse_object(sha1);
95 if (!obj)
96 return 1;
97 if (obj->type == OBJ_TAG) {
98 tag = lookup_tag(sha1);
99 if (!tag || parse_tag(tag) || !(info = cgit_parse_tag(tag)))
100 return 2;
Lars Hjemli495e3962007-05-15 00:07:37 +0200101 if (!header)
102 print_tag_header();
Lars Hjemli23734c52007-01-17 01:10:39 +0100103 html("<tr><td>");
Lars Hjemli9927e632007-05-14 23:58:29 +0200104 url = cgit_pageurl(cgit_query_repo, "view",
Lars Hjemli23734c52007-01-17 01:10:39 +0100105 fmt("id=%s", sha1_to_hex(sha1)));
106 html_link_open(url, NULL, NULL);
107 html_txt(buf);
108 html_link_close();
Lars Hjemli14180342006-12-11 16:55:07 +0100109 html("</td><td>");
Lars Hjemli23734c52007-01-17 01:10:39 +0100110 if (info->tagger_date > 0)
Lars Hjemli237ef7b2007-05-22 23:15:36 +0200111 cgit_print_age(info->tagger_date, -1, NULL);
Lars Hjemli23734c52007-01-17 01:10:39 +0100112 html("</td><td>");
113 if (info->tagger)
114 html(info->tagger);
115 html("</td><td>");
Lars Hjemli8fb2f052007-02-04 22:55:19 +0100116 cgit_print_object_ref(tag->tagged);
Lars Hjemli23734c52007-01-17 01:10:39 +0100117 html("</td></tr>\n");
118 } else {
Lars Hjemli495e3962007-05-15 00:07:37 +0200119 if (!header)
120 print_tag_header();
Lars Hjemli23734c52007-01-17 01:10:39 +0100121 html("<tr><td>");
122 html_txt(buf);
Lars Hjemli8fb2f052007-02-04 22:55:19 +0100123 html("</td><td colspan='2'/><td>");
124 cgit_print_object_ref(obj);
Lars Hjemli14180342006-12-11 16:55:07 +0100125 html("</td></tr>\n");
126 }
127 return 0;
128}
129
Lars Hjemli9f48df62007-05-11 23:44:42 +0200130static int cgit_print_archive_cb(const char *refname, const unsigned char *sha1,
131 int flags, void *cb_data)
132{
133 struct tag *tag;
134 struct taginfo *info;
135 struct object *obj;
136 char buf[256], *url;
Lars Hjemlicfd2aa02007-05-15 01:05:39 +0200137 unsigned char fileid[20];
Lars Hjemli9f48df62007-05-11 23:44:42 +0200138
139 if (prefixcmp(refname, "refs/archives"))
140 return 0;
141 strncpy(buf, refname+14, sizeof(buf));
142 obj = parse_object(sha1);
143 if (!obj)
144 return 1;
145 if (obj->type == OBJ_TAG) {
146 tag = lookup_tag(sha1);
147 if (!tag || parse_tag(tag) || !(info = cgit_parse_tag(tag)))
148 return 0;
Lars Hjemlicfd2aa02007-05-15 01:05:39 +0200149 hashcpy(fileid, tag->tagged->sha1);
Lars Hjemli9f48df62007-05-11 23:44:42 +0200150 } else if (obj->type != OBJ_BLOB) {
151 return 0;
Lars Hjemlicfd2aa02007-05-15 01:05:39 +0200152 } else {
153 hashcpy(fileid, sha1);
Lars Hjemli9f48df62007-05-11 23:44:42 +0200154 }
Lars Hjemli495e3962007-05-15 00:07:37 +0200155 if (!header) {
Lars Hjemlibbcdc292007-05-23 22:46:54 +0200156 html("<table id='downloads'>");
Lars Hjemli9f48df62007-05-11 23:44:42 +0200157 html("<tr><th>Downloads</th></tr>");
Lars Hjemli495e3962007-05-15 00:07:37 +0200158 header = 1;
Lars Hjemli9f48df62007-05-11 23:44:42 +0200159 }
Lars Hjemli9f48df62007-05-11 23:44:42 +0200160 html("<tr><td>");
161 url = cgit_pageurl(cgit_query_repo, "blob",
Lars Hjemlicfd2aa02007-05-15 01:05:39 +0200162 fmt("id=%s&path=%s", sha1_to_hex(fileid),
Lars Hjemli9f48df62007-05-11 23:44:42 +0200163 buf));
164 html_link_open(url, NULL, NULL);
165 html_txt(buf);
166 html_link_close();
167 html("</td><tr>");
168 return 0;
169}
170
Lars Hjemli14180342006-12-11 16:55:07 +0100171static void cgit_print_branches()
172{
Lars Hjemli777faf72007-01-28 00:39:26 +0100173 html("<tr class='nohover'><th class='left'>Branch</th>"
Lars Hjemli237ef7b2007-05-22 23:15:36 +0200174 "<th class='left'>Idle</th>"
Lars Hjemli23734c52007-01-17 01:10:39 +0100175 "<th class='left'>Author</th>"
176 "<th class='left'>Head commit</th></tr>\n");
Lars Hjemli14180342006-12-11 16:55:07 +0100177 for_each_branch_ref(cgit_print_branch_cb, NULL);
Lars Hjemli23734c52007-01-17 01:10:39 +0100178}
179
180static void cgit_print_tags()
181{
Lars Hjemli495e3962007-05-15 00:07:37 +0200182 header = 0;
Lars Hjemli23734c52007-01-17 01:10:39 +0100183 for_each_tag_ref(cgit_print_tag_cb, NULL);
Lars Hjemli14180342006-12-11 16:55:07 +0100184}
185
Lars Hjemli9f48df62007-05-11 23:44:42 +0200186static void cgit_print_archives()
187{
Lars Hjemli495e3962007-05-15 00:07:37 +0200188 header = 0;
Lars Hjemli9f48df62007-05-11 23:44:42 +0200189 for_each_ref(cgit_print_archive_cb, NULL);
Lars Hjemli495e3962007-05-15 00:07:37 +0200190 if (header)
Lars Hjemli9f48df62007-05-11 23:44:42 +0200191 html("</table>");
192}
193
Lars Hjemlid14c5f62006-12-11 17:04:19 +0100194void cgit_print_summary()
Lars Hjemli14180342006-12-11 16:55:07 +0100195{
Lars Hjemlibbcdc292007-05-23 22:46:54 +0200196 html("<div id='summary'>");
197 cgit_print_archives();
Lars Hjemli9f48df62007-05-11 23:44:42 +0200198 html("<h2>");
199 html_txt(cgit_repo->name);
200 html(" - ");
201 html_txt(cgit_repo->desc);
202 html("</h2>");
Lars Hjemlibbcdc292007-05-23 22:46:54 +0200203 if (cgit_repo->readme)
204 html_include(cgit_repo->readme);
205 html("</div>");
206
207 html("<table class='list nowrap'>");
Lars Hjemli14180342006-12-11 16:55:07 +0100208 cgit_print_branches();
Lars Hjemli23734c52007-01-17 01:10:39 +0100209 html("<tr class='nohover'><td colspan='4'>&nbsp;</td></tr>");
210 cgit_print_tags();
211 html("</table>");
Lars Hjemli14180342006-12-11 16:55:07 +0100212}