summaryrefslogtreecommitdiffabout
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--cgit.h1
-rw-r--r--html.c14
2 files changed, 15 insertions, 0 deletions
diff --git a/cgit.h b/cgit.h
index f3d783e..fc44a71 100644
--- a/cgit.h
+++ b/cgit.h
@@ -1,186 +1,187 @@
1#ifndef CGIT_H 1#ifndef CGIT_H
2#define CGIT_H 2#define CGIT_H
3 3
4 4
5#include <git-compat-util.h> 5#include <git-compat-util.h>
6#include <cache.h> 6#include <cache.h>
7#include <grep.h> 7#include <grep.h>
8#include <object.h> 8#include <object.h>
9#include <tree.h> 9#include <tree.h>
10#include <commit.h> 10#include <commit.h>
11#include <tag.h> 11#include <tag.h>
12#include <diff.h> 12#include <diff.h>
13#include <diffcore.h> 13#include <diffcore.h>
14#include <refs.h> 14#include <refs.h>
15#include <revision.h> 15#include <revision.h>
16#include <log-tree.h> 16#include <log-tree.h>
17#include <archive.h> 17#include <archive.h>
18#include <xdiff/xdiff.h> 18#include <xdiff/xdiff.h>
19 19
20 20
21typedef void (*configfn)(const char *name, const char *value); 21typedef void (*configfn)(const char *name, const char *value);
22typedef void (*filepair_fn)(struct diff_filepair *pair); 22typedef void (*filepair_fn)(struct diff_filepair *pair);
23typedef void (*linediff_fn)(char *line, int len); 23typedef void (*linediff_fn)(char *line, int len);
24 24
25struct cacheitem { 25struct cacheitem {
26 char *name; 26 char *name;
27 struct stat st; 27 struct stat st;
28 int ttl; 28 int ttl;
29 int fd; 29 int fd;
30}; 30};
31 31
32struct repoinfo { 32struct repoinfo {
33 char *url; 33 char *url;
34 char *name; 34 char *name;
35 char *path; 35 char *path;
36 char *desc; 36 char *desc;
37 char *owner; 37 char *owner;
38 char *defbranch; 38 char *defbranch;
39 char *module_link; 39 char *module_link;
40 int snapshots; 40 int snapshots;
41 int enable_log_filecount; 41 int enable_log_filecount;
42 int enable_log_linecount; 42 int enable_log_linecount;
43}; 43};
44 44
45struct repolist { 45struct repolist {
46 int length; 46 int length;
47 int count; 47 int count;
48 struct repoinfo *repos; 48 struct repoinfo *repos;
49}; 49};
50 50
51struct commitinfo { 51struct commitinfo {
52 struct commit *commit; 52 struct commit *commit;
53 char *author; 53 char *author;
54 char *author_email; 54 char *author_email;
55 unsigned long author_date; 55 unsigned long author_date;
56 char *committer; 56 char *committer;
57 char *committer_email; 57 char *committer_email;
58 unsigned long committer_date; 58 unsigned long committer_date;
59 char *subject; 59 char *subject;
60 char *msg; 60 char *msg;
61}; 61};
62 62
63struct taginfo { 63struct taginfo {
64 char *tagger; 64 char *tagger;
65 char *tagger_email; 65 char *tagger_email;
66 int tagger_date; 66 int tagger_date;
67 char *msg; 67 char *msg;
68}; 68};
69 69
70extern const char cgit_version[]; 70extern const char cgit_version[];
71 71
72extern struct repolist cgit_repolist; 72extern struct repolist cgit_repolist;
73extern struct repoinfo *cgit_repo; 73extern struct repoinfo *cgit_repo;
74 74
75extern char *cgit_root_title; 75extern char *cgit_root_title;
76extern char *cgit_css; 76extern char *cgit_css;
77extern char *cgit_logo; 77extern char *cgit_logo;
78extern char *cgit_logo_link; 78extern char *cgit_logo_link;
79extern char *cgit_module_link; 79extern char *cgit_module_link;
80extern char *cgit_virtual_root; 80extern char *cgit_virtual_root;
81extern char *cgit_script_name; 81extern char *cgit_script_name;
82extern char *cgit_cache_root; 82extern char *cgit_cache_root;
83 83
84extern int cgit_nocache; 84extern int cgit_nocache;
85extern int cgit_snapshots; 85extern int cgit_snapshots;
86extern int cgit_enable_log_filecount; 86extern int cgit_enable_log_filecount;
87extern int cgit_enable_log_linecount; 87extern int cgit_enable_log_linecount;
88extern int cgit_max_lock_attempts; 88extern int cgit_max_lock_attempts;
89extern int cgit_cache_root_ttl; 89extern int cgit_cache_root_ttl;
90extern int cgit_cache_repo_ttl; 90extern int cgit_cache_repo_ttl;
91extern int cgit_cache_dynamic_ttl; 91extern int cgit_cache_dynamic_ttl;
92extern int cgit_cache_static_ttl; 92extern int cgit_cache_static_ttl;
93extern int cgit_cache_max_create_time; 93extern int cgit_cache_max_create_time;
94 94
95extern int cgit_max_msg_len; 95extern int cgit_max_msg_len;
96extern int cgit_max_repodesc_len; 96extern int cgit_max_repodesc_len;
97extern int cgit_max_commit_count; 97extern int cgit_max_commit_count;
98 98
99extern int cgit_query_has_symref; 99extern int cgit_query_has_symref;
100extern int cgit_query_has_sha1; 100extern int cgit_query_has_sha1;
101 101
102extern char *cgit_querystring; 102extern char *cgit_querystring;
103extern char *cgit_query_repo; 103extern char *cgit_query_repo;
104extern char *cgit_query_page; 104extern char *cgit_query_page;
105extern char *cgit_query_search; 105extern char *cgit_query_search;
106extern char *cgit_query_head; 106extern char *cgit_query_head;
107extern char *cgit_query_sha1; 107extern char *cgit_query_sha1;
108extern char *cgit_query_sha2; 108extern char *cgit_query_sha2;
109extern char *cgit_query_path; 109extern char *cgit_query_path;
110extern char *cgit_query_name; 110extern char *cgit_query_name;
111extern int cgit_query_ofs; 111extern int cgit_query_ofs;
112 112
113extern int htmlfd; 113extern int htmlfd;
114 114
115extern void cgit_global_config_cb(const char *name, const char *value); 115extern void cgit_global_config_cb(const char *name, const char *value);
116extern void cgit_repo_config_cb(const char *name, const char *value); 116extern void cgit_repo_config_cb(const char *name, const char *value);
117extern void cgit_querystring_cb(const char *name, const char *value); 117extern void cgit_querystring_cb(const char *name, const char *value);
118 118
119extern int chk_zero(int result, char *msg); 119extern int chk_zero(int result, char *msg);
120extern int chk_positive(int result, char *msg); 120extern int chk_positive(int result, char *msg);
121 121
122extern int hextoint(char c); 122extern int hextoint(char c);
123 123
124extern void *cgit_free_commitinfo(struct commitinfo *info); 124extern void *cgit_free_commitinfo(struct commitinfo *info);
125 125
126extern int cgit_diff_files(const unsigned char *old_sha1, 126extern int cgit_diff_files(const unsigned char *old_sha1,
127 const unsigned char *new_sha1, 127 const unsigned char *new_sha1,
128 linediff_fn fn); 128 linediff_fn fn);
129 129
130extern void cgit_diff_tree(const unsigned char *old_sha1, 130extern void cgit_diff_tree(const unsigned char *old_sha1,
131 const unsigned char *new_sha1, 131 const unsigned char *new_sha1,
132 filepair_fn fn); 132 filepair_fn fn);
133 133
134extern void cgit_diff_commit(struct commit *commit, filepair_fn fn); 134extern void cgit_diff_commit(struct commit *commit, filepair_fn fn);
135 135
136extern char *fmt(const char *format,...); 136extern char *fmt(const char *format,...);
137 137
138extern void html(const char *txt); 138extern void html(const char *txt);
139extern void htmlf(const char *format,...); 139extern void htmlf(const char *format,...);
140extern void html_txt(char *txt); 140extern void html_txt(char *txt);
141extern void html_ntxt(int len, char *txt); 141extern void html_ntxt(int len, char *txt);
142extern void html_attr(char *txt); 142extern void html_attr(char *txt);
143extern void html_hidden(char *name, char *value); 143extern void html_hidden(char *name, char *value);
144extern void html_link_open(char *url, char *title, char *class); 144extern void html_link_open(char *url, char *title, char *class);
145extern void html_link_close(void); 145extern void html_link_close(void);
146extern void html_filemode(unsigned short mode); 146extern void html_filemode(unsigned short mode);
147extern int html_include(const char *filename);
147 148
148extern int cgit_read_config(const char *filename, configfn fn); 149extern int cgit_read_config(const char *filename, configfn fn);
149extern int cgit_parse_query(char *txt, configfn fn); 150extern int cgit_parse_query(char *txt, configfn fn);
150extern struct commitinfo *cgit_parse_commit(struct commit *commit); 151extern struct commitinfo *cgit_parse_commit(struct commit *commit);
151extern struct taginfo *cgit_parse_tag(struct tag *tag); 152extern struct taginfo *cgit_parse_tag(struct tag *tag);
152 153
153extern char *cache_safe_filename(const char *unsafe); 154extern char *cache_safe_filename(const char *unsafe);
154extern int cache_lock(struct cacheitem *item); 155extern int cache_lock(struct cacheitem *item);
155extern int cache_unlock(struct cacheitem *item); 156extern int cache_unlock(struct cacheitem *item);
156extern int cache_cancel_lock(struct cacheitem *item); 157extern int cache_cancel_lock(struct cacheitem *item);
157extern int cache_exist(struct cacheitem *item); 158extern int cache_exist(struct cacheitem *item);
158extern int cache_expired(struct cacheitem *item); 159extern int cache_expired(struct cacheitem *item);
159 160
160extern char *cgit_repourl(const char *reponame); 161extern char *cgit_repourl(const char *reponame);
161extern char *cgit_pageurl(const char *reponame, const char *pagename, 162extern char *cgit_pageurl(const char *reponame, const char *pagename,
162 const char *query); 163 const char *query);
163 164
164extern void cgit_print_error(char *msg); 165extern void cgit_print_error(char *msg);
165extern void cgit_print_date(unsigned long secs); 166extern void cgit_print_date(unsigned long secs);
166extern void cgit_print_docstart(char *title, struct cacheitem *item); 167extern void cgit_print_docstart(char *title, struct cacheitem *item);
167extern void cgit_print_docend(); 168extern void cgit_print_docend();
168extern void cgit_print_pageheader(char *title, int show_search); 169extern void cgit_print_pageheader(char *title, int show_search);
169extern void cgit_print_snapshot_start(const char *mimetype, 170extern void cgit_print_snapshot_start(const char *mimetype,
170 const char *filename, 171 const char *filename,
171 struct cacheitem *item); 172 struct cacheitem *item);
172 173
173extern void cgit_print_repolist(struct cacheitem *item); 174extern void cgit_print_repolist(struct cacheitem *item);
174extern void cgit_print_summary(); 175extern void cgit_print_summary();
175extern void cgit_print_log(const char *tip, int ofs, int cnt, char *grep, char *path); 176extern void cgit_print_log(const char *tip, int ofs, int cnt, char *grep, char *path);
176extern void cgit_print_view(const char *hex, char *path); 177extern void cgit_print_view(const char *hex, char *path);
177extern void cgit_print_blob(struct cacheitem *item, const char *hex, char *path); 178extern void cgit_print_blob(struct cacheitem *item, const char *hex, char *path);
178extern void cgit_print_tree(const char *rev, const char *hex, char *path); 179extern void cgit_print_tree(const char *rev, const char *hex, char *path);
179extern void cgit_print_commit(const char *hex); 180extern void cgit_print_commit(const char *hex);
180extern void cgit_print_diff(const char *head, const char *old_hex, const char *new_hex, 181extern void cgit_print_diff(const char *head, const char *old_hex, const char *new_hex,
181 char *path); 182 char *path);
182extern void cgit_print_snapshot(struct cacheitem *item, const char *hex, 183extern void cgit_print_snapshot(struct cacheitem *item, const char *hex,
183 const char *format, const char *prefix, 184 const char *format, const char *prefix,
184 const char *filename); 185 const char *filename);
185 186
186#endif /* CGIT_H */ 187#endif /* CGIT_H */
diff --git a/html.c b/html.c
index 175b4b6..33a956f 100644
--- a/html.c
+++ b/html.c
@@ -1,168 +1,182 @@
1/* html.c: helper functions for html output 1/* html.c: helper functions for html output
2 * 2 *
3 * Copyright (C) 2006 Lars Hjemli 3 * Copyright (C) 2006 Lars Hjemli
4 * 4 *
5 * Licensed under GNU General Public License v2 5 * Licensed under GNU General Public License v2
6 * (see COPYING for full license text) 6 * (see COPYING for full license text)
7 */ 7 */
8 8
9#include "cgit.h" 9#include "cgit.h"
10 10
11char *fmt(const char *format, ...) 11char *fmt(const char *format, ...)
12{ 12{
13 static char buf[8][1024]; 13 static char buf[8][1024];
14 static int bufidx; 14 static int bufidx;
15 int len; 15 int len;
16 va_list args; 16 va_list args;
17 17
18 bufidx++; 18 bufidx++;
19 bufidx &= 7; 19 bufidx &= 7;
20 20
21 va_start(args, format); 21 va_start(args, format);
22 len = vsnprintf(buf[bufidx], sizeof(buf[bufidx]), format, args); 22 len = vsnprintf(buf[bufidx], sizeof(buf[bufidx]), format, args);
23 va_end(args); 23 va_end(args);
24 if (len>sizeof(buf[bufidx])) 24 if (len>sizeof(buf[bufidx]))
25 die("[html.c] string truncated: %s", format); 25 die("[html.c] string truncated: %s", format);
26 return buf[bufidx]; 26 return buf[bufidx];
27} 27}
28 28
29void html(const char *txt) 29void html(const char *txt)
30{ 30{
31 write(htmlfd, txt, strlen(txt)); 31 write(htmlfd, txt, strlen(txt));
32} 32}
33 33
34void htmlf(const char *format, ...) 34void htmlf(const char *format, ...)
35{ 35{
36 static char buf[65536]; 36 static char buf[65536];
37 va_list args; 37 va_list args;
38 38
39 va_start(args, format); 39 va_start(args, format);
40 vsnprintf(buf, sizeof(buf), format, args); 40 vsnprintf(buf, sizeof(buf), format, args);
41 va_end(args); 41 va_end(args);
42 html(buf); 42 html(buf);
43} 43}
44 44
45void html_txt(char *txt) 45void html_txt(char *txt)
46{ 46{
47 char *t = txt; 47 char *t = txt;
48 while(t && *t){ 48 while(t && *t){
49 int c = *t; 49 int c = *t;
50 if (c=='<' || c=='>' || c=='&') { 50 if (c=='<' || c=='>' || c=='&') {
51 *t = '\0'; 51 *t = '\0';
52 html(txt); 52 html(txt);
53 *t = c; 53 *t = c;
54 if (c=='>') 54 if (c=='>')
55 html("&gt;"); 55 html("&gt;");
56 else if (c=='<') 56 else if (c=='<')
57 html("&lt;"); 57 html("&lt;");
58 else if (c=='&') 58 else if (c=='&')
59 html("&amp;"); 59 html("&amp;");
60 txt = t+1; 60 txt = t+1;
61 } 61 }
62 t++; 62 t++;
63 } 63 }
64 if (t!=txt) 64 if (t!=txt)
65 html(txt); 65 html(txt);
66} 66}
67 67
68void html_ntxt(int len, char *txt) 68void html_ntxt(int len, char *txt)
69{ 69{
70 char *t = txt; 70 char *t = txt;
71 while(t && *t && len--){ 71 while(t && *t && len--){
72 int c = *t; 72 int c = *t;
73 if (c=='<' || c=='>' || c=='&') { 73 if (c=='<' || c=='>' || c=='&') {
74 *t = '\0'; 74 *t = '\0';
75 html(txt); 75 html(txt);
76 *t = c; 76 *t = c;
77 if (c=='>') 77 if (c=='>')
78 html("&gt;"); 78 html("&gt;");
79 else if (c=='<') 79 else if (c=='<')
80 html("&lt;"); 80 html("&lt;");
81 else if (c=='&') 81 else if (c=='&')
82 html("&amp;"); 82 html("&amp;");
83 txt = t+1; 83 txt = t+1;
84 } 84 }
85 t++; 85 t++;
86 } 86 }
87 if (t!=txt) { 87 if (t!=txt) {
88 char c = *t; 88 char c = *t;
89 *t = '\0'; 89 *t = '\0';
90 html(txt); 90 html(txt);
91 *t = c; 91 *t = c;
92 } 92 }
93 if (len<0) 93 if (len<0)
94 html("..."); 94 html("...");
95} 95}
96 96
97void html_attr(char *txt) 97void html_attr(char *txt)
98{ 98{
99 char *t = txt; 99 char *t = txt;
100 while(t && *t){ 100 while(t && *t){
101 int c = *t; 101 int c = *t;
102 if (c=='<' || c=='>' || c=='\'') { 102 if (c=='<' || c=='>' || c=='\'') {
103 *t = '\0'; 103 *t = '\0';
104 html(txt); 104 html(txt);
105 *t = c; 105 *t = c;
106 if (c=='>') 106 if (c=='>')
107 html("&gt;"); 107 html("&gt;");
108 else if (c=='<') 108 else if (c=='<')
109 html("&lt;"); 109 html("&lt;");
110 else if (c=='\'') 110 else if (c=='\'')
111 html("&quote;"); 111 html("&quote;");
112 txt = t+1; 112 txt = t+1;
113 } 113 }
114 t++; 114 t++;
115 } 115 }
116 if (t!=txt) 116 if (t!=txt)
117 html(txt); 117 html(txt);
118} 118}
119 119
120void html_hidden(char *name, char *value) 120void html_hidden(char *name, char *value)
121{ 121{
122 html("<input type='hidden' name='"); 122 html("<input type='hidden' name='");
123 html_attr(name); 123 html_attr(name);
124 html("' value='"); 124 html("' value='");
125 html_attr(value); 125 html_attr(value);
126 html("'/>"); 126 html("'/>");
127} 127}
128 128
129void html_link_open(char *url, char *title, char *class) 129void html_link_open(char *url, char *title, char *class)
130{ 130{
131 html("<a href='"); 131 html("<a href='");
132 html_attr(url); 132 html_attr(url);
133 if (title) { 133 if (title) {
134 html("' title='"); 134 html("' title='");
135 html_attr(title); 135 html_attr(title);
136 } 136 }
137 if (class) { 137 if (class) {
138 html("' class='"); 138 html("' class='");
139 html_attr(class); 139 html_attr(class);
140 } 140 }
141 html("'>"); 141 html("'>");
142} 142}
143 143
144void html_link_close(void) 144void html_link_close(void)
145{ 145{
146 html("</a>"); 146 html("</a>");
147} 147}
148 148
149void html_fileperm(unsigned short mode) 149void html_fileperm(unsigned short mode)
150{ 150{
151 htmlf("%c%c%c", (mode & 4 ? 'r' : '-'), 151 htmlf("%c%c%c", (mode & 4 ? 'r' : '-'),
152 (mode & 2 ? 'w' : '-'), (mode & 1 ? 'x' : '-')); 152 (mode & 2 ? 'w' : '-'), (mode & 1 ? 'x' : '-'));
153} 153}
154 154
155void html_filemode(unsigned short mode) 155void html_filemode(unsigned short mode)
156{ 156{
157 if (S_ISDIR(mode)) 157 if (S_ISDIR(mode))
158 html("d"); 158 html("d");
159 else if (S_ISLNK(mode)) 159 else if (S_ISLNK(mode))
160 html("l"); 160 html("l");
161 else if (S_ISDIRLNK(mode)) 161 else if (S_ISDIRLNK(mode))
162 html("m"); 162 html("m");
163 else 163 else
164 html("-"); 164 html("-");
165 html_fileperm(mode >> 6); 165 html_fileperm(mode >> 6);
166 html_fileperm(mode >> 3); 166 html_fileperm(mode >> 3);
167 html_fileperm(mode); 167 html_fileperm(mode);
168} 168}
169
170int html_include(const char *filename)
171{
172 FILE *f;
173 char buf[4096];
174 size_t len;
175
176 if (!(f = fopen(filename, "r")))
177 return -1;
178 while((len = fread(buf, 1, 4096, f)) > 0)
179 write(htmlfd, buf, len);
180 fclose(f);
181 return 0;
182}