summaryrefslogtreecommitdiffabout
authorLars Hjemli <hjemli@gmail.com>2006-12-13 23:40:34 (UTC)
committer Lars Hjemli <hjemli@gmail.com>2006-12-13 23:40:34 (UTC)
commit420712ac2531f65a2b94d5ec6d8e03de6942331e (patch) (unidiff)
tree4849b20b4341a55d1b6435c104de860cda5f6ad6
parentc45b8178d0e042a668395541a28d59f907da150b (diff)
downloadcgit-420712ac2531f65a2b94d5ec6d8e03de6942331e.zip
cgit-420712ac2531f65a2b94d5ec6d8e03de6942331e.tar.gz
cgit-420712ac2531f65a2b94d5ec6d8e03de6942331e.tar.bz2
Add simple pager to log page
Signed-off-by: Lars Hjemli <hjemli@gmail.com>
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--cgit.c2
-rw-r--r--cgit.h1
-rw-r--r--shared.c9
-rw-r--r--ui-log.c31
4 files changed, 37 insertions, 6 deletions
diff --git a/cgit.c b/cgit.c
index ada488b..d7e586d 100644
--- a/cgit.c
+++ b/cgit.c
@@ -16,33 +16,33 @@ static void cgit_print_repo_page(struct cacheitem *item)
16 cgit_read_config("info/cgit", cgit_repo_config_cb)) { 16 cgit_read_config("info/cgit", cgit_repo_config_cb)) {
17 char *title = fmt("%s - %s", cgit_root_title, "Bad request"); 17 char *title = fmt("%s - %s", cgit_root_title, "Bad request");
18 cgit_print_docstart(title, item); 18 cgit_print_docstart(title, item);
19 cgit_print_pageheader(title); 19 cgit_print_pageheader(title);
20 cgit_print_error(fmt("Unable to scan repository: %s", 20 cgit_print_error(fmt("Unable to scan repository: %s",
21 strerror(errno))); 21 strerror(errno)));
22 cgit_print_docend(); 22 cgit_print_docend();
23 return; 23 return;
24 } 24 }
25 setenv("GIT_DIR", fmt("%s/%s", cgit_root, cgit_query_repo), 1); 25 setenv("GIT_DIR", fmt("%s/%s", cgit_root, cgit_query_repo), 1);
26 char *title = fmt("%s - %s", cgit_repo_name, cgit_repo_desc); 26 char *title = fmt("%s - %s", cgit_repo_name, cgit_repo_desc);
27 cgit_print_docstart(title, item); 27 cgit_print_docstart(title, item);
28 cgit_print_pageheader(title); 28 cgit_print_pageheader(title);
29 if (!cgit_query_page) { 29 if (!cgit_query_page) {
30 cgit_print_summary(); 30 cgit_print_summary();
31 } else if (!strcmp(cgit_query_page, "log")) { 31 } else if (!strcmp(cgit_query_page, "log")) {
32 cgit_print_log(cgit_query_head, 0, 100); 32 cgit_print_log(cgit_query_head, cgit_query_ofs, 100);
33 } else if (!strcmp(cgit_query_page, "tree")) { 33 } else if (!strcmp(cgit_query_page, "tree")) {
34 cgit_print_tree(cgit_query_sha1); 34 cgit_print_tree(cgit_query_sha1);
35 } else if (!strcmp(cgit_query_page, "view")) { 35 } else if (!strcmp(cgit_query_page, "view")) {
36 cgit_print_view(cgit_query_sha1); 36 cgit_print_view(cgit_query_sha1);
37 } 37 }
38 cgit_print_docend(); 38 cgit_print_docend();
39} 39}
40 40
41static void cgit_fill_cache(struct cacheitem *item) 41static void cgit_fill_cache(struct cacheitem *item)
42{ 42{
43 htmlfd = item->fd; 43 htmlfd = item->fd;
44 item->st.st_mtime = time(NULL); 44 item->st.st_mtime = time(NULL);
45 if (cgit_query_repo) 45 if (cgit_query_repo)
46 cgit_print_repo_page(item); 46 cgit_print_repo_page(item);
47 else 47 else
48 cgit_print_repolist(item); 48 cgit_print_repolist(item);
diff --git a/cgit.h b/cgit.h
index 2fdfab3..82e8681 100644
--- a/cgit.h
+++ b/cgit.h
@@ -31,32 +31,33 @@ extern int cgit_cache_repo_ttl;
31extern int cgit_cache_dynamic_ttl; 31extern int cgit_cache_dynamic_ttl;
32extern int cgit_cache_static_ttl; 32extern int cgit_cache_static_ttl;
33extern int cgit_cache_max_create_time; 33extern int cgit_cache_max_create_time;
34 34
35extern char *cgit_repo_name; 35extern char *cgit_repo_name;
36extern char *cgit_repo_desc; 36extern char *cgit_repo_desc;
37extern char *cgit_repo_owner; 37extern char *cgit_repo_owner;
38 38
39extern int cgit_query_has_symref; 39extern int cgit_query_has_symref;
40extern int cgit_query_has_sha1; 40extern int cgit_query_has_sha1;
41 41
42extern char *cgit_querystring; 42extern char *cgit_querystring;
43extern char *cgit_query_repo; 43extern char *cgit_query_repo;
44extern char *cgit_query_page; 44extern char *cgit_query_page;
45extern char *cgit_query_head; 45extern char *cgit_query_head;
46extern char *cgit_query_sha1; 46extern char *cgit_query_sha1;
47extern int cgit_query_ofs;
47 48
48extern int htmlfd; 49extern int htmlfd;
49 50
50extern void cgit_global_config_cb(const char *name, const char *value); 51extern void cgit_global_config_cb(const char *name, const char *value);
51extern void cgit_repo_config_cb(const char *name, const char *value); 52extern void cgit_repo_config_cb(const char *name, const char *value);
52extern void cgit_querystring_cb(const char *name, const char *value); 53extern void cgit_querystring_cb(const char *name, const char *value);
53 54
54extern char *fmt(const char *format,...); 55extern char *fmt(const char *format,...);
55 56
56extern void html(const char *txt); 57extern void html(const char *txt);
57extern void htmlf(const char *format,...); 58extern void htmlf(const char *format,...);
58extern void html_txt(char *txt); 59extern void html_txt(char *txt);
59extern void html_attr(char *txt); 60extern void html_attr(char *txt);
60extern void html_link_open(char *url, char *title, char *class); 61extern void html_link_open(char *url, char *title, char *class);
61extern void html_link_close(void); 62extern void html_link_close(void);
62 63
diff --git a/shared.c b/shared.c
index c58a2ff..6b5cfc2 100644
--- a/shared.c
+++ b/shared.c
@@ -15,60 +15,63 @@ int cgit_cache_repo_ttl = 5;
15int cgit_cache_dynamic_ttl = 5; 15int cgit_cache_dynamic_ttl = 5;
16int cgit_cache_static_ttl = -1; 16int cgit_cache_static_ttl = -1;
17int cgit_cache_max_create_time = 5; 17int cgit_cache_max_create_time = 5;
18 18
19char *cgit_repo_name = NULL; 19char *cgit_repo_name = NULL;
20char *cgit_repo_desc = NULL; 20char *cgit_repo_desc = NULL;
21char *cgit_repo_owner = NULL; 21char *cgit_repo_owner = NULL;
22 22
23int cgit_query_has_symref = 0; 23int cgit_query_has_symref = 0;
24int cgit_query_has_sha1 = 0; 24int cgit_query_has_sha1 = 0;
25 25
26char *cgit_querystring = NULL; 26char *cgit_querystring = NULL;
27char *cgit_query_repo = NULL; 27char *cgit_query_repo = NULL;
28char *cgit_query_page = NULL; 28char *cgit_query_page = NULL;
29char *cgit_query_head = NULL; 29char *cgit_query_head = NULL;
30char *cgit_query_sha1 = NULL; 30char *cgit_query_sha1 = NULL;
31int cgit_query_ofs = 0;
31 32
32int htmlfd = 0; 33int htmlfd = 0;
33 34
34void cgit_global_config_cb(const char *name, const char *value) 35void cgit_global_config_cb(const char *name, const char *value)
35{ 36{
36 if (!strcmp(name, "root")) 37 if (!strcmp(name, "root"))
37 cgit_root = xstrdup(value); 38 cgit_root = xstrdup(value);
38 else if (!strcmp(name, "root-title")) 39 else if (!strcmp(name, "root-title"))
39 cgit_root_title = xstrdup(value); 40 cgit_root_title = xstrdup(value);
40 else if (!strcmp(name, "css")) 41 else if (!strcmp(name, "css"))
41 cgit_css = xstrdup(value); 42 cgit_css = xstrdup(value);
42 else if (!strcmp(name, "logo")) 43 else if (!strcmp(name, "logo"))
43 cgit_logo = xstrdup(value); 44 cgit_logo = xstrdup(value);
44 else if (!strcmp(name, "logo-link")) 45 else if (!strcmp(name, "logo-link"))
45 cgit_logo_link = xstrdup(value); 46 cgit_logo_link = xstrdup(value);
46 else if (!strcmp(name, "virtual-root")) 47 else if (!strcmp(name, "virtual-root"))
47 cgit_virtual_root = xstrdup(value); 48 cgit_virtual_root = xstrdup(value);
48} 49}
49 50
50void cgit_repo_config_cb(const char *name, const char *value) 51void cgit_repo_config_cb(const char *name, const char *value)
51{ 52{
52 if (!strcmp(name, "name")) 53 if (!strcmp(name, "name"))
53 cgit_repo_name = xstrdup(value); 54 cgit_repo_name = xstrdup(value);
54 else if (!strcmp(name, "desc")) 55 else if (!strcmp(name, "desc"))
55 cgit_repo_desc = xstrdup(value); 56 cgit_repo_desc = xstrdup(value);
56 else if (!strcmp(name, "owner")) 57 else if (!strcmp(name, "owner"))
57 cgit_repo_owner = xstrdup(value); 58 cgit_repo_owner = xstrdup(value);
58} 59}
59 60
60void cgit_querystring_cb(const char *name, const char *value) 61void cgit_querystring_cb(const char *name, const char *value)
61{ 62{
62 if (!strcmp(name,"r")) 63 if (!strcmp(name,"r")) {
63 cgit_query_repo = xstrdup(value); 64 cgit_query_repo = xstrdup(value);
64 else if (!strcmp(name, "p")) 65 } else if (!strcmp(name, "p")) {
65 cgit_query_page = xstrdup(value); 66 cgit_query_page = xstrdup(value);
66 else if (!strcmp(name, "h")) { 67 } else if (!strcmp(name, "h")) {
67 cgit_query_head = xstrdup(value); 68 cgit_query_head = xstrdup(value);
68 cgit_query_has_symref = 1; 69 cgit_query_has_symref = 1;
69 } else if (!strcmp(name, "id")) { 70 } else if (!strcmp(name, "id")) {
70 cgit_query_sha1 = xstrdup(value); 71 cgit_query_sha1 = xstrdup(value);
71 cgit_query_has_sha1 = 1; 72 cgit_query_has_sha1 = 1;
73 } else if (!strcmp(name, "ofs")) {
74 cgit_query_ofs = atoi(value);
72 } 75 }
73} 76}
74 77
diff --git a/ui-log.c b/ui-log.c
index 4d2c2e0..dce50f7 100644
--- a/ui-log.c
+++ b/ui-log.c
@@ -82,39 +82,66 @@ static void cgit_print_commit_shortlog(struct commit *commit)
82 html_link_close(); 82 html_link_close();
83 html("</td><td>"); 83 html("</td><td>");
84 html_txt(author); 84 html_txt(author);
85 html("</td><td><a href='"); 85 html("</td><td><a href='");
86 html_attr(cgit_pageurl(cgit_query_repo, "tree", 86 html_attr(cgit_pageurl(cgit_query_repo, "tree",
87 fmt("id=%s", 87 fmt("id=%s",
88 sha1_to_hex(commit->tree->object.sha1)))); 88 sha1_to_hex(commit->tree->object.sha1))));
89 html("'>tree</a>"); 89 html("'>tree</a>");
90 html("</td></tr>\n"); 90 html("</td></tr>\n");
91} 91}
92 92
93void cgit_print_log(const char *tip, int ofs, int cnt) 93void cgit_print_log(const char *tip, int ofs, int cnt)
94{ 94{
95 struct rev_info rev; 95 struct rev_info rev;
96 struct commit *commit; 96 struct commit *commit;
97 const char *argv[2] = {NULL, tip}; 97 const char *argv[2] = {NULL, tip};
98 int n = 0; 98 int i;
99 99
100 init_revisions(&rev, NULL); 100 init_revisions(&rev, NULL);
101 rev.abbrev = DEFAULT_ABBREV; 101 rev.abbrev = DEFAULT_ABBREV;
102 rev.commit_format = CMIT_FMT_DEFAULT; 102 rev.commit_format = CMIT_FMT_DEFAULT;
103 rev.verbose_header = 1; 103 rev.verbose_header = 1;
104 rev.show_root_diff = 0; 104 rev.show_root_diff = 0;
105 setup_revisions(2, argv, &rev, NULL); 105 setup_revisions(2, argv, &rev, NULL);
106 prepare_revision_walk(&rev); 106 prepare_revision_walk(&rev);
107 107
108 html("<h2>Log</h2>"); 108 html("<h2>Log</h2>");
109 html("<table class='list'>"); 109 html("<table class='list'>");
110 html("<tr><th>Date</th><th>Message</th><th>Author</th><th>Link</th></tr>\n"); 110 html("<tr><th>Date</th><th>Message</th><th>Author</th><th>Link</th></tr>\n");
111 while ((commit = get_revision(&rev)) != NULL && n++ < 100) { 111
112 if (ofs<0)
113 ofs = 0;
114
115 for (i = 0; i < ofs && (commit = get_revision(&rev)) != NULL; i++) {
116 free(commit->buffer);
117 commit->buffer = NULL;
118 free_commit_list(commit->parents);
119 commit->parents = NULL;
120 }
121
122 for (i = 0; i < cnt && (commit = get_revision(&rev)) != NULL; i++) {
112 cgit_print_commit_shortlog(commit); 123 cgit_print_commit_shortlog(commit);
113 free(commit->buffer); 124 free(commit->buffer);
114 commit->buffer = NULL; 125 commit->buffer = NULL;
115 free_commit_list(commit->parents); 126 free_commit_list(commit->parents);
116 commit->parents = NULL; 127 commit->parents = NULL;
117 } 128 }
118 html("</table>\n"); 129 html("</table>\n");
130
131 html("<div class='pager'>");
132 if (ofs > 0) {
133 html("&nbsp;<a href='");
134 html(cgit_pageurl(cgit_query_repo, cgit_query_page,
135 fmt("h=%s&ofs=%d", tip, ofs-cnt)));
136 html("'>[prev]</a>&nbsp;");
137 }
138
139 if ((commit = get_revision(&rev)) != NULL) {
140 html("&nbsp;<a href='");
141 html(cgit_pageurl(cgit_query_repo, "log",
142 fmt("h=%s&ofs=%d", tip, ofs+cnt)));
143 html("'>[next]</a>&nbsp;");
144 }
145 html("</div>");
119} 146}
120 147