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>

Sebastian Staudt committed Feb 3, 2019 at 07:00 UTC 2ed5c8e174dae73459df11386dc83e8ef4154e3f
2 files changed +34
builtin/describe.c
+1
@@ -617,6 +617,7 @@ int cmd_describe(int argc, const char **argv, const char *prefix)
617 struct argv_array args = ARGV_ARRAY_INIT;
618 int fd, result;
619
620 + setup_work_tree();
621 read_cache_preload(NULL);
622 refresh_index(&the_index, REFRESH_QUIET|REFRESH_UNMERGED,
623 NULL, NULL, NULL);
t/t6120-describe.sh
+33
@@ -146,14 +146,38 @@ check_describe A-* HEAD
146
147 check_describe "A-*[0-9a-f]" --dirty
148
149 +test_expect_success 'describe --dirty with --work-tree' '
150 + (
151 + cd "$TEST_DIRECTORY" &&
152 + git --git-dir "$TRASH_DIRECTORY/.git" --work-tree "$TRASH_DIRECTORY" describe --dirty >"$TRASH_DIRECTORY/out"
153 + ) &&
154 + grep "^A-[1-9][0-9]\?-g[0-9a-f]\+$" out
155 +'
156 +
157 test_expect_success 'set-up dirty work tree' '
158 echo >>file
159 '
160
161 check_describe "A-*[0-9a-f]-dirty" --dirty
162
163 +test_expect_success 'describe --dirty with --work-tree (dirty)' '
164 + (
165 + cd "$TEST_DIRECTORY" &&
166 + git --git-dir "$TRASH_DIRECTORY/.git" --work-tree "$TRASH_DIRECTORY" describe --dirty >"$TRASH_DIRECTORY/out"
167 + ) &&
168 + grep "^A-[1-9][0-9]\?-g[0-9a-f]\+-dirty$" out
169 +'
170 +
171 check_describe "A-*[0-9a-f].mod" --dirty=.mod
172
173 +test_expect_success 'describe --dirty=.mod with --work-tree (dirty)' '
174 + (
175 + cd "$TEST_DIRECTORY" &&
176 + git --git-dir "$TRASH_DIRECTORY/.git" --work-tree "$TRASH_DIRECTORY" describe --dirty=.mod >"$TRASH_DIRECTORY/out"
177 + ) &&
178 + grep "^A-[1-9][0-9]\?-g[0-9a-f]\+.mod$" out
179 +'
180 +
181 test_expect_success 'describe --dirty HEAD' '
182 test_must_fail git describe --dirty HEAD
183 '
@@ -304,8 +328,17 @@ test_expect_success 'describe chokes on severely broken submodules' '
328 mv .git/modules/sub1/ .git/modules/sub_moved &&
329 test_must_fail git describe --dirty
330 '
331 +
332 test_expect_success 'describe ignoring a broken submodule' '
333 git describe --broken >out &&
334 + grep broken out
335 +'
336 +
337 +test_expect_success 'describe with --work-tree ignoring a broken submodule' '
338 + (
339 + cd "$TEST_DIRECTORY" &&
340 + git --git-dir "$TRASH_DIRECTORY/.git" --work-tree "$TRASH_DIRECTORY" describe --broken >"$TRASH_DIRECTORY/out"
341 + ) &&
342 test_when_finished "mv .git/modules/sub_moved .git/modules/sub1" &&
343 grep broken out
344 '