blob: de8a1808cf8a3f6e498b3ad8e06148768bdb4bb7 [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 Hjemli42a7eb92007-06-17 14:53:02 +020018 char buf[256];
19 char *ref;
Lars Hjemli14180342006-12-11 16:55:07 +010020
Lars Hjemli42a7eb92007-06-17 14:53:02 +020021 ref = xstrdup(refname);
Lars Hjemli23734c52007-01-17 01:10:39 +010022 strncpy(buf, refname, sizeof(buf));
Lars Hjemli14180342006-12-11 16:55:07 +010023 commit = lookup_commit(sha1);
Ondrej Jirman51a960a2007-05-26 03:33:41 +020024 // object is not really parsed at this point, because of some fallout
25 // from previous calls to git functions in cgit_print_log()
26 commit->object.parsed = 0;
Lars Hjemli14180342006-12-11 16:55:07 +010027 if (commit && !parse_commit(commit)){
Lars Hjemli148fb962006-12-16 00:33:28 +010028 info = cgit_parse_commit(commit);
Lars Hjemli14180342006-12-11 16:55:07 +010029 html("<tr><td>");
Lars Hjemli103940f2007-06-29 20:27:41 +020030 cgit_log_link(ref, NULL, NULL, ref, NULL, NULL, 0);
Lars Hjemli14180342006-12-11 16:55:07 +010031 html("</td><td>");
Lars Hjemli237ef7b2007-05-22 23:15:36 +020032 cgit_print_age(commit->date, -1, NULL);
Lars Hjemli148fb962006-12-16 00:33:28 +010033 html("</td><td>");
Lars Hjemli23734c52007-01-17 01:10:39 +010034 html_txt(info->author);
35 html("</td><td>");
Lars Hjemli42a7eb92007-06-17 14:53:02 +020036 cgit_commit_link(info->subject, NULL, NULL, ref, NULL);
Lars Hjemli14180342006-12-11 16:55:07 +010037 html("</td></tr>\n");
Lars Hjemliaaa24bd2006-12-16 14:58:20 +010038 cgit_free_commitinfo(info);
Lars Hjemli14180342006-12-11 16:55:07 +010039 } else {
40 html("<tr><td>");
41 html_txt(buf);
Lars Hjemli23734c52007-01-17 01:10:39 +010042 html("</td><td colspan='3'>");
43 htmlf("*** bad ref %s ***", sha1_to_hex(sha1));
44 html("</td></tr>\n");
45 }
Lars Hjemli42a7eb92007-06-17 14:53:02 +020046 free(ref);
Lars Hjemli23734c52007-01-17 01:10:39 +010047 return 0;
48}
49
Lars Hjemli495e3962007-05-15 00:07:37 +020050static void print_tag_header()
51{
52 html("<tr class='nohover'><th class='left'>Tag</th>"
Lars Hjemli237ef7b2007-05-22 23:15:36 +020053 "<th class='left'>Age</th>"
Lars Hjemli495e3962007-05-15 00:07:37 +020054 "<th class='left'>Author</th>"
55 "<th class='left'>Reference</th></tr>\n");
56 header = 1;
57}
58
Lars Hjemli23734c52007-01-17 01:10:39 +010059static int cgit_print_tag_cb(const char *refname, const unsigned char *sha1,
60 int flags, void *cb_data)
61{
62 struct tag *tag;
63 struct taginfo *info;
Lars Hjemli8fb2f052007-02-04 22:55:19 +010064 struct object *obj;
65 char buf[256], *url;
Lars Hjemli9927e632007-05-14 23:58:29 +020066
Lars Hjemli23734c52007-01-17 01:10:39 +010067 strncpy(buf, refname, sizeof(buf));
Lars Hjemli8fb2f052007-02-04 22:55:19 +010068 obj = parse_object(sha1);
69 if (!obj)
70 return 1;
71 if (obj->type == OBJ_TAG) {
72 tag = lookup_tag(sha1);
73 if (!tag || parse_tag(tag) || !(info = cgit_parse_tag(tag)))
74 return 2;
Lars Hjemli495e3962007-05-15 00:07:37 +020075 if (!header)
76 print_tag_header();
Lars Hjemli23734c52007-01-17 01:10:39 +010077 html("<tr><td>");
Lars Hjemli4e9107a2007-07-22 23:42:55 +020078 url = cgit_pageurl(cgit_query_repo, "tag",
79 fmt("id=%s", refname));
Lars Hjemli23734c52007-01-17 01:10:39 +010080 html_link_open(url, NULL, NULL);
81 html_txt(buf);
82 html_link_close();
Lars Hjemli14180342006-12-11 16:55:07 +010083 html("</td><td>");
Lars Hjemli23734c52007-01-17 01:10:39 +010084 if (info->tagger_date > 0)
Lars Hjemli237ef7b2007-05-22 23:15:36 +020085 cgit_print_age(info->tagger_date, -1, NULL);
Lars Hjemli23734c52007-01-17 01:10:39 +010086 html("</td><td>");
87 if (info->tagger)
88 html(info->tagger);
89 html("</td><td>");
Lars Hjemli4e9107a2007-07-22 23:42:55 +020090 cgit_object_link(tag->tagged);
Lars Hjemli23734c52007-01-17 01:10:39 +010091 html("</td></tr>\n");
92 } else {
Lars Hjemli495e3962007-05-15 00:07:37 +020093 if (!header)
94 print_tag_header();
Lars Hjemli23734c52007-01-17 01:10:39 +010095 html("<tr><td>");
96 html_txt(buf);
Lars Hjemli8fb2f052007-02-04 22:55:19 +010097 html("</td><td colspan='2'/><td>");
Lars Hjemli4e9107a2007-07-22 23:42:55 +020098 cgit_object_link(obj);
Lars Hjemli14180342006-12-11 16:55:07 +010099 html("</td></tr>\n");
100 }
101 return 0;
102}
103
Lars Hjemli9f48df62007-05-11 23:44:42 +0200104static int cgit_print_archive_cb(const char *refname, const unsigned char *sha1,
105 int flags, void *cb_data)
106{
107 struct tag *tag;
108 struct taginfo *info;
109 struct object *obj;
110 char buf[256], *url;
Lars Hjemlicfd2aa02007-05-15 01:05:39 +0200111 unsigned char fileid[20];
Lars Hjemli9f48df62007-05-11 23:44:42 +0200112
113 if (prefixcmp(refname, "refs/archives"))
114 return 0;
115 strncpy(buf, refname+14, sizeof(buf));
116 obj = parse_object(sha1);
117 if (!obj)
118 return 1;
119 if (obj->type == OBJ_TAG) {
120 tag = lookup_tag(sha1);
121 if (!tag || parse_tag(tag) || !(info = cgit_parse_tag(tag)))
122 return 0;
Lars Hjemlicfd2aa02007-05-15 01:05:39 +0200123 hashcpy(fileid, tag->tagged->sha1);
Lars Hjemli9f48df62007-05-11 23:44:42 +0200124 } else if (obj->type != OBJ_BLOB) {
125 return 0;
Lars Hjemlicfd2aa02007-05-15 01:05:39 +0200126 } else {
127 hashcpy(fileid, sha1);
Lars Hjemli9f48df62007-05-11 23:44:42 +0200128 }
Lars Hjemli495e3962007-05-15 00:07:37 +0200129 if (!header) {
Lars Hjemlibbcdc292007-05-23 22:46:54 +0200130 html("<table id='downloads'>");
Lars Hjemli9f48df62007-05-11 23:44:42 +0200131 html("<tr><th>Downloads</th></tr>");
Lars Hjemli495e3962007-05-15 00:07:37 +0200132 header = 1;
Lars Hjemli9f48df62007-05-11 23:44:42 +0200133 }
Lars Hjemli9f48df62007-05-11 23:44:42 +0200134 html("<tr><td>");
135 url = cgit_pageurl(cgit_query_repo, "blob",
Ondrej Jirman1a63cfc2007-05-26 01:15:10 +0200136 fmt("id=%s&amp;path=%s", sha1_to_hex(fileid),
Lars Hjemli9f48df62007-05-11 23:44:42 +0200137 buf));
138 html_link_open(url, NULL, NULL);
139 html_txt(buf);
140 html_link_close();
Lars Hjemli62dcc052007-05-24 00:02:18 +0200141 html("</td></tr>");
Lars Hjemli9f48df62007-05-11 23:44:42 +0200142 return 0;
143}
144
Lars Hjemli14180342006-12-11 16:55:07 +0100145static void cgit_print_branches()
146{
Lars Hjemli777faf72007-01-28 00:39:26 +0100147 html("<tr class='nohover'><th class='left'>Branch</th>"
Lars Hjemli237ef7b2007-05-22 23:15:36 +0200148 "<th class='left'>Idle</th>"
Lars Hjemli23734c52007-01-17 01:10:39 +0100149 "<th class='left'>Author</th>"
150 "<th class='left'>Head commit</th></tr>\n");
Lars Hjemli14180342006-12-11 16:55:07 +0100151 for_each_branch_ref(cgit_print_branch_cb, NULL);
Lars Hjemli23734c52007-01-17 01:10:39 +0100152}
153
154static void cgit_print_tags()
155{
Lars Hjemli495e3962007-05-15 00:07:37 +0200156 header = 0;
Lars Hjemli23734c52007-01-17 01:10:39 +0100157 for_each_tag_ref(cgit_print_tag_cb, NULL);
Lars Hjemli14180342006-12-11 16:55:07 +0100158}
159
Lars Hjemli9f48df62007-05-11 23:44:42 +0200160static void cgit_print_archives()
161{
Lars Hjemli495e3962007-05-15 00:07:37 +0200162 header = 0;
Lars Hjemli9f48df62007-05-11 23:44:42 +0200163 for_each_ref(cgit_print_archive_cb, NULL);
Lars Hjemli495e3962007-05-15 00:07:37 +0200164 if (header)
Lars Hjemli9f48df62007-05-11 23:44:42 +0200165 html("</table>");
166}
167
Lars Hjemlid14c5f62006-12-11 17:04:19 +0100168void cgit_print_summary()
Lars Hjemli14180342006-12-11 16:55:07 +0100169{
Lars Hjemlibbcdc292007-05-23 22:46:54 +0200170 html("<div id='summary'>");
171 cgit_print_archives();
Lars Hjemli9f48df62007-05-11 23:44:42 +0200172 html("<h2>");
173 html_txt(cgit_repo->name);
174 html(" - ");
175 html_txt(cgit_repo->desc);
176 html("</h2>");
Lars Hjemlibbcdc292007-05-23 22:46:54 +0200177 if (cgit_repo->readme)
178 html_include(cgit_repo->readme);
179 html("</div>");
Ondrej Jirman51a960a2007-05-26 03:33:41 +0200180 if (cgit_summary_log > 0)
181 cgit_print_log(cgit_query_head, 0, cgit_summary_log, NULL, NULL, 0);
Lars Hjemlibbcdc292007-05-23 22:46:54 +0200182 html("<table class='list nowrap'>");
Ondrej Jirman51a960a2007-05-26 03:33:41 +0200183 if (cgit_summary_log > 0)
184 html("<tr class='nohover'><td colspan='4'>&nbsp;</td></tr>");
Lars Hjemli14180342006-12-11 16:55:07 +0100185 cgit_print_branches();
Lars Hjemli23734c52007-01-17 01:10:39 +0100186 html("<tr class='nohover'><td colspan='4'>&nbsp;</td></tr>");
187 cgit_print_tags();
188 html("</table>");
Lars Hjemli14180342006-12-11 16:55:07 +0100189}