all repos — cgit @ 5ec6e02bd1cc0c05b7cfd0d53371e7d176daec39

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
 11int items = 0;
 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_date(commit->date);
 32		html("</td><td>");
 33		html_txt(info->author);
 34		html("</td><td>");
 35		url = cgit_pageurl(cgit_query_repo, "commit", 
 36				   fmt("id=%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, *url;
 56
 57	if (obj->type == OBJ_COMMIT)
 58		page = "commit";
 59	else if (obj->type == OBJ_TREE)
 60		page = "tree";
 61	else
 62		page = "view";
 63
 64	url = cgit_pageurl(cgit_query_repo, page, 
 65			   fmt("id=%s", sha1_to_hex(obj->sha1)));
 66	html_link_open(url, NULL, NULL);
 67	htmlf("%s %s", typename(obj->type), 
 68	      sha1_to_hex(obj->sha1));
 69	html_link_close();
 70}
 71
 72static int cgit_print_tag_cb(const char *refname, const unsigned char *sha1,
 73				int flags, void *cb_data)
 74{
 75	struct tag *tag;
 76	struct taginfo *info;
 77	struct object *obj;
 78	char buf[256], *url;
 79 
 80	strncpy(buf, refname, sizeof(buf));
 81	obj = parse_object(sha1);
 82	if (!obj)
 83		return 1;
 84	if (obj->type == OBJ_TAG) {
 85		tag = lookup_tag(sha1);
 86		if (!tag || parse_tag(tag) || !(info = cgit_parse_tag(tag)))
 87			return 2;
 88		if (!items) {
 89			html("<tr class='nohover'><th class='left'>Tag</th>"
 90			     "<th class='left'>Created</th>"
 91			     "<th class='left'>Author</th>"
 92			     "<th class='left'>Reference</th></tr>\n");
 93		}
 94		items++;
 95		html("<tr><td>");
 96		url = cgit_pageurl(cgit_query_repo, "view", 
 97				   fmt("id=%s", sha1_to_hex(sha1)));
 98		html_link_open(url, NULL, NULL);
 99		html_txt(buf);
100		html_link_close();
101		html("</td><td>");
102		if (info->tagger_date > 0)
103			cgit_print_date(info->tagger_date);
104		html("</td><td>");
105		if (info->tagger)
106			html(info->tagger);
107		html("</td><td>");
108		cgit_print_object_ref(tag->tagged);
109		html("</td></tr>\n");
110	} else {
111		html("<tr><td>");
112		html_txt(buf);
113		html("</td><td colspan='2'/><td>");
114		cgit_print_object_ref(obj);
115		html("</td></tr>\n");
116	}
117	return 0;
118}
119
120static int cgit_print_archive_cb(const char *refname, const unsigned char *sha1,
121				 int flags, void *cb_data)
122{
123	struct tag *tag;
124	struct taginfo *info;
125	struct object *obj;
126	char buf[256], *url;
127
128	if (prefixcmp(refname, "refs/archives"))
129		return 0;
130	strncpy(buf, refname+14, sizeof(buf));
131	obj = parse_object(sha1);
132	if (!obj)
133		return 1;
134	if (obj->type == OBJ_TAG) {
135		tag = lookup_tag(sha1);
136		if (!tag || parse_tag(tag) || !(info = cgit_parse_tag(tag)))
137			return 0;
138		hashcpy(sha1, tag->tagged->sha1);
139	} else if (obj->type != OBJ_BLOB) {
140		return 0;
141	}
142	if (!items) {
143		html("<table>");
144		html("<tr><th>Downloads</th></tr>");
145	}
146	items++;
147	html("<tr><td>");
148	url = cgit_pageurl(cgit_query_repo, "blob",
149			   fmt("id=%s&path=%s", sha1_to_hex(sha1),
150			       buf));
151	html_link_open(url, NULL, NULL);
152	html_txt(buf);
153	html_link_close();
154	html("</td><tr>");
155	return 0;
156}
157
158static void cgit_print_branches()
159{
160	html("<tr class='nohover'><th class='left'>Branch</th>"
161	     "<th class='left'>Updated</th>"
162	     "<th class='left'>Author</th>"
163	     "<th class='left'>Head commit</th></tr>\n");
164	for_each_branch_ref(cgit_print_branch_cb, NULL);
165}
166
167static void cgit_print_tags()
168{
169	items = 0;
170	for_each_tag_ref(cgit_print_tag_cb, NULL);
171}
172
173static void cgit_print_archives()
174{
175	items = 0;
176	for_each_ref(cgit_print_archive_cb, NULL);
177	if (items)
178		html("</table>");
179}
180
181void cgit_print_summary()
182{
183	html("<table class='list nowrap'>");
184	html("<tr class='nohover'><td id='summary' colspan='3'>");
185	html("<h2>");
186	html_txt(cgit_repo->name);
187	html(" - ");
188	html_txt(cgit_repo->desc);
189	html("</h2>");
190	html("</td><td id='archivelist'>");
191	cgit_print_archives();
192	html("</td></tr>");
193	cgit_print_branches();
194	html("<tr class='nohover'><td colspan='4'>&nbsp;</td></tr>");
195	cgit_print_tags();
196	html("</table>");
197}