all repos — cgit @ 25da3f76255754c8b3f98232a5eb84f47088d0f7

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	if (commit && !parse_commit(commit)){
 23		info = cgit_parse_commit(commit);
 24		html("<tr><td>");
 25		url = cgit_pageurl(cgit_query_repo, "log",
 26				   fmt("h=%s", refname));
 27		html_link_open(url, NULL, NULL);
 28		html_txt(buf);
 29		html_link_close();
 30		html("</td><td>");
 31		cgit_print_age(commit->date, -1, NULL);
 32		html("</td><td>");
 33		html_txt(info->author);
 34		html("</td><td>");
 35		url = cgit_pageurl(cgit_query_repo, "commit",
 36				   fmt("h=%s", sha1_to_hex(sha1)));
 37		html_link_open(url, NULL, NULL);
 38		html_ntxt(cgit_max_msg_len, info->subject);
 39		html_link_close();
 40		html("</td></tr>\n");
 41		cgit_free_commitinfo(info);
 42	} else {
 43		html("<tr><td>");
 44		html_txt(buf);
 45		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
 52
 53static void cgit_print_object_ref(struct object *obj)
 54{
 55	char *page, *arg, *url;
 56
 57	if (obj->type == OBJ_COMMIT) {
 58		page = "commit";
 59		arg = "h";
 60	} else if (obj->type == OBJ_TREE) {
 61		page = "tree";
 62		arg = "id";
 63	} else {
 64		page = "view";
 65		arg = "id";
 66	}
 67
 68	url = cgit_pageurl(cgit_query_repo, page,
 69			   fmt("%s=%s", arg, sha1_to_hex(obj->sha1)));
 70	html_link_open(url, NULL, NULL);
 71	htmlf("%s %s", typename(obj->type),
 72	      sha1_to_hex(obj->sha1));
 73	html_link_close();
 74}
 75
 76static void print_tag_header()
 77{
 78	html("<tr class='nohover'><th class='left'>Tag</th>"
 79	     "<th class='left'>Age</th>"
 80	     "<th class='left'>Author</th>"
 81	     "<th class='left'>Reference</th></tr>\n");
 82	header = 1;
 83}
 84
 85static 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;
 90	struct object *obj;
 91	char buf[256], *url;
 92
 93	strncpy(buf, refname, sizeof(buf));
 94	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;
101		if (!header)
102			print_tag_header();
103		html("<tr><td>");
104		url = cgit_pageurl(cgit_query_repo, "view",
105				   fmt("id=%s", sha1_to_hex(sha1)));
106		html_link_open(url, NULL, NULL);
107		html_txt(buf);
108		html_link_close();
109		html("</td><td>");
110		if (info->tagger_date > 0)
111			cgit_print_age(info->tagger_date, -1, NULL);
112		html("</td><td>");
113		if (info->tagger)
114			html(info->tagger);
115		html("</td><td>");
116		cgit_print_object_ref(tag->tagged);
117		html("</td></tr>\n");
118	} else {
119		if (!header)
120			print_tag_header();
121		html("<tr><td>");
122		html_txt(buf);
123		html("</td><td colspan='2'/><td>");
124		cgit_print_object_ref(obj);
125		html("</td></tr>\n");
126	}
127	return 0;
128}
129
130static 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;
137	unsigned char fileid[20];
138
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;
149		hashcpy(fileid, tag->tagged->sha1);
150	} else if (obj->type != OBJ_BLOB) {
151		return 0;
152	} else {
153		hashcpy(fileid, sha1);
154	}
155	if (!header) {
156		html("<table>");
157		html("<tr><th>Downloads</th></tr>");
158		header = 1;
159	}
160	html("<tr><td>");
161	url = cgit_pageurl(cgit_query_repo, "blob",
162			   fmt("id=%s&path=%s", sha1_to_hex(fileid),
163			       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
171static void cgit_print_branches()
172{
173	html("<tr class='nohover'><th class='left'>Branch</th>"
174	     "<th class='left'>Idle</th>"
175	     "<th class='left'>Author</th>"
176	     "<th class='left'>Head commit</th></tr>\n");
177	for_each_branch_ref(cgit_print_branch_cb, NULL);
178}
179
180static void cgit_print_tags()
181{
182	header = 0;
183	for_each_tag_ref(cgit_print_tag_cb, NULL);
184}
185
186static void cgit_print_archives()
187{
188	header = 0;
189	for_each_ref(cgit_print_archive_cb, NULL);
190	if (header)
191		html("</table>");
192}
193
194void cgit_print_summary()
195{
196	html("<table class='list nowrap'>");
197	html("<tr class='nohover'><td id='summary' colspan='3'>");
198	html("<h2>");
199	html_txt(cgit_repo->name);
200	html(" - ");
201	html_txt(cgit_repo->desc);
202	html("</h2>");
203	html("</td><td id='archivelist'>");
204	cgit_print_archives();
205	html("</td></tr>");
206	cgit_print_branches();
207	html("<tr class='nohover'><td colspan='4'>&nbsp;</td></tr>");
208	cgit_print_tags();
209	html("</table>");
210}