diff: teach tree-diff a max-depth parameter
When you are doing a tree-diff, there are basically two options: do not recurse into subtrees at all, or recurse indefinitely. While most callers would want to always recurse and see full pathnames, some may want the efficiency of looking only at a particular level of the tree. This is currently easy to do for the top-level (just turn off recursion), but you cannot say "show me what changed in subdir/, but do not recurse". This patch adds a max-depth parameter which is measured from the closest pathspec match, so that you can do: git log --raw --max-depth=1 -- a/b/c and see the raw output for a/b/c/, but not those of a/b/c/d/ (instead of the raw output you would see for a/b/c/d). Co-authored-by: Toon Claes <toon@iotcl.com> Signed-off-by: Toon Claes <toon@iotcl.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
committed by
Junio C Hamano
parent
2a43e0e550
commit
a1dfa5448d
24
diff.c
24
diff.c
@@ -4988,6 +4988,9 @@ void diff_setup_done(struct diff_options *options)
|
||||
options->filter = ~filter_bit[DIFF_STATUS_FILTER_AON];
|
||||
options->filter &= ~options->filter_not;
|
||||
}
|
||||
|
||||
if (options->pathspec.has_wildcard && options->max_depth_valid)
|
||||
die("max-depth cannot be used with wildcard pathspecs");
|
||||
}
|
||||
|
||||
int parse_long_opt(const char *opt, const char **argv,
|
||||
@@ -5622,6 +5625,23 @@ static int diff_opt_rotate_to(const struct option *opt, const char *arg, int uns
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int diff_opt_max_depth(const struct option *opt,
|
||||
const char *arg, int unset)
|
||||
{
|
||||
struct diff_options *options = opt->value;
|
||||
|
||||
BUG_ON_OPT_NEG(unset);
|
||||
|
||||
if (!git_parse_int(arg, &options->max_depth))
|
||||
return error(_("invalid value for '%s': '%s'"),
|
||||
"--max-depth", arg);
|
||||
|
||||
options->flags.recursive = 1;
|
||||
options->max_depth_valid = options->max_depth >= 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Consider adding new flags to __git_diff_common_options
|
||||
* in contrib/completion/git-completion.bash
|
||||
@@ -5894,6 +5914,10 @@ struct option *add_diff_options(const struct option *opts,
|
||||
OPT_CALLBACK_F(0, "diff-filter", options, N_("[(A|C|D|M|R|T|U|X|B)...[*]]"),
|
||||
N_("select files by diff type"),
|
||||
PARSE_OPT_NONEG, diff_opt_diff_filter),
|
||||
OPT_CALLBACK_F(0, "max-depth", options, N_("<depth>"),
|
||||
N_("maximum tree depth to recurse"),
|
||||
PARSE_OPT_NONEG, diff_opt_max_depth),
|
||||
|
||||
{
|
||||
.type = OPTION_CALLBACK,
|
||||
.long_name = "output",
|
||||
|
||||
Reference in New Issue
Block a user