2014-06-13 20:19:51 +08:00
|
|
|
#!/bin/sh
|
|
|
|
|
|
|
|
test_description='split index mode tests'
|
|
|
|
|
|
|
|
. ./test-lib.sh
|
|
|
|
|
|
|
|
# We need total control of index splitting here
|
|
|
|
sane_unset GIT_TEST_SPLIT_INDEX
|
|
|
|
|
|
|
|
test_expect_success 'enable split index' '
|
2017-02-28 02:00:08 +08:00
|
|
|
git config splitIndex.maxPercentChange 100 &&
|
2014-06-13 20:19:51 +08:00
|
|
|
git update-index --split-index &&
|
|
|
|
test-dump-split-index .git/index >actual &&
|
2015-03-21 02:20:30 +08:00
|
|
|
indexversion=$(test-index-version <.git/index) &&
|
|
|
|
if test "$indexversion" = "4"
|
|
|
|
then
|
|
|
|
own=432ef4b63f32193984f339431fd50ca796493569
|
|
|
|
base=508851a7f0dfa8691e9f69c7f055865389012491
|
|
|
|
else
|
|
|
|
own=8299b0bcd1ac364e5f1d7768efb62fa2da79a339
|
|
|
|
base=39d890139ee5356c7ef572216cebcd27aa41f9df
|
|
|
|
fi &&
|
2017-02-28 01:59:59 +08:00
|
|
|
cat >expect <<-EOF &&
|
|
|
|
own $own
|
|
|
|
base $base
|
|
|
|
replacements:
|
|
|
|
deletions:
|
|
|
|
EOF
|
2014-06-13 20:19:51 +08:00
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'add one file' '
|
|
|
|
: >one &&
|
|
|
|
git update-index --add one &&
|
|
|
|
git ls-files --stage >ls-files.actual &&
|
2017-02-28 01:59:59 +08:00
|
|
|
cat >ls-files.expect <<-EOF &&
|
|
|
|
100644 $EMPTY_BLOB 0 one
|
|
|
|
EOF
|
2014-06-13 20:19:51 +08:00
|
|
|
test_cmp ls-files.expect ls-files.actual &&
|
|
|
|
|
|
|
|
test-dump-split-index .git/index | sed "/^own/d" >actual &&
|
2017-02-28 01:59:59 +08:00
|
|
|
cat >expect <<-EOF &&
|
|
|
|
base $base
|
|
|
|
100644 $EMPTY_BLOB 0 one
|
|
|
|
replacements:
|
|
|
|
deletions:
|
|
|
|
EOF
|
2014-06-13 20:19:51 +08:00
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'disable split index' '
|
|
|
|
git update-index --no-split-index &&
|
|
|
|
git ls-files --stage >ls-files.actual &&
|
2017-02-28 01:59:59 +08:00
|
|
|
cat >ls-files.expect <<-EOF &&
|
|
|
|
100644 $EMPTY_BLOB 0 one
|
|
|
|
EOF
|
2014-06-13 20:19:51 +08:00
|
|
|
test_cmp ls-files.expect ls-files.actual &&
|
|
|
|
|
2015-12-22 23:05:51 +08:00
|
|
|
BASE=$(test-dump-split-index .git/index | grep "^own" | sed "s/own/base/") &&
|
2014-06-13 20:19:51 +08:00
|
|
|
test-dump-split-index .git/index | sed "/^own/d" >actual &&
|
2017-02-28 01:59:59 +08:00
|
|
|
cat >expect <<-EOF &&
|
|
|
|
not a split index
|
|
|
|
EOF
|
2014-06-13 20:19:51 +08:00
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'enable split index again, "one" now belongs to base index"' '
|
|
|
|
git update-index --split-index &&
|
|
|
|
git ls-files --stage >ls-files.actual &&
|
2017-02-28 01:59:59 +08:00
|
|
|
cat >ls-files.expect <<-EOF &&
|
|
|
|
100644 $EMPTY_BLOB 0 one
|
|
|
|
EOF
|
2014-06-13 20:19:51 +08:00
|
|
|
test_cmp ls-files.expect ls-files.actual &&
|
|
|
|
|
|
|
|
test-dump-split-index .git/index | sed "/^own/d" >actual &&
|
2017-02-28 01:59:59 +08:00
|
|
|
cat >expect <<-EOF &&
|
|
|
|
$BASE
|
|
|
|
replacements:
|
|
|
|
deletions:
|
|
|
|
EOF
|
2014-06-13 20:19:51 +08:00
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'modify original file, base index untouched' '
|
|
|
|
echo modified >one &&
|
|
|
|
git update-index one &&
|
|
|
|
git ls-files --stage >ls-files.actual &&
|
2017-02-28 01:59:59 +08:00
|
|
|
cat >ls-files.expect <<-EOF &&
|
|
|
|
100644 2e0996000b7e9019eabcad29391bf0f5c7702f0b 0 one
|
|
|
|
EOF
|
2014-06-13 20:19:51 +08:00
|
|
|
test_cmp ls-files.expect ls-files.actual &&
|
|
|
|
|
|
|
|
test-dump-split-index .git/index | sed "/^own/d" >actual &&
|
2017-02-28 01:59:59 +08:00
|
|
|
q_to_tab >expect <<-EOF &&
|
|
|
|
$BASE
|
|
|
|
100644 2e0996000b7e9019eabcad29391bf0f5c7702f0b 0Q
|
|
|
|
replacements: 0
|
|
|
|
deletions:
|
|
|
|
EOF
|
2014-06-13 20:19:51 +08:00
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'add another file, which stays index' '
|
|
|
|
: >two &&
|
|
|
|
git update-index --add two &&
|
|
|
|
git ls-files --stage >ls-files.actual &&
|
2017-02-28 01:59:59 +08:00
|
|
|
cat >ls-files.expect <<-EOF &&
|
|
|
|
100644 2e0996000b7e9019eabcad29391bf0f5c7702f0b 0 one
|
|
|
|
100644 $EMPTY_BLOB 0 two
|
|
|
|
EOF
|
2014-06-13 20:19:51 +08:00
|
|
|
test_cmp ls-files.expect ls-files.actual &&
|
|
|
|
|
|
|
|
test-dump-split-index .git/index | sed "/^own/d" >actual &&
|
2017-02-28 01:59:59 +08:00
|
|
|
q_to_tab >expect <<-EOF &&
|
|
|
|
$BASE
|
|
|
|
100644 2e0996000b7e9019eabcad29391bf0f5c7702f0b 0Q
|
|
|
|
100644 $EMPTY_BLOB 0 two
|
|
|
|
replacements: 0
|
|
|
|
deletions:
|
|
|
|
EOF
|
2014-06-13 20:19:51 +08:00
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'remove file not in base index' '
|
|
|
|
git update-index --force-remove two &&
|
|
|
|
git ls-files --stage >ls-files.actual &&
|
2017-02-28 01:59:59 +08:00
|
|
|
cat >ls-files.expect <<-EOF &&
|
|
|
|
100644 2e0996000b7e9019eabcad29391bf0f5c7702f0b 0 one
|
|
|
|
EOF
|
2014-06-13 20:19:51 +08:00
|
|
|
test_cmp ls-files.expect ls-files.actual &&
|
|
|
|
|
|
|
|
test-dump-split-index .git/index | sed "/^own/d" >actual &&
|
2017-02-28 01:59:59 +08:00
|
|
|
q_to_tab >expect <<-EOF &&
|
|
|
|
$BASE
|
|
|
|
100644 2e0996000b7e9019eabcad29391bf0f5c7702f0b 0Q
|
|
|
|
replacements: 0
|
|
|
|
deletions:
|
|
|
|
EOF
|
2014-06-13 20:19:51 +08:00
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'remove file in base index' '
|
|
|
|
git update-index --force-remove one &&
|
|
|
|
git ls-files --stage >ls-files.actual &&
|
2017-02-28 01:59:59 +08:00
|
|
|
cat >ls-files.expect <<-EOF &&
|
|
|
|
EOF
|
2014-06-13 20:19:51 +08:00
|
|
|
test_cmp ls-files.expect ls-files.actual &&
|
|
|
|
|
|
|
|
test-dump-split-index .git/index | sed "/^own/d" >actual &&
|
2017-02-28 01:59:59 +08:00
|
|
|
cat >expect <<-EOF &&
|
|
|
|
$BASE
|
|
|
|
replacements:
|
|
|
|
deletions: 0
|
|
|
|
EOF
|
2014-06-13 20:19:51 +08:00
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'add original file back' '
|
|
|
|
: >one &&
|
|
|
|
git update-index --add one &&
|
|
|
|
git ls-files --stage >ls-files.actual &&
|
2017-02-28 01:59:59 +08:00
|
|
|
cat >ls-files.expect <<-EOF &&
|
|
|
|
100644 $EMPTY_BLOB 0 one
|
|
|
|
EOF
|
2014-06-13 20:19:51 +08:00
|
|
|
test_cmp ls-files.expect ls-files.actual &&
|
|
|
|
|
|
|
|
test-dump-split-index .git/index | sed "/^own/d" >actual &&
|
2017-02-28 01:59:59 +08:00
|
|
|
cat >expect <<-EOF &&
|
|
|
|
$BASE
|
|
|
|
100644 $EMPTY_BLOB 0 one
|
|
|
|
replacements:
|
|
|
|
deletions: 0
|
|
|
|
EOF
|
2014-06-13 20:19:51 +08:00
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'add new file' '
|
|
|
|
: >two &&
|
|
|
|
git update-index --add two &&
|
|
|
|
git ls-files --stage >actual &&
|
2017-02-28 01:59:59 +08:00
|
|
|
cat >expect <<-EOF &&
|
|
|
|
100644 $EMPTY_BLOB 0 one
|
|
|
|
100644 $EMPTY_BLOB 0 two
|
|
|
|
EOF
|
2014-06-13 20:19:51 +08:00
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'unify index, two files remain' '
|
|
|
|
git update-index --no-split-index &&
|
|
|
|
git ls-files --stage >ls-files.actual &&
|
2017-02-28 01:59:59 +08:00
|
|
|
cat >ls-files.expect <<-EOF &&
|
|
|
|
100644 $EMPTY_BLOB 0 one
|
|
|
|
100644 $EMPTY_BLOB 0 two
|
|
|
|
EOF
|
2015-03-20 18:06:15 +08:00
|
|
|
test_cmp ls-files.expect ls-files.actual &&
|
2014-06-13 20:19:51 +08:00
|
|
|
|
|
|
|
test-dump-split-index .git/index | sed "/^own/d" >actual &&
|
2017-02-28 01:59:59 +08:00
|
|
|
cat >expect <<-EOF &&
|
|
|
|
not a split index
|
|
|
|
EOF
|
2014-06-13 20:19:51 +08:00
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
rev-parse: fix several options when running in a subdirectory
In addition to making git_path() aware of certain file names that need
to be handled differently e.g. when running in worktrees, the commit
557bd833bb (git_path(): be aware of file relocation in $GIT_DIR,
2014-11-30) also snuck in a new option for `git rev-parse`:
`--git-path`.
On the face of it, there is no obvious bug in that commit's diff: it
faithfully calls git_path() on the argument and prints it out, i.e. `git
rev-parse --git-path <filename>` has the same precise behavior as
calling `git_path("<filename>")` in C.
The problem lies deeper, much deeper. In hindsight (which is always
unfair), implementing the .git/ directory discovery in
`setup_git_directory()` by changing the working directory may have
allowed us to avoid passing around a struct that contains information
about the current repository, but it bought us many, many problems.
In this case, when being called in a subdirectory, `git rev-parse`
changes the working directory to the top-level directory before calling
`git_path()`. In the new working directory, the result is correct. But
in the working directory of the calling script, it is incorrect.
Example: when calling `git rev-parse --git-path HEAD` in, say, the
Documentation/ subdirectory of Git's own source code, the string
`.git/HEAD` is printed.
Side note: that bug is hidden when running in a subdirectory of a
worktree that was added by the `git worktree` command: in that case, the
(correct) absolute path of the `HEAD` file is printed.
In the interest of time, this patch does not go the "correct" route to
introduce a struct with repository information (and removing global
state in the process), instead this patch chooses to detect when the
command was called in a subdirectory and forces the result to be an
absolute path.
While at it, we are also fixing the output of --git-common-dir and
--shared-index-path.
Lastly, please note that we reuse the same strbuf for all of the
relative_path() calls; this avoids frequent allocation (and duplicated
code), and it does not risk memory leaks, for two reasons: 1) the
cmd_rev_parse() function does not return anywhere between the use of
the new strbuf instance and its final release, and 2) git-rev-parse is
one of these "one-shot" programs in Git, i.e. it exits after running
for a very short time, meaning that all allocated memory is released
with the exit() call anyway.
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2017-02-18 00:59:06 +08:00
|
|
|
test_expect_success 'rev-parse --shared-index-path' '
|
2017-02-18 00:59:02 +08:00
|
|
|
test_create_repo split-index &&
|
|
|
|
(
|
|
|
|
cd split-index &&
|
|
|
|
git update-index --split-index &&
|
|
|
|
echo .git/sharedindex* >expect &&
|
|
|
|
git rev-parse --shared-index-path >actual &&
|
|
|
|
test_cmp expect actual &&
|
|
|
|
mkdir subdirectory &&
|
|
|
|
cd subdirectory &&
|
|
|
|
echo ../.git/sharedindex* >expect &&
|
|
|
|
git rev-parse --shared-index-path >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
)
|
|
|
|
'
|
|
|
|
|
2017-02-28 02:00:04 +08:00
|
|
|
test_expect_success 'set core.splitIndex config variable to true' '
|
|
|
|
git config core.splitIndex true &&
|
|
|
|
: >three &&
|
|
|
|
git update-index --add three &&
|
|
|
|
git ls-files --stage >ls-files.actual &&
|
|
|
|
cat >ls-files.expect <<-EOF &&
|
|
|
|
100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0 one
|
|
|
|
100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0 three
|
|
|
|
100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0 two
|
|
|
|
EOF
|
|
|
|
test_cmp ls-files.expect ls-files.actual &&
|
|
|
|
BASE=$(test-dump-split-index .git/index | grep "^base") &&
|
|
|
|
test-dump-split-index .git/index | sed "/^own/d" >actual &&
|
|
|
|
cat >expect <<-EOF &&
|
|
|
|
$BASE
|
|
|
|
replacements:
|
|
|
|
deletions:
|
|
|
|
EOF
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'set core.splitIndex config variable to false' '
|
|
|
|
git config core.splitIndex false &&
|
|
|
|
git update-index --force-remove three &&
|
|
|
|
git ls-files --stage >ls-files.actual &&
|
|
|
|
cat >ls-files.expect <<-EOF &&
|
|
|
|
100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0 one
|
|
|
|
100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0 two
|
|
|
|
EOF
|
|
|
|
test_cmp ls-files.expect ls-files.actual &&
|
|
|
|
test-dump-split-index .git/index | sed "/^own/d" >actual &&
|
|
|
|
cat >expect <<-EOF &&
|
|
|
|
not a split index
|
|
|
|
EOF
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
2017-02-28 02:00:09 +08:00
|
|
|
test_expect_success 'set core.splitIndex config variable to true' '
|
|
|
|
git config core.splitIndex true &&
|
|
|
|
: >three &&
|
|
|
|
git update-index --add three &&
|
|
|
|
BASE=$(test-dump-split-index .git/index | grep "^base") &&
|
|
|
|
test-dump-split-index .git/index | sed "/^own/d" >actual &&
|
|
|
|
cat >expect <<-EOF &&
|
|
|
|
$BASE
|
|
|
|
replacements:
|
|
|
|
deletions:
|
|
|
|
EOF
|
|
|
|
test_cmp expect actual &&
|
|
|
|
: >four &&
|
|
|
|
git update-index --add four &&
|
|
|
|
test-dump-split-index .git/index | sed "/^own/d" >actual &&
|
|
|
|
cat >expect <<-EOF &&
|
|
|
|
$BASE
|
|
|
|
100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0 four
|
|
|
|
replacements:
|
|
|
|
deletions:
|
|
|
|
EOF
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'check behavior with splitIndex.maxPercentChange unset' '
|
|
|
|
git config --unset splitIndex.maxPercentChange &&
|
|
|
|
: >five &&
|
|
|
|
git update-index --add five &&
|
|
|
|
BASE=$(test-dump-split-index .git/index | grep "^base") &&
|
|
|
|
test-dump-split-index .git/index | sed "/^own/d" >actual &&
|
|
|
|
cat >expect <<-EOF &&
|
|
|
|
$BASE
|
|
|
|
replacements:
|
|
|
|
deletions:
|
|
|
|
EOF
|
|
|
|
test_cmp expect actual &&
|
|
|
|
: >six &&
|
|
|
|
git update-index --add six &&
|
|
|
|
test-dump-split-index .git/index | sed "/^own/d" >actual &&
|
|
|
|
cat >expect <<-EOF &&
|
|
|
|
$BASE
|
|
|
|
100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0 six
|
|
|
|
replacements:
|
|
|
|
deletions:
|
|
|
|
EOF
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'check splitIndex.maxPercentChange set to 0' '
|
|
|
|
git config splitIndex.maxPercentChange 0 &&
|
|
|
|
: >seven &&
|
|
|
|
git update-index --add seven &&
|
|
|
|
BASE=$(test-dump-split-index .git/index | grep "^base") &&
|
|
|
|
test-dump-split-index .git/index | sed "/^own/d" >actual &&
|
|
|
|
cat >expect <<-EOF &&
|
|
|
|
$BASE
|
|
|
|
replacements:
|
|
|
|
deletions:
|
|
|
|
EOF
|
|
|
|
test_cmp expect actual &&
|
|
|
|
: >eight &&
|
|
|
|
git update-index --add eight &&
|
|
|
|
BASE=$(test-dump-split-index .git/index | grep "^base") &&
|
|
|
|
test-dump-split-index .git/index | sed "/^own/d" >actual &&
|
|
|
|
cat >expect <<-EOF &&
|
|
|
|
$BASE
|
|
|
|
replacements:
|
|
|
|
deletions:
|
|
|
|
EOF
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
2017-03-06 17:41:59 +08:00
|
|
|
test_expect_success 'shared index files expire after 2 weeks by default' '
|
|
|
|
: >ten &&
|
|
|
|
git update-index --add ten &&
|
2017-03-06 17:42:01 +08:00
|
|
|
test $(ls .git/sharedindex.* | wc -l) -gt 2 &&
|
2017-03-06 17:41:59 +08:00
|
|
|
just_under_2_weeks_ago=$((5-14*86400)) &&
|
|
|
|
test-chmtime =$just_under_2_weeks_ago .git/sharedindex.* &&
|
|
|
|
: >eleven &&
|
|
|
|
git update-index --add eleven &&
|
2017-03-06 17:42:01 +08:00
|
|
|
test $(ls .git/sharedindex.* | wc -l) -gt 2 &&
|
2017-03-06 17:41:59 +08:00
|
|
|
just_over_2_weeks_ago=$((-1-14*86400)) &&
|
|
|
|
test-chmtime =$just_over_2_weeks_ago .git/sharedindex.* &&
|
|
|
|
: >twelve &&
|
|
|
|
git update-index --add twelve &&
|
2017-03-06 17:42:01 +08:00
|
|
|
test $(ls .git/sharedindex.* | wc -l) -le 2
|
2017-03-06 17:41:59 +08:00
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'check splitIndex.sharedIndexExpire set to 16 days' '
|
|
|
|
git config splitIndex.sharedIndexExpire "16.days.ago" &&
|
|
|
|
test-chmtime =$just_over_2_weeks_ago .git/sharedindex.* &&
|
|
|
|
: >thirteen &&
|
|
|
|
git update-index --add thirteen &&
|
2017-03-06 17:42:01 +08:00
|
|
|
test $(ls .git/sharedindex.* | wc -l) -gt 2 &&
|
2017-03-06 17:41:59 +08:00
|
|
|
just_over_16_days_ago=$((-1-16*86400)) &&
|
|
|
|
test-chmtime =$just_over_16_days_ago .git/sharedindex.* &&
|
|
|
|
: >fourteen &&
|
|
|
|
git update-index --add fourteen &&
|
2017-03-06 17:42:01 +08:00
|
|
|
test $(ls .git/sharedindex.* | wc -l) -le 2
|
2017-03-06 17:41:59 +08:00
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'check splitIndex.sharedIndexExpire set to "never" and "now"' '
|
|
|
|
git config splitIndex.sharedIndexExpire never &&
|
|
|
|
just_10_years_ago=$((-365*10*86400)) &&
|
|
|
|
test-chmtime =$just_10_years_ago .git/sharedindex.* &&
|
|
|
|
: >fifteen &&
|
|
|
|
git update-index --add fifteen &&
|
2017-03-06 17:42:01 +08:00
|
|
|
test $(ls .git/sharedindex.* | wc -l) -gt 2 &&
|
2017-03-06 17:41:59 +08:00
|
|
|
git config splitIndex.sharedIndexExpire now &&
|
|
|
|
just_1_second_ago=-1 &&
|
|
|
|
test-chmtime =$just_1_second_ago .git/sharedindex.* &&
|
|
|
|
: >sixteen &&
|
|
|
|
git update-index --add sixteen &&
|
2017-03-06 17:42:01 +08:00
|
|
|
test $(ls .git/sharedindex.* | wc -l) -le 2
|
2017-03-06 17:41:59 +08:00
|
|
|
'
|
|
|
|
|
2014-06-13 20:19:51 +08:00
|
|
|
test_done
|