aboutsummaryrefslogtreecommitdiff
path: root/diff.c
diff options
context:
space:
mode:
authorJunio C Hamano <junkio@cox.net>2006-05-15 18:09:15 -0700
committerJunio C Hamano <junkio@cox.net>2006-05-15 18:09:15 -0700
commit05f743f328e56780fb86c57da65f41df6e3b19a3 (patch)
tree81c3fc843da2a1d500ba781f473ecc9eb6684a9b /diff.c
parentd55aaefa3e3920bdf9a52d80da2a244f72742228 (diff)
parentee1e5412a702674d4da95a4aef73a73d2834dcc3 (diff)
downloadgit-05f743f328e56780fb86c57da65f41df6e3b19a3.tar.gz
git-05f743f328e56780fb86c57da65f41df6e3b19a3.tar.xz
Merge branch 'lt/diff'
* lt/diff: git diff: support "-U" and "--unified" options properly
Diffstat (limited to 'diff.c')
-rw-r--r--diff.c52
1 files changed, 51 insertions, 1 deletions
diff --git a/diff.c b/diff.c
index 5285c0366..1bdaba2f7 100644
--- a/diff.c
+++ b/diff.c
@@ -563,7 +563,7 @@ static void builtin_diff(const char *name_a,
ecbdata.label_path = lbl;
xpp.flags = XDF_NEED_MINIMAL;
- xecfg.ctxlen = 3;
+ xecfg.ctxlen = o->context;
xecfg.flags = XDL_EMIT_FUNCNAMES;
if (!diffopts)
;
@@ -1187,6 +1187,7 @@ void diff_setup(struct diff_options *options)
options->line_termination = '\n';
options->break_opt = -1;
options->rename_limit = -1;
+ options->context = 3;
options->change = diff_change;
options->add_remove = diff_addremove;
@@ -1227,11 +1228,60 @@ int diff_setup_done(struct diff_options *options)
return 0;
}
+int opt_arg(const char *arg, int arg_short, const char *arg_long, int *val)
+{
+ char c, *eq;
+ int len;
+
+ if (*arg != '-')
+ return 0;
+ c = *++arg;
+ if (!c)
+ return 0;
+ if (c == arg_short) {
+ c = *++arg;
+ if (!c)
+ return 1;
+ if (val && isdigit(c)) {
+ char *end;
+ int n = strtoul(arg, &end, 10);
+ if (*end)
+ return 0;
+ *val = n;
+ return 1;
+ }
+ return 0;
+ }
+ if (c != '-')
+ return 0;
+ arg++;
+ eq = strchr(arg, '=');
+ if (eq)
+ len = eq - arg;
+ else
+ len = strlen(arg);
+ if (!len || strncmp(arg, arg_long, len))
+ return 0;
+ if (eq) {
+ int n;
+ char *end;
+ if (!isdigit(*++eq))
+ return 0;
+ n = strtoul(eq, &end, 10);
+ if (*end)
+ return 0;
+ *val = n;
+ }
+ return 1;
+}
+
int diff_opt_parse(struct diff_options *options, const char **av, int ac)
{
const char *arg = av[0];
if (!strcmp(arg, "-p") || !strcmp(arg, "-u"))
options->output_format = DIFF_FORMAT_PATCH;
+ else if (opt_arg(arg, 'U', "unified", &options->context))
+ options->output_format = DIFF_FORMAT_PATCH;
else if (!strcmp(arg, "--patch-with-raw")) {
options->output_format = DIFF_FORMAT_PATCH;
options->with_raw = 1;