all repos — cgit @ ef1cc6ef941cedf2e34fa1ed34ca8cd8a0cfdacc

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