aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Makefile2
-rw-r--r--cgit.c3
-rw-r--r--cgit.h5
-rw-r--r--shared.c2
-rw-r--r--ui-shared.c24
-rw-r--r--ui-summary.c33
-rw-r--r--ui-tag.c74
7 files changed, 111 insertions, 32 deletions
diff --git a/Makefile b/Makefile
index cea09f1..50d0011 100644
--- a/Makefile
+++ b/Makefile
@@ -23,7 +23,7 @@ VERSION:
23EXTLIBS = git/libgit.a git/xdiff/lib.a -lz -lcrypto 23EXTLIBS = git/libgit.a git/xdiff/lib.a -lz -lcrypto
24OBJECTS = shared.o cache.o parsing.o html.o ui-shared.o ui-repolist.o \ 24OBJECTS = shared.o cache.o parsing.o html.o ui-shared.o ui-repolist.o \
25 ui-summary.o ui-log.o ui-tree.o ui-commit.o ui-diff.o \ 25 ui-summary.o ui-log.o ui-tree.o ui-commit.o ui-diff.o \
26 ui-snapshot.o ui-blob.o 26 ui-snapshot.o ui-blob.o ui-tag.o
27 27
28CFLAGS += -Wall 28CFLAGS += -Wall
29 29
diff --git a/cgit.c b/cgit.c
index 8795bbc..6597529 100644
--- a/cgit.c
+++ b/cgit.c
@@ -103,6 +103,9 @@ static void cgit_print_repo_page(struct cacheitem *item)
103 case CMD_COMMIT: 103 case CMD_COMMIT:
104 cgit_print_commit(cgit_query_sha1); 104 cgit_print_commit(cgit_query_sha1);
105 break; 105 break;
106 case CMD_TAG:
107 cgit_print_tag(cgit_query_sha1);
108 break;
106 case CMD_DIFF: 109 case CMD_DIFF:
107 cgit_print_diff(cgit_query_sha1, cgit_query_sha2); 110 cgit_print_diff(cgit_query_sha1, cgit_query_sha2);
108 break; 111 break;
diff --git a/cgit.h b/cgit.h
index ea61be7..eddcaa3 100644
--- a/cgit.h
+++ b/cgit.h
@@ -27,7 +27,7 @@
27#define CMD_TREE 4 27#define CMD_TREE 4
28#define CMD_BLOB 5 28#define CMD_BLOB 5
29#define CMD_SNAPSHOT 6 29#define CMD_SNAPSHOT 6
30 30#define CMD_TAG 7
31 31
32/* 32/*
33 * Dateformats used on misc. pages 33 * Dateformats used on misc. pages
@@ -217,6 +217,8 @@ extern void cgit_commit_link(char *name, char *title, char *class, char *head,
217extern void cgit_diff_link(char *name, char *title, char *class, char *head, 217extern void cgit_diff_link(char *name, char *title, char *class, char *head,
218 char *new_rev, char *old_rev, char *path); 218 char *new_rev, char *old_rev, char *path);
219 219
220extern void cgit_object_link(struct object *obj);
221
220extern void cgit_print_error(char *msg); 222extern void cgit_print_error(char *msg);
221extern void cgit_print_date(time_t secs, char *format); 223extern void cgit_print_date(time_t secs, char *format);
222extern void cgit_print_age(time_t t, time_t max_relative, char *format); 224extern void cgit_print_age(time_t t, time_t max_relative, char *format);
@@ -233,6 +235,7 @@ extern void cgit_print_log(const char *tip, int ofs, int cnt, char *grep, char *
233extern void cgit_print_blob(struct cacheitem *item, const char *hex, char *path); 235extern void cgit_print_blob(struct cacheitem *item, const char *hex, char *path);
234extern void cgit_print_tree(const char *rev, char *path); 236extern void cgit_print_tree(const char *rev, char *path);
235extern void cgit_print_commit(char *hex); 237extern void cgit_print_commit(char *hex);
238extern void cgit_print_tag(char *revname);
236extern void cgit_print_diff(const char *new_hex, const char *old_hex); 239extern void cgit_print_diff(const char *new_hex, const char *old_hex);
237extern void cgit_print_snapshot(struct cacheitem *item, const char *hex, 240extern void cgit_print_snapshot(struct cacheitem *item, const char *hex,
238 const char *prefix, const char *filename, 241 const char *prefix, const char *filename,
diff --git a/shared.c b/shared.c
index ccbde27..077934f 100644
--- a/shared.c
+++ b/shared.c
@@ -63,7 +63,7 @@ int htmlfd = 0;
63int cgit_get_cmd_index(const char *cmd) 63int cgit_get_cmd_index(const char *cmd)
64{ 64{
65 static char *cmds[] = {"log", "commit", "diff", "tree", "blob", 65 static char *cmds[] = {"log", "commit", "diff", "tree", "blob",
66 "snapshot", NULL}; 66 "snapshot", "tag", NULL};
67 int i; 67 int i;
68 68
69 for(i = 0; cmds[i]; i++) 69 for(i = 0; cmds[i]; i++)
diff --git a/ui-shared.c b/ui-shared.c
index 3e378a4..ca2ee82 100644
--- a/ui-shared.c
+++ b/ui-shared.c
@@ -249,6 +249,30 @@ void cgit_diff_link(char *name, char *title, char *class, char *head,
249 html("</a>"); 249 html("</a>");
250} 250}
251 251
252void cgit_object_link(struct object *obj)
253{
254 char *page, *arg, *url;
255
256 if (obj->type == OBJ_COMMIT) {
257 cgit_commit_link(fmt("commit %s", sha1_to_hex(obj->sha1)), NULL, NULL,
258 cgit_query_head, sha1_to_hex(obj->sha1));
259 return;
260 } else if (obj->type == OBJ_TREE) {
261 page = "tree";
262 arg = "id";
263 } else {
264 page = "blob";
265 arg = "id";
266 }
267
268 url = cgit_pageurl(cgit_query_repo, page,
269 fmt("%s=%s", arg, sha1_to_hex(obj->sha1)));
270 html_link_open(url, NULL, NULL);
271 htmlf("%s %s", typename(obj->type),
272 sha1_to_hex(obj->sha1));
273 html_link_close();
274}
275
252void cgit_print_date(time_t secs, char *format) 276void cgit_print_date(time_t secs, char *format)
253{ 277{
254 char buf[64]; 278 char buf[64];
diff --git a/ui-summary.c b/ui-summary.c
index fdee66b..de8a180 100644
--- a/ui-summary.c
+++ b/ui-summary.c
@@ -47,31 +47,6 @@ static int cgit_print_branch_cb(const char *refname, const unsigned char *sha1,
47 return 0; 47 return 0;
48} 48}
49 49
50
51static 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 = "blob";
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
75static void print_tag_header() 50static void print_tag_header()
76{ 51{
77 html("<tr class='nohover'><th class='left'>Tag</th>" 52 html("<tr class='nohover'><th class='left'>Tag</th>"
@@ -100,8 +75,8 @@ static int cgit_print_tag_cb(const char *refname, const unsigned char *sha1,
100 if (!header) 75 if (!header)
101 print_tag_header(); 76 print_tag_header();
102 html("<tr><td>"); 77 html("<tr><td>");
103 url = cgit_pageurl(cgit_query_repo, "view", 78 url = cgit_pageurl(cgit_query_repo, "tag",
104 fmt("id=%s", sha1_to_hex(sha1))); 79 fmt("id=%s", refname));
105 html_link_open(url, NULL, NULL); 80 html_link_open(url, NULL, NULL);
106 html_txt(buf); 81 html_txt(buf);
107 html_link_close(); 82 html_link_close();
@@ -112,7 +87,7 @@ static int cgit_print_tag_cb(const char *refname, const unsigned char *sha1,
112 if (info->tagger) 87 if (info->tagger)
113 html(info->tagger); 88 html(info->tagger);
114 html("</td><td>"); 89 html("</td><td>");
115 cgit_print_object_ref(tag->tagged); 90 cgit_object_link(tag->tagged);
116 html("</td></tr>\n"); 91 html("</td></tr>\n");
117 } else { 92 } else {
118 if (!header) 93 if (!header)
@@ -120,7 +95,7 @@ static int cgit_print_tag_cb(const char *refname, const unsigned char *sha1,
120 html("<tr><td>"); 95 html("<tr><td>");
121 html_txt(buf); 96 html_txt(buf);
122 html("</td><td colspan='2'/><td>"); 97 html("</td><td colspan='2'/><td>");
123 cgit_print_object_ref(obj); 98 cgit_object_link(obj);
124 html("</td></tr>\n"); 99 html("</td></tr>\n");
125 } 100 }
126 return 0; 101 return 0;
diff --git a/ui-tag.c b/ui-tag.c
new file mode 100644
index 0000000..a6989ff
--- /dev/null
+++ b/ui-tag.c
@@ -0,0 +1,74 @@
1/* ui-tag.c: display a tag
2 *
3 * Copyright (C) 2007 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
12static void print_tag_content(char *buf)
13{
14 char *p;
15
16 if (!buf)
17 return;
18
19 html("<div class='commit-subject'>");
20 p = strchr(buf, '\n');
21 if (p)
22 *p = '\0';
23 html_txt(buf);
24 html("</div>");
25 if (p) {
26 html("<div class='commit-msg'>");
27 html_txt(++p);
28 html("</div>");
29 }
30}
31
32void cgit_print_tag(char *revname)
33{
34 unsigned char sha1[20];
35 struct object *obj;
36 struct tag *tag;
37 struct taginfo *info;
38
39 if (get_sha1(revname, sha1)) {
40 cgit_print_error(fmt("Bad tag reference: %s", revname));
41 return;
42 }
43 obj = parse_object(sha1);
44 if (!obj) {
45 cgit_print_error(fmt("Bad object id: %s", sha1_to_hex(sha1)));
46 return;
47 }
48 if (obj->type == OBJ_TAG) {
49 tag = lookup_tag(sha1);
50 if (!tag || parse_tag(tag) || !(info = cgit_parse_tag(tag))) {
51 cgit_print_error(fmt("Bad tag object: %s", revname));
52 return;
53 }
54 html("<table class='commit-info'>\n");
55 htmlf("<tr><td>Tag name</td><td>%s (%s)</td></tr>\n",
56 revname, sha1_to_hex(sha1));
57 if (info->tagger_date > 0) {
58 html("<tr><td>Tag date</td><td>");
59 cgit_print_date(info->tagger_date, FMT_LONGDATE);
60 html("</td><tr>\n");
61 }
62 if (info->tagger) {
63 html("<tr><td>Tagged by</td><td>");
64 html_txt(info->tagger);
65 html("</td></tr>\n");
66 }
67 html("<tr><td>Tagged object</td><td>");
68 cgit_object_link(tag->tagged);
69 html("</td></tr>\n");
70 html("</table>\n");
71 print_tag_content(info->msg);
72 }
73 return;
74}