]> gitweb.ps.run Git - ps-cgit/blob - ui-summary.c
Use reflist to print branch info
[ps-cgit] / 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 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
44 static 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
53 static 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
98 static 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
139 static 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
156 static void cgit_print_tags()
157 {
158         header = 0;
159         for_each_tag_ref(cgit_print_tag_cb, NULL);
160 }
161
162 static 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
170 void 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 }