]> git.ipfire.org Git - thirdparty/git.git/commitdiff
advice.h: add advise_on_moving_dirty_path()
authorShaoxuan Yuan <shaoxuan.yuan02@gmail.com>
Tue, 9 Aug 2022 12:09:09 +0000 (20:09 +0800)
committerJunio C Hamano <gitster@pobox.com>
Wed, 10 Aug 2022 20:57:50 +0000 (13:57 -0700)
Add an advice.

When the user use `git mv --sparse <dirty-path> <destination>`, Git
will warn the user to use `git add --sparse <paths>` then use
`git sparse-checkout reapply` to apply the sparsity rules.

Add a few lines to previous "move dirty path" tests so we can test
this new advice is working.

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

index 6fda9edbc2474fe15c128014b99660034d269177..fd189689437c7512e549482fe696f7a2d2400cd2 100644 (file)
--- a/advice.c
+++ b/advice.c
@@ -261,3 +261,22 @@ void detach_advice(const char *new_name)
 
        fprintf(stderr, fmt, new_name);
 }
+
+void advise_on_moving_dirty_path(struct string_list *pathspec_list)
+{
+       struct string_list_item *item;
+
+       if (!pathspec_list->nr)
+               return;
+
+       fprintf(stderr, _("The following paths have been moved outside the\n"
+                         "sparse-checkout definition but are not sparse due to local\n"
+                         "modifications.\n"));
+       for_each_string_list_item(item, pathspec_list)
+               fprintf(stderr, "%s\n", item->string);
+
+       advise_if_enabled(ADVICE_UPDATE_SPARSE_PATH,
+                         _("To correct the sparsity of these paths, do the following:\n"
+                           "* Use \"git add --sparse <paths>\" to update the index\n"
+                           "* Use \"git sparse-checkout reapply\" to apply the sparsity rules"));
+}
index 7ddc6cbc1ac8d7d9d15c9761187b87b5c00e4107..07e0f76833e78070a26ec288db929ec966024d7e 100644 (file)
--- a/advice.h
+++ b/advice.h
@@ -74,5 +74,6 @@ void NORETURN die_conclude_merge(void);
 void NORETURN die_ff_impossible(void);
 void advise_on_updating_sparse_paths(struct string_list *pathspec_list);
 void detach_advice(const char *new_name);
+void advise_on_moving_dirty_path(struct string_list *pathspec_list);
 
 #endif /* ADVICE_H */
index f4961c0ffde3c2590236af9b13ac6ee39aab2990..d80adf8de5305fee825afd06c027937f28e7ced7 100644 (file)
@@ -532,6 +532,9 @@ remove_entry:
        strbuf_release(&a_src_dir);
        free(src_dir);
 
+       if (dirty_paths.nr)
+               advise_on_moving_dirty_path(&dirty_paths);
+
        if (gitmodules_modified)
                stage_updated_gitmodules(&the_index);
 
index df8c0fa5723aaa68d99e906e11dc370c03c8a974..5e5eb70e7a9c4f1456d9181823973ee68226bb5c 100755 (executable)
@@ -28,12 +28,25 @@ test_expect_success 'setup' "
        updated in the index:
        EOF
 
-       cat >sparse_hint <<-EOF
+       cat >sparse_hint <<-EOF &&
        hint: If you intend to update such entries, try one of the following:
        hint: * Use the --sparse option.
        hint: * Disable or modify the sparsity rules.
        hint: Disable this message with \"git config advice.updateSparsePath false\"
        EOF
+
+       cat >dirty_error_header <<-EOF &&
+       The following paths have been moved outside the
+       sparse-checkout definition but are not sparse due to local
+       modifications.
+       EOF
+
+       cat >dirty_hint <<-EOF
+       hint: To correct the sparsity of these paths, do the following:
+       hint: * Use \"git add --sparse <paths>\" to update the index
+       hint: * Use \"git sparse-checkout reapply\" to apply the sparsity rules
+       hint: Disable this message with \"git config advice.updateSparsePath false\"
+       EOF
 "
 
 test_expect_success 'mv refuses to move sparse-to-sparse' '
@@ -431,6 +444,10 @@ test_expect_success 'move dirty path from in-cone to out-of-cone' '
        test_cmp expect stderr &&
 
        git mv --sparse sub/d folder1 2>stderr &&
+       cat dirty_error_header >expect &&
+       echo "folder1/d" >>expect &&
+       cat dirty_hint >>expect &&
+       test_cmp expect stderr &&
 
        test_path_is_missing sub/d &&
        test_path_is_file folder1/d &&
@@ -478,6 +495,11 @@ test_expect_success 'move partially-dirty dir from in-cone to out-of-cone' '
        test_cmp expect stderr &&
 
        git mv --sparse sub/dir folder1 2>stderr &&
+       cat dirty_error_header >expect &&
+       echo "folder1/dir/e2" >>expect &&
+       echo "folder1/dir/e3" >>expect &&
+       cat dirty_hint >>expect &&
+       test_cmp expect stderr &&
 
        test_path_is_missing sub/dir &&
        test_path_is_missing folder1/dir/e &&