summaryrefslogtreecommitdiffabout
path: root/cgit.c
authorLars Hjemli <hjemli@gmail.com>2007-05-15 22:58:35 (UTC)
committer Lars Hjemli <hjemli@gmail.com>2007-05-15 22:58:35 (UTC)
commitf9ff7df613b4ee86fe5914c4ae3400650882c03d (patch) (unidiff)
treec26fde3a4d3485943c275232f18359bebd133f1a /cgit.c
parenta2ddc10479ec463708e422ca5ce7ec02c22a7d02 (diff)
downloadcgit-f9ff7df613b4ee86fe5914c4ae3400650882c03d.zip
cgit-f9ff7df613b4ee86fe5914c4ae3400650882c03d.tar.gz
cgit-f9ff7df613b4ee86fe5914c4ae3400650882c03d.tar.bz2
Add support for commitdiff via h parameter
The commitdiff will be generated against the first parent, and the diff page also gets the benefit of repo.defbranch. Cleaned up some bad whitespace in cgit.h while at it. Signed-off-by: Lars Hjemli <hjemli@gmail.com>
Diffstat (limited to 'cgit.c') (more/less context) (ignore whitespace changes)
-rw-r--r--cgit.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/cgit.c b/cgit.c
index 9b4815d..3e7e595 100644
--- a/cgit.c
+++ b/cgit.c
@@ -27,193 +27,194 @@ static struct repoinfo *cgit_get_repoinfo(char *url)
27 27
28static int cgit_prepare_cache(struct cacheitem *item) 28static int cgit_prepare_cache(struct cacheitem *item)
29{ 29{
30 if (!cgit_query_repo) { 30 if (!cgit_query_repo) {
31 item->name = xstrdup(fmt("%s/index.html", cgit_cache_root)); 31 item->name = xstrdup(fmt("%s/index.html", cgit_cache_root));
32 item->ttl = cgit_cache_root_ttl; 32 item->ttl = cgit_cache_root_ttl;
33 return 1; 33 return 1;
34 } 34 }
35 cgit_repo = cgit_get_repoinfo(cgit_query_repo); 35 cgit_repo = cgit_get_repoinfo(cgit_query_repo);
36 if (!cgit_repo) { 36 if (!cgit_repo) {
37 char *title = fmt("%s - %s", cgit_root_title, "Bad request"); 37 char *title = fmt("%s - %s", cgit_root_title, "Bad request");
38 cgit_print_docstart(title, item); 38 cgit_print_docstart(title, item);
39 cgit_print_pageheader(title, 0); 39 cgit_print_pageheader(title, 0);
40 cgit_print_error(fmt("Unknown repo: %s", cgit_query_repo)); 40 cgit_print_error(fmt("Unknown repo: %s", cgit_query_repo));
41 cgit_print_docend(); 41 cgit_print_docend();
42 return 0; 42 return 0;
43 } 43 }
44 44
45 if (!cgit_query_page) { 45 if (!cgit_query_page) {
46 item->name = xstrdup(fmt("%s/%s/index.html", cgit_cache_root, 46 item->name = xstrdup(fmt("%s/%s/index.html", cgit_cache_root,
47 cgit_repo->url)); 47 cgit_repo->url));
48 item->ttl = cgit_cache_repo_ttl; 48 item->ttl = cgit_cache_repo_ttl;
49 } else { 49 } else {
50 item->name = xstrdup(fmt("%s/%s/%s/%s.html", cgit_cache_root, 50 item->name = xstrdup(fmt("%s/%s/%s/%s.html", cgit_cache_root,
51 cgit_repo->url, cgit_query_page, 51 cgit_repo->url, cgit_query_page,
52 cache_safe_filename(cgit_querystring))); 52 cache_safe_filename(cgit_querystring)));
53 if (cgit_query_has_symref) 53 if (cgit_query_has_symref)
54 item->ttl = cgit_cache_dynamic_ttl; 54 item->ttl = cgit_cache_dynamic_ttl;
55 else if (cgit_query_has_sha1) 55 else if (cgit_query_has_sha1)
56 item->ttl = cgit_cache_static_ttl; 56 item->ttl = cgit_cache_static_ttl;
57 else 57 else
58 item->ttl = cgit_cache_repo_ttl; 58 item->ttl = cgit_cache_repo_ttl;
59 } 59 }
60 return 1; 60 return 1;
61} 61}
62 62
63static void cgit_print_repo_page(struct cacheitem *item) 63static void cgit_print_repo_page(struct cacheitem *item)
64{ 64{
65 char *title; 65 char *title;
66 int show_search; 66 int show_search;
67 67
68 if (!cgit_query_head) 68 if (!cgit_query_head)
69 cgit_query_head = cgit_repo->defbranch; 69 cgit_query_head = cgit_repo->defbranch;
70 70
71 if (chdir(cgit_repo->path)) { 71 if (chdir(cgit_repo->path)) {
72 title = fmt("%s - %s", cgit_root_title, "Bad request"); 72 title = fmt("%s - %s", cgit_root_title, "Bad request");
73 cgit_print_docstart(title, item); 73 cgit_print_docstart(title, item);
74 cgit_print_pageheader(title, 0); 74 cgit_print_pageheader(title, 0);
75 cgit_print_error(fmt("Unable to scan repository: %s", 75 cgit_print_error(fmt("Unable to scan repository: %s",
76 strerror(errno))); 76 strerror(errno)));
77 cgit_print_docend(); 77 cgit_print_docend();
78 return; 78 return;
79 } 79 }
80 80
81 title = fmt("%s - %s", cgit_repo->name, cgit_repo->desc); 81 title = fmt("%s - %s", cgit_repo->name, cgit_repo->desc);
82 show_search = 0; 82 show_search = 0;
83 setenv("GIT_DIR", cgit_repo->path, 1); 83 setenv("GIT_DIR", cgit_repo->path, 1);
84 84
85 if (cgit_query_page) { 85 if (cgit_query_page) {
86 if (cgit_repo->snapshots && !strcmp(cgit_query_page, "snapshot")) { 86 if (cgit_repo->snapshots && !strcmp(cgit_query_page, "snapshot")) {
87 cgit_print_snapshot(item, cgit_query_sha1, "zip", 87 cgit_print_snapshot(item, cgit_query_sha1, "zip",
88 cgit_repo->url, cgit_query_name); 88 cgit_repo->url, cgit_query_name);
89 return; 89 return;
90 } 90 }
91 if (!strcmp(cgit_query_page, "blob")) { 91 if (!strcmp(cgit_query_page, "blob")) {
92 cgit_print_blob(item, cgit_query_sha1, cgit_query_path); 92 cgit_print_blob(item, cgit_query_sha1, cgit_query_path);
93 return; 93 return;
94 } 94 }
95 } 95 }
96 96
97 if (cgit_query_page && !strcmp(cgit_query_page, "log")) 97 if (cgit_query_page && !strcmp(cgit_query_page, "log"))
98 show_search = 1; 98 show_search = 1;
99 99
100 cgit_print_docstart(title, item); 100 cgit_print_docstart(title, item);
101 101
102 102
103 if (!cgit_query_page) { 103 if (!cgit_query_page) {
104 cgit_print_pageheader("summary", show_search); 104 cgit_print_pageheader("summary", show_search);
105 cgit_print_summary(); 105 cgit_print_summary();
106 cgit_print_docend(); 106 cgit_print_docend();
107 return; 107 return;
108 } 108 }
109 109
110 cgit_print_pageheader(cgit_query_page, show_search); 110 cgit_print_pageheader(cgit_query_page, show_search);
111 111
112 if (!strcmp(cgit_query_page, "log")) { 112 if (!strcmp(cgit_query_page, "log")) {
113 cgit_print_log(cgit_query_head, cgit_query_ofs, 113 cgit_print_log(cgit_query_head, cgit_query_ofs,
114 cgit_max_commit_count, cgit_query_search, 114 cgit_max_commit_count, cgit_query_search,
115 cgit_query_path); 115 cgit_query_path);
116 } else if (!strcmp(cgit_query_page, "tree")) { 116 } else if (!strcmp(cgit_query_page, "tree")) {
117 cgit_print_tree(cgit_query_head, cgit_query_sha1, cgit_query_path); 117 cgit_print_tree(cgit_query_head, cgit_query_sha1, cgit_query_path);
118 } else if (!strcmp(cgit_query_page, "commit")) { 118 } else if (!strcmp(cgit_query_page, "commit")) {
119 cgit_print_commit(cgit_query_head); 119 cgit_print_commit(cgit_query_head);
120 } else if (!strcmp(cgit_query_page, "view")) { 120 } else if (!strcmp(cgit_query_page, "view")) {
121 cgit_print_view(cgit_query_sha1, cgit_query_path); 121 cgit_print_view(cgit_query_sha1, cgit_query_path);
122 } else if (!strcmp(cgit_query_page, "diff")) { 122 } else if (!strcmp(cgit_query_page, "diff")) {
123 cgit_print_diff(cgit_query_sha1, cgit_query_sha2, cgit_query_path); 123 cgit_print_diff(cgit_query_head, cgit_query_sha1, cgit_query_sha2,
124 cgit_query_path);
124 } else { 125 } else {
125 cgit_print_error("Invalid request"); 126 cgit_print_error("Invalid request");
126 } 127 }
127 cgit_print_docend(); 128 cgit_print_docend();
128} 129}
129 130
130static void cgit_fill_cache(struct cacheitem *item, int use_cache) 131static void cgit_fill_cache(struct cacheitem *item, int use_cache)
131{ 132{
132 static char buf[PATH_MAX]; 133 static char buf[PATH_MAX];
133 int stdout2; 134 int stdout2;
134 135
135 getcwd(buf, sizeof(buf)); 136 getcwd(buf, sizeof(buf));
136 item->st.st_mtime = time(NULL); 137 item->st.st_mtime = time(NULL);
137 138
138 if (use_cache) { 139 if (use_cache) {
139 stdout2 = chk_positive(dup(STDOUT_FILENO), 140 stdout2 = chk_positive(dup(STDOUT_FILENO),
140 "Preserving STDOUT"); 141 "Preserving STDOUT");
141 chk_zero(close(STDOUT_FILENO), "Closing STDOUT"); 142 chk_zero(close(STDOUT_FILENO), "Closing STDOUT");
142 chk_positive(dup2(item->fd, STDOUT_FILENO), "Dup2(cachefile)"); 143 chk_positive(dup2(item->fd, STDOUT_FILENO), "Dup2(cachefile)");
143 } 144 }
144 145
145 if (cgit_query_repo) 146 if (cgit_query_repo)
146 cgit_print_repo_page(item); 147 cgit_print_repo_page(item);
147 else 148 else
148 cgit_print_repolist(item); 149 cgit_print_repolist(item);
149 150
150 if (use_cache) { 151 if (use_cache) {
151 chk_zero(close(STDOUT_FILENO), "Close redirected STDOUT"); 152 chk_zero(close(STDOUT_FILENO), "Close redirected STDOUT");
152 chk_positive(dup2(stdout2, STDOUT_FILENO), 153 chk_positive(dup2(stdout2, STDOUT_FILENO),
153 "Restoring original STDOUT"); 154 "Restoring original STDOUT");
154 chk_zero(close(stdout2), "Closing temporary STDOUT"); 155 chk_zero(close(stdout2), "Closing temporary STDOUT");
155 } 156 }
156 157
157 chdir(buf); 158 chdir(buf);
158} 159}
159 160
160static void cgit_check_cache(struct cacheitem *item) 161static void cgit_check_cache(struct cacheitem *item)
161{ 162{
162 int i = 0; 163 int i = 0;
163 164
164 top: 165 top:
165 if (++i > cgit_max_lock_attempts) { 166 if (++i > cgit_max_lock_attempts) {
166 die("cgit_refresh_cache: unable to lock %s: %s", 167 die("cgit_refresh_cache: unable to lock %s: %s",
167 item->name, strerror(errno)); 168 item->name, strerror(errno));
168 } 169 }
169 if (!cache_exist(item)) { 170 if (!cache_exist(item)) {
170 if (!cache_lock(item)) { 171 if (!cache_lock(item)) {
171 sleep(1); 172 sleep(1);
172 goto top; 173 goto top;
173 } 174 }
174 if (!cache_exist(item)) { 175 if (!cache_exist(item)) {
175 cgit_fill_cache(item, 1); 176 cgit_fill_cache(item, 1);
176 cache_unlock(item); 177 cache_unlock(item);
177 } else { 178 } else {
178 cache_cancel_lock(item); 179 cache_cancel_lock(item);
179 } 180 }
180 } else if (cache_expired(item) && cache_lock(item)) { 181 } else if (cache_expired(item) && cache_lock(item)) {
181 if (cache_expired(item)) { 182 if (cache_expired(item)) {
182 cgit_fill_cache(item, 1); 183 cgit_fill_cache(item, 1);
183 cache_unlock(item); 184 cache_unlock(item);
184 } else { 185 } else {
185 cache_cancel_lock(item); 186 cache_cancel_lock(item);
186 } 187 }
187 } 188 }
188} 189}
189 190
190static void cgit_print_cache(struct cacheitem *item) 191static void cgit_print_cache(struct cacheitem *item)
191{ 192{
192 static char buf[4096]; 193 static char buf[4096];
193 ssize_t i; 194 ssize_t i;
194 195
195 int fd = open(item->name, O_RDONLY); 196 int fd = open(item->name, O_RDONLY);
196 if (fd<0) 197 if (fd<0)
197 die("Unable to open cached file %s", item->name); 198 die("Unable to open cached file %s", item->name);
198 199
199 while((i=read(fd, buf, sizeof(buf))) > 0) 200 while((i=read(fd, buf, sizeof(buf))) > 0)
200 write(STDOUT_FILENO, buf, i); 201 write(STDOUT_FILENO, buf, i);
201 202
202 close(fd); 203 close(fd);
203} 204}
204 205
205static void cgit_parse_args(int argc, const char **argv) 206static void cgit_parse_args(int argc, const char **argv)
206{ 207{
207 int i; 208 int i;
208 209
209 for (i = 1; i < argc; i++) { 210 for (i = 1; i < argc; i++) {
210 if (!strncmp(argv[i], "--cache=", 8)) { 211 if (!strncmp(argv[i], "--cache=", 8)) {
211 cgit_cache_root = xstrdup(argv[i]+8); 212 cgit_cache_root = xstrdup(argv[i]+8);
212 } 213 }
213 if (!strcmp(argv[i], "--nocache")) { 214 if (!strcmp(argv[i], "--nocache")) {
214 cgit_nocache = 1; 215 cgit_nocache = 1;
215 } 216 }
216 if (!strncmp(argv[i], "--query=", 8)) { 217 if (!strncmp(argv[i], "--query=", 8)) {
217 cgit_querystring = xstrdup(argv[i]+8); 218 cgit_querystring = xstrdup(argv[i]+8);
218 } 219 }
219 if (!strncmp(argv[i], "--repo=", 7)) { 220 if (!strncmp(argv[i], "--repo=", 7)) {