]> git.ipfire.org Git - thirdparty/git.git/commitdiff
mv: check if out-of-cone file exists in index with SKIP_WORKTREE bit
authorShaoxuan Yuan <shaoxuan.yuan02@gmail.com>
Thu, 30 Jun 2022 02:37:34 +0000 (10:37 +0800)
committerJunio C Hamano <gitster@pobox.com>
Fri, 1 Jul 2022 21:50:16 +0000 (14:50 -0700)
Originally, moving a <source> file which is not on-disk but exists in
index as a SKIP_WORKTREE enabled cache entry, "giv mv" command errors
out with "bad source".

Change the checking logic, so that such <source>
file makes "giv mv" command warns with "advise_on_updating_sparse_paths()"
instead of "bad source"; also user now can supply a "--sparse" flag so
this operation can be carried out successfully.

Signed-off-by: Shaoxuan Yuan <shaoxuan.yuan02@gmail.com>
Acked-by: Derrick Stolee <derrickstolee@github.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/mv.c
t/t7002-mv-sparse-checkout.sh

index e800da3ab83a84667ffcde36d38328156971e5f4..520be8577484535ec08ee4ba1b54c218b32610b4 100644 (file)
@@ -186,11 +186,28 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
 
                length = strlen(src);
                if (lstat(src, &st) < 0) {
-                       /* only error if existence is expected. */
-                       if (modes[i] != SPARSE) {
+                       int pos;
+                       const struct cache_entry *ce;
+
+                       pos = cache_name_pos(src, length);
+                       if (pos < 0) {
+                               /* only error if existence is expected. */
+                               if (modes[i] != SPARSE)
+                                       bad = _("bad source");
+                               goto act_on_entry;
+                       }
+
+                       ce = active_cache[pos];
+                       if (!ce_skip_worktree(ce)) {
                                bad = _("bad source");
                                goto act_on_entry;
                        }
+
+                       if (!ignore_sparse)
+                               string_list_append(&only_match_skip_worktree, src);
+                       else
+                               modes[i] = SPARSE;
+                       goto act_on_entry;
                }
                if (!strncmp(src, dst, length) &&
                    (dst[length] == 0 || dst[length] == '/')) {
index 023e657c9ee1c3a76b241da624f35f97a0c81c92..1510b5ed6a79040920f59fe6a72c4f16a1b71eff 100755 (executable)
@@ -241,7 +241,7 @@ test_expect_failure 'can move out-of-cone directory with --sparse' '
        test_path_is_file sub/folder1/file1
 '
 
-test_expect_failure 'refuse to move out-of-cone file without --sparse' '
+test_expect_success 'refuse to move out-of-cone file without --sparse' '
        test_when_finished "cleanup_sparse_checkout" &&
        setup_sparse_checkout &&
 
@@ -252,7 +252,7 @@ test_expect_failure 'refuse to move out-of-cone file without --sparse' '
        test_cmp expect stderr
 '
 
-test_expect_failure 'can move out-of-cone file with --sparse' '
+test_expect_success 'can move out-of-cone file with --sparse' '
        test_when_finished "cleanup_sparse_checkout" &&
        setup_sparse_checkout &&