advice.h: add advise_on_moving_dirty_path()

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>
This commit is contained in:
Shaoxuan Yuan 2022-08-09 20:09:09 +08:00 committed by Junio C Hamano
parent b6f51e3db9
commit 5efd533ed8
4 changed files with 46 additions and 1 deletions

View File

@ -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"));
}

View File

@ -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 */

View 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);

View File

@ -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 &&