describe: setup working tree for --dirty

We don't use NEED_WORK_TREE when running the git-describe builtin,
since you should be able to describe a commit even in a bare repository.
However, the --dirty flag does need a working tree. Since we don't call
setup_work_tree(), it uses whatever directory we happen to be in. That's
unlikely to match our index, meaning we'd say "dirty" even when the real
working tree is clean.

We can fix that by calling setup_work_tree() once we know that the user
has asked for --dirty.

The --broken option also needs a working tree. But because its
implementation calls git-diff-index we don‘t have to setup the working
tree in the git-describe process.

Signed-off-by: Sebastian Staudt <koraktor@gmail.com>
Helped-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Sebastian Staudt 2019-02-03 07:00:24 +01:00 коммит произвёл Junio C Hamano
Родитель 268fbcd172
Коммит 2ed5c8e174
2 изменённых файлов: 34 добавлений и 0 удалений

Просмотреть файл

@ -617,6 +617,7 @@ int cmd_describe(int argc, const char **argv, const char *prefix)
struct argv_array args = ARGV_ARRAY_INIT; struct argv_array args = ARGV_ARRAY_INIT;
int fd, result; int fd, result;
setup_work_tree();
read_cache_preload(NULL); read_cache_preload(NULL);
refresh_index(&the_index, REFRESH_QUIET|REFRESH_UNMERGED, refresh_index(&the_index, REFRESH_QUIET|REFRESH_UNMERGED,
NULL, NULL, NULL); NULL, NULL, NULL);

Просмотреть файл

@ -146,14 +146,38 @@ check_describe A-* HEAD
check_describe "A-*[0-9a-f]" --dirty check_describe "A-*[0-9a-f]" --dirty
test_expect_success 'describe --dirty with --work-tree' '
(
cd "$TEST_DIRECTORY" &&
git --git-dir "$TRASH_DIRECTORY/.git" --work-tree "$TRASH_DIRECTORY" describe --dirty >"$TRASH_DIRECTORY/out"
) &&
grep "^A-[1-9][0-9]\?-g[0-9a-f]\+$" out
'
test_expect_success 'set-up dirty work tree' ' test_expect_success 'set-up dirty work tree' '
echo >>file echo >>file
' '
check_describe "A-*[0-9a-f]-dirty" --dirty check_describe "A-*[0-9a-f]-dirty" --dirty
test_expect_success 'describe --dirty with --work-tree (dirty)' '
(
cd "$TEST_DIRECTORY" &&
git --git-dir "$TRASH_DIRECTORY/.git" --work-tree "$TRASH_DIRECTORY" describe --dirty >"$TRASH_DIRECTORY/out"
) &&
grep "^A-[1-9][0-9]\?-g[0-9a-f]\+-dirty$" out
'
check_describe "A-*[0-9a-f].mod" --dirty=.mod check_describe "A-*[0-9a-f].mod" --dirty=.mod
test_expect_success 'describe --dirty=.mod with --work-tree (dirty)' '
(
cd "$TEST_DIRECTORY" &&
git --git-dir "$TRASH_DIRECTORY/.git" --work-tree "$TRASH_DIRECTORY" describe --dirty=.mod >"$TRASH_DIRECTORY/out"
) &&
grep "^A-[1-9][0-9]\?-g[0-9a-f]\+.mod$" out
'
test_expect_success 'describe --dirty HEAD' ' test_expect_success 'describe --dirty HEAD' '
test_must_fail git describe --dirty HEAD test_must_fail git describe --dirty HEAD
' '
@ -304,8 +328,17 @@ test_expect_success 'describe chokes on severely broken submodules' '
mv .git/modules/sub1/ .git/modules/sub_moved && mv .git/modules/sub1/ .git/modules/sub_moved &&
test_must_fail git describe --dirty test_must_fail git describe --dirty
' '
test_expect_success 'describe ignoring a broken submodule' ' test_expect_success 'describe ignoring a broken submodule' '
git describe --broken >out && git describe --broken >out &&
grep broken out
'
test_expect_success 'describe with --work-tree ignoring a broken submodule' '
(
cd "$TEST_DIRECTORY" &&
git --git-dir "$TRASH_DIRECTORY/.git" --work-tree "$TRASH_DIRECTORY" describe --broken >"$TRASH_DIRECTORY/out"
) &&
test_when_finished "mv .git/modules/sub_moved .git/modules/sub1" && test_when_finished "mv .git/modules/sub_moved .git/modules/sub1" &&
grep broken out grep broken out
' '