Merge branch 'dt/submodule-diff-fixes'

"git diff --submodule=diff" showed failure from run_command() when
trying to run diff inside a submodule, when the user manually
removes the submodule directory.

* dt/submodule-diff-fixes:
  diff --submodule=diff: don't print failure message twice
  diff --submodule=diff: do not fail on ever-initialied deleted submodules
  t4060: remove unused variable
This commit is contained in:
Junio C Hamano 2021-09-20 15:20:41 -07:00
Родитель c2509c5407 67f61efbb9
Коммит 75405e7270
2 изменённых файлов: 164 добавлений и 9 удалений

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

@ -720,8 +720,20 @@ void show_submodule_inline_diff(struct diff_options *o, const char *path,
strvec_push(&cp.args, oid_to_hex(new_oid));
prepare_submodule_repo_env(&cp.env_array);
if (start_command(&cp))
if (!is_directory(path)) {
/* fall back to absorbed git dir, if any */
if (!sub)
goto done;
cp.dir = sub->gitdir;
strvec_push(&cp.env_array, GIT_DIR_ENVIRONMENT "=.");
strvec_push(&cp.env_array, GIT_WORK_TREE_ENVIRONMENT "=.");
}
if (start_command(&cp)) {
diff_emit_submodule_error(o, "(diff failed)\n");
goto done;
}
while (strbuf_getwholeline_fd(&sb, cp.out, '\n') != EOF)
diff_emit_submodule_pipethrough(o, sb.buf, sb.len);

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

@ -361,7 +361,6 @@ test_expect_success 'typechanged submodule(submodule->blob)' '
rm -f sm1 &&
test_create_repo sm1 &&
head6=$(add_file sm1 foo6 foo7)
fullhead6=$(cd sm1; git rev-parse --verify HEAD)
test_expect_success 'nonexistent commit' '
git diff-index -p --submodule=diff HEAD >actual &&
cat >expected <<-EOF &&
@ -704,10 +703,26 @@ test_expect_success 'path filter' '
diff_cmp expected actual
'
commit_file sm2
cat >.gitmodules <<-EOF
[submodule "sm2"]
path = sm2
url = bogus_url
EOF
git add .gitmodules
commit_file sm2 .gitmodules
test_expect_success 'given commit' '
git diff-index -p --submodule=diff HEAD^ >actual &&
cat >expected <<-EOF &&
diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 1234567..89abcde
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,3 @@
+[submodule "sm2"]
+path = sm2
+url = bogus_url
Submodule sm1 $head7...0000000 (submodule deleted)
Submodule sm2 0000000...$head9 (new submodule)
diff --git a/sm2/foo8 b/sm2/foo8
@ -729,15 +744,21 @@ test_expect_success 'given commit' '
'
test_expect_success 'setup .git file for sm2' '
(cd sm2 &&
REAL="$(pwd)/../.real" &&
mv .git "$REAL" &&
echo "gitdir: $REAL" >.git)
git submodule absorbgitdirs sm2
'
test_expect_success 'diff --submodule=diff with .git file' '
git diff --submodule=diff HEAD^ >actual &&
cat >expected <<-EOF &&
diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 1234567..89abcde
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,3 @@
+[submodule "sm2"]
+path = sm2
+url = bogus_url
Submodule sm1 $head7...0000000 (submodule deleted)
Submodule sm2 0000000...$head9 (new submodule)
diff --git a/sm2/foo8 b/sm2/foo8
@ -758,9 +779,67 @@ test_expect_success 'diff --submodule=diff with .git file' '
diff_cmp expected actual
'
mv sm2 sm2-bak
test_expect_success 'deleted submodule with .git file' '
git diff-index -p --submodule=diff HEAD >actual &&
cat >expected <<-EOF &&
Submodule sm1 $head7...0000000 (submodule deleted)
Submodule sm2 $head9...0000000 (submodule deleted)
diff --git a/sm2/foo8 b/sm2/foo8
deleted file mode 100644
index 1234567..89abcde
--- a/sm2/foo8
+++ /dev/null
@@ -1 +0,0 @@
-foo8
diff --git a/sm2/foo9 b/sm2/foo9
deleted file mode 100644
index 1234567..89abcde
--- a/sm2/foo9
+++ /dev/null
@@ -1 +0,0 @@
-foo9
EOF
diff_cmp expected actual
'
echo submodule-to-blob>sm2
test_expect_success 'typechanged(submodule->blob) submodule with .git file' '
git diff-index -p --submodule=diff HEAD >actual &&
cat >expected <<-EOF &&
Submodule sm1 $head7...0000000 (submodule deleted)
Submodule sm2 $head9...0000000 (submodule deleted)
diff --git a/sm2/foo8 b/sm2/foo8
deleted file mode 100644
index 1234567..89abcde
--- a/sm2/foo8
+++ /dev/null
@@ -1 +0,0 @@
-foo8
diff --git a/sm2/foo9 b/sm2/foo9
deleted file mode 100644
index 1234567..89abcde
--- a/sm2/foo9
+++ /dev/null
@@ -1 +0,0 @@
-foo9
diff --git a/sm2 b/sm2
new file mode 100644
index 1234567..89abcde
--- /dev/null
+++ b/sm2
@@ -0,0 +1 @@
+submodule-to-blob
EOF
diff_cmp expected actual
'
rm sm2
mv sm2-bak sm2
test_expect_success 'setup nested submodule' '
git submodule add -f ./sm2 &&
git commit -a -m "add sm2" &&
git -C sm2 submodule add ../sm2 nested &&
git -C sm2 commit -a -m "nested sub" &&
head10=$(git -C sm2 rev-parse --short --verify HEAD)
@ -791,6 +870,7 @@ test_expect_success 'diff --submodule=diff with moved nested submodule HEAD' '
test_expect_success 'diff --submodule=diff recurses into nested submodules' '
cat >expected <<-EOF &&
Submodule sm1 $head7...0000000 (submodule deleted)
Submodule sm2 contains modified content
Submodule sm2 $head9..$head10:
diff --git a/sm2/.gitmodules b/sm2/.gitmodules
@ -830,4 +910,67 @@ test_expect_success 'diff --submodule=diff recurses into nested submodules' '
diff_cmp expected actual
'
(cd sm2; commit_file nested)
commit_file sm2
head12=$(cd sm2; git rev-parse --short --verify HEAD)
mv sm2 sm2-bak
test_expect_success 'diff --submodule=diff recurses into deleted nested submodules' '
cat >expected <<-EOF &&
Submodule sm1 $head7...0000000 (submodule deleted)
Submodule sm2 $head12...0000000 (submodule deleted)
diff --git a/sm2/.gitmodules b/sm2/.gitmodules
deleted file mode 100644
index 3a816b8..0000000
--- a/sm2/.gitmodules
+++ /dev/null
@@ -1,3 +0,0 @@
-[submodule "nested"]
- path = nested
- url = ../sm2
diff --git a/sm2/foo8 b/sm2/foo8
deleted file mode 100644
index db9916b..0000000
--- a/sm2/foo8
+++ /dev/null
@@ -1 +0,0 @@
-foo8
diff --git a/sm2/foo9 b/sm2/foo9
deleted file mode 100644
index 9c3b4f6..0000000
--- a/sm2/foo9
+++ /dev/null
@@ -1 +0,0 @@
-foo9
Submodule nested $head11...0000000 (submodule deleted)
diff --git a/sm2/nested/file b/sm2/nested/file
deleted file mode 100644
index ca281f5..0000000
--- a/sm2/nested/file
+++ /dev/null
@@ -1 +0,0 @@
-nested content
diff --git a/sm2/nested/foo8 b/sm2/nested/foo8
deleted file mode 100644
index db9916b..0000000
--- a/sm2/nested/foo8
+++ /dev/null
@@ -1 +0,0 @@
-foo8
diff --git a/sm2/nested/foo9 b/sm2/nested/foo9
deleted file mode 100644
index 9c3b4f6..0000000
--- a/sm2/nested/foo9
+++ /dev/null
@@ -1 +0,0 @@
-foo9
EOF
git diff --submodule=diff >actual 2>err &&
test_must_be_empty err &&
diff_cmp expected actual
'
mv sm2-bak sm2
test_done