all repos — cgit @ 48c487d72daef7e71683a85f775db8d36ab20341

a hyperfast web frontend for git written in c

ui-summary.c (view raw)

  1/* 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
 11static int header;
 12
 13static int cgit_print_branch_cb(const char *refname, const unsigned char *sha1,
 14				int flags, void *cb_data)
 15{
 16	struct commit *commit;
 17	struct commitinfo *info;
 18	char buf[256], *url;
 19
 20	strncpy(buf, refname, sizeof(buf));
 21	commit = lookup_commit(sha1);
 22	// object is not really parsed at this point, because of some fallout
 23	// from previous calls to git functions in cgit_print_log()
 24	commit->object.parsed = 0;
 25	if (commit && !parse_commit(commit)){
 26		info = cgit_parse_commit(commit);
 27		html("<tr><td>");
 28		cgit_log_link(refname, NULL, NULL, refname, NULL, NULL);
 29		html("</td><td>");
 30		cgit_print_age(commit->date, -1, NULL);
 31		html("</td><td>");
 32		html_txt(info->author);
 33		html("</td><td>");
 34		url = cgit_pageurl(cgit_query_repo, "commit",
 35				   fmt("h=%s", sha1_to_hex(sha1)));
 36		html_link_open(url, NULL, NULL);
 37		html_ntxt(cgit_max_msg_len, info->subject);
 38		html_link_close();
 39		html("</td></tr>\n");
 40		cgit_free_commitinfo(info);
 41	} else {
 42		html("<tr><td>");
 43		html_txt(buf);
 44		html("</td><td colspan='3'>");
 45		htmlf("*** bad ref %s ***", sha1_to_hex(sha1));
 46		html("</td></tr>\n");
 47	}
 48	return 0;
 49}
 50
 51
 52static void cgit_print_object_ref(struct object *obj)
 53{
 54	char *page, *arg, *url;
 55
 56	if (obj->type == OBJ_COMMIT) {
 57		page = "commit";
 58		arg = "h";
 59	} else if (obj->type == OBJ_TREE) {
 60		page = "tree";
 61		arg = "id";
 62	} else {
 63		page = "view";
 64		arg = "id";
 65	}
 66
 67	url = cgit_pageurl(cgit_query_repo, page,
 68			   fmt("%s=%s", arg, sha1_to_hex(obj->sha1)));
 69	html_link_open(url, NULL, NULL);
 70	htmlf("%s %s", typename(obj->type),
 71	      sha1_to_hex(obj->sha1));
 72	html_link_close();
 73}
 74
 75static void print_tag_header()
 76{
 77	html("<tr class='nohover'><th class='left'>Tag</th>"
 78	     "<th class='left'>Age</th>"
 79	     "<th class='left'>Author</th>"
 80	     "<th class='left'>Reference</th></tr>\n");
 81	header = 1;
 82}
 83
 84static int cgit_print_tag_cb(const char *refname, const unsigned char *sha1,
 85				int flags, void *cb_data)
 86{
 87	struct tag *tag;
 88	struct taginfo *info;
 89	struct object *obj;
 90	char buf[256], *url;
 91
 92	strncpy(buf, refname, sizeof(buf));
 93	obj = parse_object(sha1);
 94	if (!obj)
 95		return 1;
 96	if (obj->type == OBJ_TAG) {
 97		tag = lookup_tag(sha1);
 98		if (!tag || parse_tag(tag) || !(info = cgit_parse_tag(tag)))
 99			return 2;
100		if (!header)
101			print_tag_header();
102		html("<tr><td>");
103		url = cgit_pageurl(cgit_query_repo, "view",
104				   fmt("id=%s", sha1_to_hex(sha1)));
105		html_link_open(url, NULL, NULL);
106		html_txt(buf);
107		html_link_close();
108		html("</td><td>");
109		if (info->tagger_date > 0)
110			cgit_print_age(info->tagger_date, -1, NULL);
111		html("</td><td>");
112		if (info->tagger)
113			html(info->tagger);
114		html("</td><td>");
115		cgit_print_object_ref(tag->tagged);
116		html("</td></tr>\n");
117	} else {
118		if (!header)
119			print_tag_header();
120		html("<tr><td>");
121		html_txt(buf);
122		html("</td><td colspan='2'/><td>");
123		cgit_print_object_ref(obj);
124		html("</td></tr>\n");
125	}
126	return 0;
127}
128
129static int cgit_print_archive_cb(const char *refname, const unsigned char *sha1,
130				 int flags, void *cb_data)
131{
132	struct tag *tag;
133	struct taginfo *info;
134	struct object *obj;
135	char buf[256], *url;
136	unsigned char fileid[20];
137
138	if (prefixcmp(refname, "refs/archives"))
139		return 0;
140	strncpy(buf, refname+14, sizeof(buf));
141	obj = parse_object(sha1);
142	if (!obj)
143		return 1;
144	if (obj->type == OBJ_TAG) {
145		tag = lookup_tag(sha1);
146		if (!tag || parse_tag(tag) || !(info = cgit_parse_tag(tag)))
147			return 0;
148		hashcpy(fileid, tag->tagged->sha1);
149	} else if (obj->type != OBJ_BLOB) {
150		return 0;
151	} else {
152		hashcpy(fileid, sha1);
153	}
154	if (!header) {
155		html("<table id='downloads'>");
156		html("<tr><th>Downloads</th></tr>");
157		header = 1;
158	}
159	html("<tr><td>");
160	url = cgit_pageurl(cgit_query_repo, "blob",
161			   fmt("id=%s&amp;path=%s", sha1_to_hex(fileid),
162			       buf));
163	html_link_open(url, NULL, NULL);
164	html_txt(buf);
165	html_link_close();
166	html("</td></tr>");
167	return 0;
168}
169
170static void cgit_print_branches()
171{
172	html("<tr class='nohover'><th class='left'>Branch</th>"
173	     "<th class='left'>Idle</th>"
174	     "<th class='left'>Author</th>"
175	     "<th class='left'>Head commit</th></tr>\n");
176	for_each_branch_ref(cgit_print_branch_cb, NULL);
177}
178
179static void cgit_print_tags()
180{
181	header = 0;
182	for_each_tag_ref(cgit_print_tag_cb, NULL);
183}
184
185static void cgit_print_archives()
186{
187	header = 0;
188	for_each_ref(cgit_print_archive_cb, NULL);
189	if (header)
190		html("</table>");
191}
192
193void cgit_print_summary()
194{
195	html("<div id='summary'>");
196	cgit_print_archives();
197	html("<h2>");
198	html_txt(cgit_repo->name);
199	html(" - ");
200	html_txt(cgit_repo->desc);
201	html("</h2>");
202	if (cgit_repo->readme)
203		html_include(cgit_repo->readme);
204	html("</div>");
205	if (cgit_summary_log > 0)
206		cgit_print_log(cgit_query_head, 0, cgit_summary_log, NULL, NULL, 0);
207	html("<table class='list nowrap'>");
208	if (cgit_summary_log > 0)
209		html("<tr class='nohover'><td colspan='4'>&nbsp;</td></tr>");
210	cgit_print_branches();
211	html("<tr class='nohover'><td colspan='4'>&nbsp;</td></tr>");
212	cgit_print_tags();
213	html("</table>");
214}