mirror of
https://github.com/git/git.git
synced 2024-11-28 04:23:30 +08:00
Merge branch 'la/diff-relative-config'
The commands in the "diff" family learned to honor "diff.relative" configuration variable. * la/diff-relative-config: diff: add config option relative
This commit is contained in:
commit
e34df9a6e5
@ -105,6 +105,10 @@ diff.mnemonicPrefix::
|
||||
diff.noprefix::
|
||||
If set, 'git diff' does not show any source or destination prefix.
|
||||
|
||||
diff.relative::
|
||||
If set to 'true', 'git diff' does not show changes outside of the directory
|
||||
and show pathnames relative to the current directory.
|
||||
|
||||
diff.orderFile::
|
||||
File indicating how to order files within a diff.
|
||||
See the '-O' option to linkgit:git-diff[1] for details.
|
||||
|
@ -643,15 +643,18 @@ ifndef::git-format-patch[]
|
||||
-R::
|
||||
Swap two inputs; that is, show differences from index or
|
||||
on-disk file to tree contents.
|
||||
endif::git-format-patch[]
|
||||
|
||||
--relative[=<path>]::
|
||||
--no-relative::
|
||||
When run from a subdirectory of the project, it can be
|
||||
told to exclude changes outside the directory and show
|
||||
pathnames relative to it with this option. When you are
|
||||
not in a subdirectory (e.g. in a bare repository), you
|
||||
can name which subdirectory to make the output relative
|
||||
to by giving a <path> as an argument.
|
||||
endif::git-format-patch[]
|
||||
`--no-relative` can be used to countermand both `diff.relative` config
|
||||
option and previous `--relative`.
|
||||
|
||||
-a::
|
||||
--text::
|
||||
|
11
diff.c
11
diff.c
@ -48,6 +48,7 @@ static const char *diff_order_file_cfg;
|
||||
int diff_auto_refresh_index = 1;
|
||||
static int diff_mnemonic_prefix;
|
||||
static int diff_no_prefix;
|
||||
static int diff_relative;
|
||||
static int diff_stat_graph_width;
|
||||
static int diff_dirstat_permille_default = 30;
|
||||
static struct diff_options default_diff_options;
|
||||
@ -386,6 +387,10 @@ int git_diff_ui_config(const char *var, const char *value, void *cb)
|
||||
diff_no_prefix = git_config_bool(var, value);
|
||||
return 0;
|
||||
}
|
||||
if (!strcmp(var, "diff.relative")) {
|
||||
diff_relative = git_config_bool(var, value);
|
||||
return 0;
|
||||
}
|
||||
if (!strcmp(var, "diff.statgraphwidth")) {
|
||||
diff_stat_graph_width = git_config_int(var, value);
|
||||
return 0;
|
||||
@ -4538,6 +4543,7 @@ void repo_diff_setup(struct repository *r, struct diff_options *options)
|
||||
options->interhunkcontext = diff_interhunk_context_default;
|
||||
options->ws_error_highlight = ws_error_highlight_default;
|
||||
options->flags.rename_empty = 1;
|
||||
options->flags.relative_name = diff_relative;
|
||||
options->objfind = NULL;
|
||||
|
||||
/* pathchange left =NULL by default */
|
||||
@ -5195,8 +5201,7 @@ static int diff_opt_relative(const struct option *opt,
|
||||
{
|
||||
struct diff_options *options = opt->value;
|
||||
|
||||
BUG_ON_OPT_NEG(unset);
|
||||
options->flags.relative_name = 1;
|
||||
options->flags.relative_name = !unset;
|
||||
if (arg)
|
||||
options->prefix = arg;
|
||||
return 0;
|
||||
@ -5492,7 +5497,7 @@ static void prep_parse_options(struct diff_options *options)
|
||||
OPT_GROUP(N_("Other diff options")),
|
||||
OPT_CALLBACK_F(0, "relative", options, N_("<prefix>"),
|
||||
N_("when run from subdir, exclude changes outside and show relative paths"),
|
||||
PARSE_OPT_NONEG | PARSE_OPT_OPTARG,
|
||||
PARSE_OPT_OPTARG,
|
||||
diff_opt_relative),
|
||||
OPT_BOOL('a', "text", &options->flags.text,
|
||||
N_("treat all files as text")),
|
||||
|
@ -1602,6 +1602,19 @@ test_expect_success 'format patch ignores color.ui' '
|
||||
test_cmp expect actual
|
||||
'
|
||||
|
||||
test_expect_success 'format patch respects diff.relative' '
|
||||
rm -rf subdir &&
|
||||
mkdir subdir &&
|
||||
echo other content >subdir/file2 &&
|
||||
git add subdir/file2 &&
|
||||
git commit -F msg &&
|
||||
test_unconfig diff.relative &&
|
||||
git format-patch --relative=subdir --stdout -1 >expect &&
|
||||
test_config diff.relative true &&
|
||||
git -C subdir format-patch --stdout -1 >actual &&
|
||||
test_cmp expect actual
|
||||
'
|
||||
|
||||
test_expect_success 'cover letter with invalid --cover-from-description and config' '
|
||||
test_config branch.rebuild-1.description "config subject
|
||||
|
||||
|
@ -8,7 +8,8 @@ test_expect_success 'setup' '
|
||||
echo content >file1 &&
|
||||
mkdir subdir &&
|
||||
echo other content >subdir/file2 &&
|
||||
blob=$(git hash-object subdir/file2) &&
|
||||
blob_file1=$(git hash-object file1) &&
|
||||
blob_file2=$(git hash-object subdir/file2) &&
|
||||
git add . &&
|
||||
git commit -m one
|
||||
'
|
||||
@ -18,7 +19,7 @@ check_diff () {
|
||||
shift
|
||||
expect=$1
|
||||
shift
|
||||
short_blob=$(git rev-parse --short $blob)
|
||||
short_blob=$(git rev-parse --short $blob_file2)
|
||||
cat >expected <<-EOF
|
||||
diff --git a/$expect b/$expect
|
||||
new file mode 100644
|
||||
@ -70,7 +71,7 @@ check_raw () {
|
||||
expect=$1
|
||||
shift
|
||||
cat >expected <<-EOF
|
||||
:000000 100644 $ZERO_OID $blob A $expect
|
||||
:000000 100644 $ZERO_OID $blob_file2 A $expect
|
||||
EOF
|
||||
test_expect_success "--raw $*" "
|
||||
git -C '$dir' diff --no-abbrev --raw $* HEAD^ >actual &&
|
||||
@ -86,4 +87,79 @@ do
|
||||
check_$type . dir/file2 --relative=sub
|
||||
done
|
||||
|
||||
check_diff_relative_option () {
|
||||
dir=$1
|
||||
shift
|
||||
expect=$1
|
||||
shift
|
||||
relative_opt=$1
|
||||
shift
|
||||
test_expect_success "config diff.relative $relative_opt -p $*" "
|
||||
short_blob=\$(git rev-parse --short $blob_file2) &&
|
||||
cat >expected <<-EOF &&
|
||||
diff --git a/$expect b/$expect
|
||||
new file mode 100644
|
||||
index 0000000..\$short_blob
|
||||
--- /dev/null
|
||||
+++ b/$expect
|
||||
@@ -0,0 +1 @@
|
||||
+other content
|
||||
EOF
|
||||
test_config -C $dir diff.relative $relative_opt &&
|
||||
git -C '$dir' diff -p $* HEAD^ >actual &&
|
||||
test_cmp expected actual
|
||||
"
|
||||
}
|
||||
|
||||
check_diff_no_relative_option () {
|
||||
dir=$1
|
||||
shift
|
||||
expect=$1
|
||||
shift
|
||||
relative_opt=$1
|
||||
shift
|
||||
test_expect_success "config diff.relative $relative_opt -p $*" "
|
||||
short_blob_file1=\$(git rev-parse --short $blob_file1) &&
|
||||
short_blob_file2=\$(git rev-parse --short $blob_file2) &&
|
||||
cat >expected <<-EOF &&
|
||||
diff --git a/file1 b/file1
|
||||
new file mode 100644
|
||||
index 0000000..\$short_blob_file1
|
||||
--- /dev/null
|
||||
+++ b/file1
|
||||
@@ -0,0 +1 @@
|
||||
+content
|
||||
diff --git a/$expect b/$expect
|
||||
new file mode 100644
|
||||
index 0000000..\$short_blob_file2
|
||||
--- /dev/null
|
||||
+++ b/$expect
|
||||
@@ -0,0 +1 @@
|
||||
+other content
|
||||
EOF
|
||||
test_config -C $dir diff.relative $relative_opt &&
|
||||
git -C '$dir' diff -p $* HEAD^ >actual &&
|
||||
test_cmp expected actual
|
||||
"
|
||||
}
|
||||
|
||||
check_diff_no_relative_option . subdir/file2 false
|
||||
check_diff_no_relative_option . subdir/file2 true --no-relative
|
||||
check_diff_no_relative_option . subdir/file2 false --no-relative
|
||||
check_diff_no_relative_option subdir subdir/file2 false
|
||||
check_diff_no_relative_option subdir subdir/file2 true --no-relative
|
||||
check_diff_no_relative_option subdir subdir/file2 false --no-relative
|
||||
|
||||
check_diff_relative_option . file2 false --relative=subdir/
|
||||
check_diff_relative_option . file2 false --relative=subdir
|
||||
check_diff_relative_option . file2 true --relative=subdir/
|
||||
check_diff_relative_option . file2 true --relative=subdir
|
||||
check_diff_relative_option subdir file2 false --relative
|
||||
check_diff_relative_option subdir file2 true --relative
|
||||
check_diff_relative_option subdir file2 true
|
||||
check_diff_relative_option subdir file2 false --no-relative --relative
|
||||
check_diff_relative_option subdir file2 true --no-relative --relative
|
||||
check_diff_relative_option . file2 false --no-relative --relative=subdir
|
||||
check_diff_relative_option . file2 true --no-relative --relative=subdir
|
||||
|
||||
test_done
|
||||
|
Loading…
Reference in New Issue
Block a user