summaryrefslogtreecommitdiffabout
path: root/shared.c
authorLars Hjemli <hjemli@gmail.com>2007-05-18 11:55:52 (UTC)
committer Lars Hjemli <hjemli@gmail.com>2007-05-18 11:55:52 (UTC)
commite189344a7dfe6fa1b07434d5170e6441dcbaf788 (patch) (unidiff)
treef1500b97f95a710dba27469510114388be435d01 /shared.c
parentc1ad6cb77889880ad0189a689840fbfa6e5cbc80 (diff)
downloadcgit-e189344a7dfe6fa1b07434d5170e6441dcbaf788.zip
cgit-e189344a7dfe6fa1b07434d5170e6441dcbaf788.tar.gz
cgit-e189344a7dfe6fa1b07434d5170e6441dcbaf788.tar.bz2
Add knobs to enable/disable files/lines changed in log view
These columns can cause lots of IO on the server, so add settings to explicitly enable them. Also, add per repo settings to optionally disable the columns if sitewide enabled. While at it, do not allow repo.snapshot to enable snapshots if the global setting is disabled. Signed-off-by: Lars Hjemli <hjemli@gmail.com>
Diffstat (limited to 'shared.c') (more/less context) (ignore whitespace changes)
-rw-r--r--shared.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/shared.c b/shared.c
index 752ceac..53cd9b0 100644
--- a/shared.c
+++ b/shared.c
@@ -1,316 +1,328 @@
1/* shared.c: global vars + some callback functions 1/* shared.c: global vars + some callback functions
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
11struct repolist cgit_repolist; 11struct repolist cgit_repolist;
12struct repoinfo *cgit_repo; 12struct repoinfo *cgit_repo;
13 13
14char *cgit_root_title = "Git repository browser"; 14char *cgit_root_title = "Git repository browser";
15char *cgit_css = "/cgit.css"; 15char *cgit_css = "/cgit.css";
16char *cgit_logo = "/git-logo.png"; 16char *cgit_logo = "/git-logo.png";
17char *cgit_logo_link = "http://www.kernel.org/pub/software/scm/git/docs/"; 17char *cgit_logo_link = "http://www.kernel.org/pub/software/scm/git/docs/";
18char *cgit_module_link = "./?repo=%s&page=commit&id=%s"; 18char *cgit_module_link = "./?repo=%s&page=commit&id=%s";
19char *cgit_virtual_root = NULL; 19char *cgit_virtual_root = NULL;
20char *cgit_script_name = CGIT_SCRIPT_NAME; 20char *cgit_script_name = CGIT_SCRIPT_NAME;
21char *cgit_cache_root = "/var/cache/cgit"; 21char *cgit_cache_root = "/var/cache/cgit";
22 22
23int cgit_nocache = 0; 23int cgit_nocache = 0;
24int cgit_snapshots = 0; 24int cgit_snapshots = 0;
25int cgit_enable_log_filecount = 0;
26int cgit_enable_log_linecount = 0;
25int cgit_max_lock_attempts = 5; 27int cgit_max_lock_attempts = 5;
26int cgit_cache_root_ttl = 5; 28int cgit_cache_root_ttl = 5;
27int cgit_cache_repo_ttl = 5; 29int cgit_cache_repo_ttl = 5;
28int cgit_cache_dynamic_ttl = 5; 30int cgit_cache_dynamic_ttl = 5;
29int cgit_cache_static_ttl = -1; 31int cgit_cache_static_ttl = -1;
30int cgit_cache_max_create_time = 5; 32int cgit_cache_max_create_time = 5;
31 33
32int cgit_max_msg_len = 60; 34int cgit_max_msg_len = 60;
33int cgit_max_repodesc_len = 60; 35int cgit_max_repodesc_len = 60;
34int cgit_max_commit_count = 50; 36int cgit_max_commit_count = 50;
35 37
36int cgit_query_has_symref = 0; 38int cgit_query_has_symref = 0;
37int cgit_query_has_sha1 = 0; 39int cgit_query_has_sha1 = 0;
38 40
39char *cgit_querystring = NULL; 41char *cgit_querystring = NULL;
40char *cgit_query_repo = NULL; 42char *cgit_query_repo = NULL;
41char *cgit_query_page = NULL; 43char *cgit_query_page = NULL;
42char *cgit_query_head = NULL; 44char *cgit_query_head = NULL;
43char *cgit_query_search = NULL; 45char *cgit_query_search = NULL;
44char *cgit_query_sha1 = NULL; 46char *cgit_query_sha1 = NULL;
45char *cgit_query_sha2 = NULL; 47char *cgit_query_sha2 = NULL;
46char *cgit_query_path = NULL; 48char *cgit_query_path = NULL;
47char *cgit_query_name = NULL; 49char *cgit_query_name = NULL;
48int cgit_query_ofs = 0; 50int cgit_query_ofs = 0;
49 51
50int htmlfd = 0; 52int htmlfd = 0;
51 53
52int chk_zero(int result, char *msg) 54int chk_zero(int result, char *msg)
53{ 55{
54 if (result != 0) 56 if (result != 0)
55 die("%s: %s", msg, strerror(errno)); 57 die("%s: %s", msg, strerror(errno));
56 return result; 58 return result;
57} 59}
58 60
59int chk_positive(int result, char *msg) 61int chk_positive(int result, char *msg)
60{ 62{
61 if (result <= 0) 63 if (result <= 0)
62 die("%s: %s", msg, strerror(errno)); 64 die("%s: %s", msg, strerror(errno));
63 return result; 65 return result;
64} 66}
65 67
66struct repoinfo *add_repo(const char *url) 68struct repoinfo *add_repo(const char *url)
67{ 69{
68 struct repoinfo *ret; 70 struct repoinfo *ret;
69 71
70 if (++cgit_repolist.count > cgit_repolist.length) { 72 if (++cgit_repolist.count > cgit_repolist.length) {
71 if (cgit_repolist.length == 0) 73 if (cgit_repolist.length == 0)
72 cgit_repolist.length = 8; 74 cgit_repolist.length = 8;
73 else 75 else
74 cgit_repolist.length *= 2; 76 cgit_repolist.length *= 2;
75 cgit_repolist.repos = xrealloc(cgit_repolist.repos, 77 cgit_repolist.repos = xrealloc(cgit_repolist.repos,
76 cgit_repolist.length * 78 cgit_repolist.length *
77 sizeof(struct repoinfo)); 79 sizeof(struct repoinfo));
78 } 80 }
79 81
80 ret = &cgit_repolist.repos[cgit_repolist.count-1]; 82 ret = &cgit_repolist.repos[cgit_repolist.count-1];
81 ret->url = xstrdup(url); 83 ret->url = xstrdup(url);
82 ret->name = ret->url; 84 ret->name = ret->url;
83 ret->path = NULL; 85 ret->path = NULL;
84 ret->desc = NULL; 86 ret->desc = NULL;
85 ret->owner = NULL; 87 ret->owner = NULL;
86 ret->defbranch = "master"; 88 ret->defbranch = "master";
87 ret->snapshots = cgit_snapshots; 89 ret->snapshots = cgit_snapshots;
90 ret->enable_log_filecount = cgit_enable_log_filecount;
91 ret->enable_log_linecount = cgit_enable_log_linecount;
88 ret->module_link = cgit_module_link; 92 ret->module_link = cgit_module_link;
89 return ret; 93 return ret;
90} 94}
91 95
92void cgit_global_config_cb(const char *name, const char *value) 96void cgit_global_config_cb(const char *name, const char *value)
93{ 97{
94 if (!strcmp(name, "root-title")) 98 if (!strcmp(name, "root-title"))
95 cgit_root_title = xstrdup(value); 99 cgit_root_title = xstrdup(value);
96 else if (!strcmp(name, "css")) 100 else if (!strcmp(name, "css"))
97 cgit_css = xstrdup(value); 101 cgit_css = xstrdup(value);
98 else if (!strcmp(name, "logo")) 102 else if (!strcmp(name, "logo"))
99 cgit_logo = xstrdup(value); 103 cgit_logo = xstrdup(value);
100 else if (!strcmp(name, "logo-link")) 104 else if (!strcmp(name, "logo-link"))
101 cgit_logo_link = xstrdup(value); 105 cgit_logo_link = xstrdup(value);
102 else if (!strcmp(name, "module-link")) 106 else if (!strcmp(name, "module-link"))
103 cgit_module_link = xstrdup(value); 107 cgit_module_link = xstrdup(value);
104 else if (!strcmp(name, "virtual-root")) 108 else if (!strcmp(name, "virtual-root"))
105 cgit_virtual_root = xstrdup(value); 109 cgit_virtual_root = xstrdup(value);
106 else if (!strcmp(name, "nocache")) 110 else if (!strcmp(name, "nocache"))
107 cgit_nocache = atoi(value); 111 cgit_nocache = atoi(value);
108 else if (!strcmp(name, "snapshots")) 112 else if (!strcmp(name, "snapshots"))
109 cgit_snapshots = atoi(value); 113 cgit_snapshots = atoi(value);
114 else if (!strcmp(name, "enable-log-filecount"))
115 cgit_enable_log_filecount = atoi(value);
116 else if (!strcmp(name, "enable-log-linecount"))
117 cgit_enable_log_linecount = atoi(value);
110 else if (!strcmp(name, "cache-root")) 118 else if (!strcmp(name, "cache-root"))
111 cgit_cache_root = xstrdup(value); 119 cgit_cache_root = xstrdup(value);
112 else if (!strcmp(name, "cache-root-ttl")) 120 else if (!strcmp(name, "cache-root-ttl"))
113 cgit_cache_root_ttl = atoi(value); 121 cgit_cache_root_ttl = atoi(value);
114 else if (!strcmp(name, "cache-repo-ttl")) 122 else if (!strcmp(name, "cache-repo-ttl"))
115 cgit_cache_repo_ttl = atoi(value); 123 cgit_cache_repo_ttl = atoi(value);
116 else if (!strcmp(name, "cache-static-ttl")) 124 else if (!strcmp(name, "cache-static-ttl"))
117 cgit_cache_static_ttl = atoi(value); 125 cgit_cache_static_ttl = atoi(value);
118 else if (!strcmp(name, "cache-dynamic-ttl")) 126 else if (!strcmp(name, "cache-dynamic-ttl"))
119 cgit_cache_dynamic_ttl = atoi(value); 127 cgit_cache_dynamic_ttl = atoi(value);
120 else if (!strcmp(name, "max-message-length")) 128 else if (!strcmp(name, "max-message-length"))
121 cgit_max_msg_len = atoi(value); 129 cgit_max_msg_len = atoi(value);
122 else if (!strcmp(name, "max-repodesc-length")) 130 else if (!strcmp(name, "max-repodesc-length"))
123 cgit_max_repodesc_len = atoi(value); 131 cgit_max_repodesc_len = atoi(value);
124 else if (!strcmp(name, "max-commit-count")) 132 else if (!strcmp(name, "max-commit-count"))
125 cgit_max_commit_count = atoi(value); 133 cgit_max_commit_count = atoi(value);
126 else if (!strcmp(name, "repo.url")) 134 else if (!strcmp(name, "repo.url"))
127 cgit_repo = add_repo(value); 135 cgit_repo = add_repo(value);
128 else if (!strcmp(name, "repo.name")) 136 else if (!strcmp(name, "repo.name"))
129 cgit_repo->name = xstrdup(value); 137 cgit_repo->name = xstrdup(value);
130 else if (cgit_repo && !strcmp(name, "repo.path")) 138 else if (cgit_repo && !strcmp(name, "repo.path"))
131 cgit_repo->path = xstrdup(value); 139 cgit_repo->path = xstrdup(value);
132 else if (cgit_repo && !strcmp(name, "repo.desc")) 140 else if (cgit_repo && !strcmp(name, "repo.desc"))
133 cgit_repo->desc = xstrdup(value); 141 cgit_repo->desc = xstrdup(value);
134 else if (cgit_repo && !strcmp(name, "repo.owner")) 142 else if (cgit_repo && !strcmp(name, "repo.owner"))
135 cgit_repo->owner = xstrdup(value); 143 cgit_repo->owner = xstrdup(value);
136 else if (cgit_repo && !strcmp(name, "repo.defbranch")) 144 else if (cgit_repo && !strcmp(name, "repo.defbranch"))
137 cgit_repo->defbranch = xstrdup(value); 145 cgit_repo->defbranch = xstrdup(value);
138 else if (cgit_repo && !strcmp(name, "repo.snapshots")) 146 else if (cgit_repo && !strcmp(name, "repo.snapshots"))
139 cgit_repo->snapshots = atoi(value); 147 cgit_repo->snapshots = cgit_snapshots * atoi(value);
148 else if (cgit_repo && !strcmp(name, "repo.enable-log-filecount"))
149 cgit_repo->enable_log_filecount = cgit_enable_log_filecount * atoi(value);
150 else if (cgit_repo && !strcmp(name, "repo.enable-log-linecount"))
151 cgit_repo->enable_log_linecount = cgit_enable_log_linecount * atoi(value);
140 else if (cgit_repo && !strcmp(name, "repo.module-link")) 152 else if (cgit_repo && !strcmp(name, "repo.module-link"))
141 cgit_repo->module_link= xstrdup(value); 153 cgit_repo->module_link= xstrdup(value);
142 else if (!strcmp(name, "include")) 154 else if (!strcmp(name, "include"))
143 cgit_read_config(value, cgit_global_config_cb); 155 cgit_read_config(value, cgit_global_config_cb);
144} 156}
145 157
146void cgit_querystring_cb(const char *name, const char *value) 158void cgit_querystring_cb(const char *name, const char *value)
147{ 159{
148 if (!strcmp(name,"r")) { 160 if (!strcmp(name,"r")) {
149 cgit_query_repo = xstrdup(value); 161 cgit_query_repo = xstrdup(value);
150 } else if (!strcmp(name, "p")) { 162 } else if (!strcmp(name, "p")) {
151 cgit_query_page = xstrdup(value); 163 cgit_query_page = xstrdup(value);
152 } else if (!strcmp(name, "q")) { 164 } else if (!strcmp(name, "q")) {
153 cgit_query_search = xstrdup(value); 165 cgit_query_search = xstrdup(value);
154 } else if (!strcmp(name, "h")) { 166 } else if (!strcmp(name, "h")) {
155 cgit_query_head = xstrdup(value); 167 cgit_query_head = xstrdup(value);
156 cgit_query_has_symref = 1; 168 cgit_query_has_symref = 1;
157 } else if (!strcmp(name, "id")) { 169 } else if (!strcmp(name, "id")) {
158 cgit_query_sha1 = xstrdup(value); 170 cgit_query_sha1 = xstrdup(value);
159 cgit_query_has_sha1 = 1; 171 cgit_query_has_sha1 = 1;
160 } else if (!strcmp(name, "id2")) { 172 } else if (!strcmp(name, "id2")) {
161 cgit_query_sha2 = xstrdup(value); 173 cgit_query_sha2 = xstrdup(value);
162 cgit_query_has_sha1 = 1; 174 cgit_query_has_sha1 = 1;
163 } else if (!strcmp(name, "ofs")) { 175 } else if (!strcmp(name, "ofs")) {
164 cgit_query_ofs = atoi(value); 176 cgit_query_ofs = atoi(value);
165 } else if (!strcmp(name, "path")) { 177 } else if (!strcmp(name, "path")) {
166 cgit_query_path = xstrdup(value); 178 cgit_query_path = xstrdup(value);
167 } else if (!strcmp(name, "name")) { 179 } else if (!strcmp(name, "name")) {
168 cgit_query_name = xstrdup(value); 180 cgit_query_name = xstrdup(value);
169 } 181 }
170} 182}
171 183
172void *cgit_free_commitinfo(struct commitinfo *info) 184void *cgit_free_commitinfo(struct commitinfo *info)
173{ 185{
174 free(info->author); 186 free(info->author);
175 free(info->author_email); 187 free(info->author_email);
176 free(info->committer); 188 free(info->committer);
177 free(info->committer_email); 189 free(info->committer_email);
178 free(info->subject); 190 free(info->subject);
179 free(info); 191 free(info);
180 return NULL; 192 return NULL;
181} 193}
182 194
183int hextoint(char c) 195int hextoint(char c)
184{ 196{
185 if (c >= 'a' && c <= 'f') 197 if (c >= 'a' && c <= 'f')
186 return 10 + c - 'a'; 198 return 10 + c - 'a';
187 else if (c >= 'A' && c <= 'F') 199 else if (c >= 'A' && c <= 'F')
188 return 10 + c - 'A'; 200 return 10 + c - 'A';
189 else if (c >= '0' && c <= '9') 201 else if (c >= '0' && c <= '9')
190 return c - '0'; 202 return c - '0';
191 else 203 else
192 return -1; 204 return -1;
193} 205}
194 206
195void cgit_diff_tree_cb(struct diff_queue_struct *q, 207void cgit_diff_tree_cb(struct diff_queue_struct *q,
196 struct diff_options *options, void *data) 208 struct diff_options *options, void *data)
197{ 209{
198 int i; 210 int i;
199 211
200 for (i = 0; i < q->nr; i++) { 212 for (i = 0; i < q->nr; i++) {
201 if (q->queue[i]->status == 'U') 213 if (q->queue[i]->status == 'U')
202 continue; 214 continue;
203 ((filepair_fn)data)(q->queue[i]); 215 ((filepair_fn)data)(q->queue[i]);
204 } 216 }
205} 217}
206 218
207static int load_mmfile(mmfile_t *file, const unsigned char *sha1) 219static int load_mmfile(mmfile_t *file, const unsigned char *sha1)
208{ 220{
209 enum object_type type; 221 enum object_type type;
210 222
211 if (is_null_sha1(sha1)) { 223 if (is_null_sha1(sha1)) {
212 file->ptr = (char *)""; 224 file->ptr = (char *)"";
213 file->size = 0; 225 file->size = 0;
214 } else { 226 } else {
215 file->ptr = read_sha1_file(sha1, &type, &file->size); 227 file->ptr = read_sha1_file(sha1, &type, &file->size);
216 } 228 }
217 return 1; 229 return 1;
218} 230}
219 231
220/* 232/*
221 * Receive diff-buffers from xdiff and concatenate them as 233 * Receive diff-buffers from xdiff and concatenate them as
222 * needed across multiple callbacks. 234 * needed across multiple callbacks.
223 * 235 *
224 * This is basically a copy of xdiff-interface.c/xdiff_outf(), 236 * This is basically a copy of xdiff-interface.c/xdiff_outf(),
225 * ripped from git and modified to use globals instead of 237 * ripped from git and modified to use globals instead of
226 * a special callback-struct. 238 * a special callback-struct.
227 */ 239 */
228char *diffbuf = NULL; 240char *diffbuf = NULL;
229int buflen = 0; 241int buflen = 0;
230 242
231int filediff_cb(void *priv, mmbuffer_t *mb, int nbuf) 243int filediff_cb(void *priv, mmbuffer_t *mb, int nbuf)
232{ 244{
233 int i; 245 int i;
234 246
235 for (i = 0; i < nbuf; i++) { 247 for (i = 0; i < nbuf; i++) {
236 if (mb[i].ptr[mb[i].size-1] != '\n') { 248 if (mb[i].ptr[mb[i].size-1] != '\n') {
237 /* Incomplete line */ 249 /* Incomplete line */
238 diffbuf = xrealloc(diffbuf, buflen + mb[i].size); 250 diffbuf = xrealloc(diffbuf, buflen + mb[i].size);
239 memcpy(diffbuf + buflen, mb[i].ptr, mb[i].size); 251 memcpy(diffbuf + buflen, mb[i].ptr, mb[i].size);
240 buflen += mb[i].size; 252 buflen += mb[i].size;
241 continue; 253 continue;
242 } 254 }
243 255
244 /* we have a complete line */ 256 /* we have a complete line */
245 if (!diffbuf) { 257 if (!diffbuf) {
246 ((linediff_fn)priv)(mb[i].ptr, mb[i].size); 258 ((linediff_fn)priv)(mb[i].ptr, mb[i].size);
247 continue; 259 continue;
248 } 260 }
249 diffbuf = xrealloc(diffbuf, buflen + mb[i].size); 261 diffbuf = xrealloc(diffbuf, buflen + mb[i].size);
250 memcpy(diffbuf + buflen, mb[i].ptr, mb[i].size); 262 memcpy(diffbuf + buflen, mb[i].ptr, mb[i].size);
251 ((linediff_fn)priv)(diffbuf, buflen + mb[i].size); 263 ((linediff_fn)priv)(diffbuf, buflen + mb[i].size);
252 free(diffbuf); 264 free(diffbuf);
253 diffbuf = NULL; 265 diffbuf = NULL;
254 buflen = 0; 266 buflen = 0;
255 } 267 }
256 if (diffbuf) { 268 if (diffbuf) {
257 ((linediff_fn)priv)(diffbuf, buflen); 269 ((linediff_fn)priv)(diffbuf, buflen);
258 free(diffbuf); 270 free(diffbuf);
259 diffbuf = NULL; 271 diffbuf = NULL;
260 buflen = 0; 272 buflen = 0;
261 } 273 }
262 return 0; 274 return 0;
263} 275}
264 276
265int cgit_diff_files(const unsigned char *old_sha1, 277int cgit_diff_files(const unsigned char *old_sha1,
266 const unsigned char *new_sha1, 278 const unsigned char *new_sha1,
267 linediff_fn fn) 279 linediff_fn fn)
268{ 280{
269 mmfile_t file1, file2; 281 mmfile_t file1, file2;
270 xpparam_t diff_params; 282 xpparam_t diff_params;
271 xdemitconf_t emit_params; 283 xdemitconf_t emit_params;
272 xdemitcb_t emit_cb; 284 xdemitcb_t emit_cb;
273 285
274 if (!load_mmfile(&file1, old_sha1) || !load_mmfile(&file2, new_sha1)) 286 if (!load_mmfile(&file1, old_sha1) || !load_mmfile(&file2, new_sha1))
275 return 1; 287 return 1;
276 288
277 diff_params.flags = XDF_NEED_MINIMAL; 289 diff_params.flags = XDF_NEED_MINIMAL;
278 emit_params.ctxlen = 3; 290 emit_params.ctxlen = 3;
279 emit_params.flags = XDL_EMIT_FUNCNAMES; 291 emit_params.flags = XDL_EMIT_FUNCNAMES;
280 emit_cb.outf = filediff_cb; 292 emit_cb.outf = filediff_cb;
281 emit_cb.priv = fn; 293 emit_cb.priv = fn;
282 xdl_diff(&file1, &file2, &diff_params, &emit_params, &emit_cb); 294 xdl_diff(&file1, &file2, &diff_params, &emit_params, &emit_cb);
283 return 0; 295 return 0;
284} 296}
285 297
286void cgit_diff_tree(const unsigned char *old_sha1, 298void cgit_diff_tree(const unsigned char *old_sha1,
287 const unsigned char *new_sha1, 299 const unsigned char *new_sha1,
288 filepair_fn fn) 300 filepair_fn fn)
289{ 301{
290 struct diff_options opt; 302 struct diff_options opt;
291 int ret; 303 int ret;
292 304
293 diff_setup(&opt); 305 diff_setup(&opt);
294 opt.output_format = DIFF_FORMAT_CALLBACK; 306 opt.output_format = DIFF_FORMAT_CALLBACK;
295 opt.detect_rename = 1; 307 opt.detect_rename = 1;
296 opt.recursive = 1; 308 opt.recursive = 1;
297 opt.format_callback = cgit_diff_tree_cb; 309 opt.format_callback = cgit_diff_tree_cb;
298 opt.format_callback_data = fn; 310 opt.format_callback_data = fn;
299 diff_setup_done(&opt); 311 diff_setup_done(&opt);
300 312
301 if (old_sha1) 313 if (old_sha1)
302 ret = diff_tree_sha1(old_sha1, new_sha1, "", &opt); 314 ret = diff_tree_sha1(old_sha1, new_sha1, "", &opt);
303 else 315 else
304 ret = diff_root_tree_sha1(new_sha1, "", &opt); 316 ret = diff_root_tree_sha1(new_sha1, "", &opt);
305 diffcore_std(&opt); 317 diffcore_std(&opt);
306 diff_flush(&opt); 318 diff_flush(&opt);
307} 319}
308 320
309void cgit_diff_commit(struct commit *commit, filepair_fn fn) 321void cgit_diff_commit(struct commit *commit, filepair_fn fn)
310{ 322{
311 unsigned char *old_sha1 = NULL; 323 unsigned char *old_sha1 = NULL;
312 324
313 if (commit->parents) 325 if (commit->parents)
314 old_sha1 = commit->parents->item->object.sha1; 326 old_sha1 = commit->parents->item->object.sha1;
315 cgit_diff_tree(old_sha1, commit->object.sha1, fn); 327 cgit_diff_tree(old_sha1, commit->object.sha1, fn);
316} 328}