]> git.cameronkatri.com Git - cgit.git/blob - ui-summary.c
Add ofs argument to cgit_log_link and use it in ui-log.c
[cgit.git] / ui-summary.c
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
11 static int header;
12
13 static 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];
19 char *ref;
20
21 ref = xstrdup(refname);
22 strncpy(buf, refname, sizeof(buf));
23 commit = lookup_commit(sha1);
24 // object is not really parsed at this point, because of some fallout
25 // from previous calls to git functions in cgit_print_log()
26 commit->object.parsed = 0;
27 if (commit && !parse_commit(commit)){
28 info = cgit_parse_commit(commit);
29 html("<tr><td>");
30 cgit_log_link(ref, NULL, NULL, ref, NULL, NULL, 0);
31 html("</td><td>");
32 cgit_print_age(commit->date, -1, NULL);
33 html("</td><td>");
34 html_txt(info->author);
35 html("</td><td>");
36 cgit_commit_link(info->subject, NULL, NULL, ref, NULL);
37 html("</td></tr>\n");
38 cgit_free_commitinfo(info);
39 } else {
40 html("<tr><td>");
41 html_txt(buf);
42 html("</td><td colspan='3'>");
43 htmlf("*** bad ref %s ***", sha1_to_hex(sha1));
44 html("</td></tr>\n");
45 }
46 free(ref);
47 return 0;
48 }
49
50
51 static void cgit_print_object_ref(struct object *obj)
52 {
53 char *page, *arg, *url;
54
55 if (obj->type == OBJ_COMMIT) {
56 cgit_commit_link(fmt("commit %s", sha1_to_hex(obj->sha1)), NULL, NULL,
57 cgit_query_head, sha1_to_hex(obj->sha1));
58 return;
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
75 static 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
84 static 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
129 static 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
170 static 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
179 static void cgit_print_tags()
180 {
181 header = 0;
182 for_each_tag_ref(cgit_print_tag_cb, NULL);
183 }
184
185 static 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
193 void 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 }