@@ -53,6 +53,10 @@ static const char *diff_index_args[] = {
"diff-index", "--quiet", "HEAD", "--", NULL
};
+static const char *update_index_args[] = {
+ "update-index", "--unmerged", "-q", "--refresh", NULL
+};
+
struct commit_name {
struct hashmap_entry entry;
struct object_id peeled;
@@ -645,6 +649,13 @@ int cmd_describe(int argc, const char **argv, const char *prefix)
if (argc == 0) {
if (broken) {
struct child_process cp = CHILD_PROCESS_INIT;
+ strvec_pushv(&cp.args, update_index_args);
+ cp.git_cmd = 1;
+ cp.no_stdin = 1;
+ cp.no_stdout = 1;
+ if (run_command(&cp))
+ child_process_clear(&cp);
+
strvec_pushv(&cp.args, diff_index_args);
cp.git_cmd = 1;
cp.no_stdin = 1;
@@ -671,4 +671,40 @@ test_expect_success 'setup misleading taggerdates' '
check_describe newer-tag-older-commit~1 --contains unique-file~2
+test_expect_success 'describe --dirty with a file with changed stat' '
+ git init stat-dirty &&
+ (
+ cd stat-dirty &&
+
+ echo A >file &&
+ git add file &&
+ git commit -m A &&
+ git tag A -a -m A &&
+
+ cat file >file.new &&
+ mv file.new file &&
+ git describe --dirty >actual &&
+ echo "A" >expected &&
+ test_cmp expected actual
+ )
+'
+
+test_expect_success 'describe --dirty --broken with a file with changed stat' '
+ git init stat-dirty-broken &&
+ (
+ cd stat-dirty-broken &&
+
+ echo A >file &&
+ git add file &&
+ git commit -m A &&
+ git tag A -a -m A &&
+
+ cat file >file.new &&
+ mv file.new file &&
+ git describe --dirty --broken >actual &&
+ echo "A" >expected &&
+ test_cmp expected actual
+ )
+'
+
test_done