all repos — cgit @ 0c1ebce2042e69569d99551d7749b97b4e579609

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