History

Add URL parameter 'ignorews' for optionally ignoring whitespace in diffs

The new ctx.qry.ignorews variable is passed via cgit_diff_files() and cgit_diff_tree() to Git's diff machinery. This is equivalent to passing --ignore-all-space to 'git diff'.

Johan Herland committed 16 years ago

Commit 2cc8b991 parent d20313e6 files · +25 −12Browse files

Unified · Split

6 files
  1. cgit.c +2 −0
  2. cgit.h +4 −2
  3. shared.c +8 −3
  4. ui-diff.c +7 −4
  5. ui-log.c +2 −1
  6. ui-patch.c +2 −2
cgit.c+2−0
@@ -252,6 +252,8 @@ static void querystring_cb(const char *name, const char *value) · 251 unmodified lines
252 ctx.qry.ssdiff = atoi(value);252 ctx.qry.ssdiff = atoi(value);
253 } else if (!strcmp(name, "context")) {253 } else if (!strcmp(name, "context")) {
254 ctx.qry.context = atoi(value);254 ctx.qry.context = atoi(value);
255 } else if (!strcmp(name, "ignorews")) {
256 ctx.qry.ignorews = atoi(value);
255 }257 }
256}258}
257 259
cgit.h+4−2
@@ -146,6 +146,7 @@ struct cgit_query { · 145 unmodified lines
146 int showmsg;146 int showmsg;
147 int ssdiff;147 int ssdiff;
148 int context;148 int context;
149 int ignorews;
149 char *vpath;150 char *vpath;
150};151};
151 152
@@ -275,11 +276,12 @@ extern void *cgit_free_commitinfo(struct commitinfo *info); · 123 unmodified lines
275extern int cgit_diff_files(const unsigned char *old_sha1,276extern int cgit_diff_files(const unsigned char *old_sha1,
276 const unsigned char *new_sha1,277 const unsigned char *new_sha1,
277 unsigned long *old_size, unsigned long *new_size,278 unsigned long *old_size, unsigned long *new_size,
278 int *binary, int context, linediff_fn fn);279 int *binary, int context, int ignorews,
280 linediff_fn fn);
279 281
280extern void cgit_diff_tree(const unsigned char *old_sha1,282extern void cgit_diff_tree(const unsigned char *old_sha1,
281 const unsigned char *new_sha1,283 const unsigned char *new_sha1,
282 filepair_fn fn, const char *prefix);284 filepair_fn fn, const char *prefix, int ignorews);
283 285
284extern void cgit_diff_commit(struct commit *commit, filepair_fn fn);286extern void cgit_diff_commit(struct commit *commit, filepair_fn fn);
285 287
shared.c+8−3
@@ -263,7 +263,7 @@ int filediff_cb(void *priv, mmbuffer_t *mb, int nbuf) · 262 unmodified lines
263int cgit_diff_files(const unsigned char *old_sha1,263int cgit_diff_files(const unsigned char *old_sha1,
264 const unsigned char *new_sha1, unsigned long *old_size,264 const unsigned char *new_sha1, unsigned long *old_size,
265 unsigned long *new_size, int *binary, int context,265 unsigned long *new_size, int *binary, int context,
266 linediff_fn fn)266 int ignorews, linediff_fn fn)
267{267{
268 mmfile_t file1, file2;268 mmfile_t file1, file2;
269 xpparam_t diff_params;269 xpparam_t diff_params;
@@ -286,6 +286,8 @@ int cgit_diff_files(const unsigned char *old_sha1, · 16 unmodified lines
286 memset(&emit_params, 0, sizeof(emit_params));286 memset(&emit_params, 0, sizeof(emit_params));
287 memset(&emit_cb, 0, sizeof(emit_cb));287 memset(&emit_cb, 0, sizeof(emit_cb));
288 diff_params.flags = XDF_NEED_MINIMAL;288 diff_params.flags = XDF_NEED_MINIMAL;
289 if (ignorews)
290 diff_params.flags |= XDF_IGNORE_WHITESPACE;
289 emit_params.ctxlen = context > 0 ? context : 3;291 emit_params.ctxlen = context > 0 ? context : 3;
290 emit_params.flags = XDL_EMIT_FUNCNAMES;292 emit_params.flags = XDL_EMIT_FUNCNAMES;
291 emit_cb.outf = filediff_cb;293 emit_cb.outf = filediff_cb;
@@ -296,7 +298,7 @@ int cgit_diff_files(const unsigned char *old_sha1, · 4 unmodified lines
296 298
297void cgit_diff_tree(const unsigned char *old_sha1,299void cgit_diff_tree(const unsigned char *old_sha1,
298 const unsigned char *new_sha1,300 const unsigned char *new_sha1,
299 filepair_fn fn, const char *prefix)301 filepair_fn fn, const char *prefix, int ignorews)
300{302{
301 struct diff_options opt;303 struct diff_options opt;
302 int ret;304 int ret;
@@ -307,6 +309,8 @@ void cgit_diff_tree(const unsigned char *old_sha1, · 4 unmodified lines
307 opt.detect_rename = 1;309 opt.detect_rename = 1;
308 opt.rename_limit = ctx.cfg.renamelimit;310 opt.rename_limit = ctx.cfg.renamelimit;
309 DIFF_OPT_SET(&opt, RECURSIVE);311 DIFF_OPT_SET(&opt, RECURSIVE);
312 if (ignorews)
313 DIFF_XDL_SET(&opt, IGNORE_WHITESPACE);
310 opt.format_callback = cgit_diff_tree_cb;314 opt.format_callback = cgit_diff_tree_cb;
311 opt.format_callback_data = fn;315 opt.format_callback_data = fn;
312 if (prefix) {316 if (prefix) {
@@ -331,7 +335,8 @@ void cgit_diff_commit(struct commit *commit, filepair_fn fn) · 18 unmodified lines
331 335
332 if (commit->parents)336 if (commit->parents)
333 old_sha1 = commit->parents->item->object.sha1;337 old_sha1 = commit->parents->item->object.sha1;
334 cgit_diff_tree(old_sha1, commit->object.sha1, fn, NULL);338 cgit_diff_tree(old_sha1, commit->object.sha1, fn, NULL,
339 ctx.qry.ignorews);
335}340}
336 341
337int cgit_parse_snapshots_mask(const char *str)342int cgit_parse_snapshots_mask(const char *str)
ui-diff.c+7−4
@@ -127,7 +127,7 @@ static void inspect_filepair(struct diff_filepair *pair) · 126 unmodified lines
127 lines_added = 0;127 lines_added = 0;
128 lines_removed = 0;128 lines_removed = 0;
129 cgit_diff_files(pair->one->sha1, pair->two->sha1, &old_size, &new_size,129 cgit_diff_files(pair->one->sha1, pair->two->sha1, &old_size, &new_size,
130 &binary, 0, count_diff_lines);130 &binary, 0, ctx.qry.ignorews, count_diff_lines);
131 if (files >= slots) {131 if (files >= slots) {
132 if (slots == 0)132 if (slots == 0)
133 slots = 4;133 slots = 4;
@@ -174,7 +174,8 @@ void cgit_print_diffstat(const unsigned char *old_sha1, · 40 unmodified lines
174 html("</div>");174 html("</div>");
175 html("<table summary='diffstat' class='diffstat'>");175 html("<table summary='diffstat' class='diffstat'>");
176 max_changes = 0;176 max_changes = 0;
177 cgit_diff_tree(old_sha1, new_sha1, inspect_filepair, prefix);177 cgit_diff_tree(old_sha1, new_sha1, inspect_filepair, prefix,
178 ctx.qry.ignorews);
178 for(i = 0; i<files; i++)179 for(i = 0; i<files; i++)
179 print_fileinfo(&items[i]);180 print_fileinfo(&items[i]);
180 html("</table>");181 html("</table>");
@@ -296,7 +297,8 @@ static void filepair_cb(struct diff_filepair *pair) · 115 unmodified lines
296 return;297 return;
297 }298 }
298 if (cgit_diff_files(pair->one->sha1, pair->two->sha1, &old_size,299 if (cgit_diff_files(pair->one->sha1, pair->two->sha1, &old_size,
299 &new_size, &binary, ctx.qry.context, print_line_fn))300 &new_size, &binary, ctx.qry.context,
301 ctx.qry.ignorews, print_line_fn))
300 cgit_print_error("Error running diff");302 cgit_print_error("Error running diff");
301 if (binary) {303 if (binary) {
302 if (use_ssdiff)304 if (use_ssdiff)
@@ -356,7 +358,8 @@ void cgit_print_diff(const char *new_rev, const char *old_rev, const char *prefi · 53 unmodified lines
356 html("<table summary='diff' class='diff'>");358 html("<table summary='diff' class='diff'>");
357 html("<tr><td>");359 html("<tr><td>");
358 }360 }
359 cgit_diff_tree(old_rev_sha1, new_rev_sha1, filepair_cb, prefix);361 cgit_diff_tree(old_rev_sha1, new_rev_sha1, filepair_cb, prefix,
362 ctx.qry.ignorews);
360 if (!use_ssdiff)363 if (!use_ssdiff)
361 html("</td></tr>");364 html("</td></tr>");
362 html("</table>");365 html("</table>");
ui-log.c+2−1
@@ -33,7 +33,8 @@ void inspect_files(struct diff_filepair *pair) · 32 unmodified lines
33 files++;33 files++;
34 if (ctx.repo->enable_log_linecount)34 if (ctx.repo->enable_log_linecount)
35 cgit_diff_files(pair->one->sha1, pair->two->sha1, &old_size,35 cgit_diff_files(pair->one->sha1, pair->two->sha1, &old_size,
36 &new_size, &binary, 0, count_lines);36 &new_size, &binary, 0, ctx.qry.ignorews,
37 count_lines);
37}38}
38 39
39void show_commit_decorations(struct commit *commit)40void show_commit_decorations(struct commit *commit)
ui-patch.c+2−2
@@ -71,7 +71,7 @@ static void filepair_cb(struct diff_filepair *pair) · 70 unmodified lines
71 return;71 return;
72 }72 }
73 if (cgit_diff_files(pair->one->sha1, pair->two->sha1, &old_size,73 if (cgit_diff_files(pair->one->sha1, pair->two->sha1, &old_size,
74 &new_size, &binary, 0, print_line))74 &new_size, &binary, 0, 0, print_line))
75 html("Error running diff");75 html("Error running diff");
76 if (binary)76 if (binary)
77 html("Binary files differ\n");77 html("Binary files differ\n");
@@ -124,7 +124,7 @@ void cgit_print_patch(char *hex, const char *prefix) · 46 unmodified lines
124 html("---\n");124 html("---\n");
125 if (prefix)125 if (prefix)
126 htmlf("(limited to '%s')\n\n", prefix);126 htmlf("(limited to '%s')\n\n", prefix);
127 cgit_diff_tree(old_sha1, sha1, filepair_cb, prefix);127 cgit_diff_tree(old_sha1, sha1, filepair_cb, prefix, 0);
128 html("--\n");128 html("--\n");
129 htmlf("cgit %s\n", CGIT_VERSION);129 htmlf("cgit %s\n", CGIT_VERSION);
130 cgit_free_commitinfo(info);130 cgit_free_commitinfo(info);