Skip to content

Commit 5efd533

Browse files
ffyuandagitster
authored andcommitted
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 <[email protected]> Signed-off-by: Shaoxuan Yuan <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent b6f51e3 commit 5efd533

File tree

4 files changed

+46
-1
lines changed

4 files changed

+46
-1
lines changed

advice.c

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -261,3 +261,22 @@ void detach_advice(const char *new_name)
261261

262262
fprintf(stderr, fmt, new_name);
263263
}
264+
265+
void advise_on_moving_dirty_path(struct string_list *pathspec_list)
266+
{
267+
struct string_list_item *item;
268+
269+
if (!pathspec_list->nr)
270+
return;
271+
272+
fprintf(stderr, _("The following paths have been moved outside the\n"
273+
"sparse-checkout definition but are not sparse due to local\n"
274+
"modifications.\n"));
275+
for_each_string_list_item(item, pathspec_list)
276+
fprintf(stderr, "%s\n", item->string);
277+
278+
advise_if_enabled(ADVICE_UPDATE_SPARSE_PATH,
279+
_("To correct the sparsity of these paths, do the following:\n"
280+
"* Use \"git add --sparse <paths>\" to update the index\n"
281+
"* Use \"git sparse-checkout reapply\" to apply the sparsity rules"));
282+
}

advice.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,5 +74,6 @@ void NORETURN die_conclude_merge(void);
7474
void NORETURN die_ff_impossible(void);
7575
void advise_on_updating_sparse_paths(struct string_list *pathspec_list);
7676
void detach_advice(const char *new_name);
77+
void advise_on_moving_dirty_path(struct string_list *pathspec_list);
7778

7879
#endif /* ADVICE_H */

builtin/mv.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -532,6 +532,9 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
532532
strbuf_release(&a_src_dir);
533533
free(src_dir);
534534

535+
if (dirty_paths.nr)
536+
advise_on_moving_dirty_path(&dirty_paths);
537+
535538
if (gitmodules_modified)
536539
stage_updated_gitmodules(&the_index);
537540

t/t7002-mv-sparse-checkout.sh

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,25 @@ test_expect_success 'setup' "
2828
updated in the index:
2929
EOF
3030
31-
cat >sparse_hint <<-EOF
31+
cat >sparse_hint <<-EOF &&
3232
hint: If you intend to update such entries, try one of the following:
3333
hint: * Use the --sparse option.
3434
hint: * Disable or modify the sparsity rules.
3535
hint: Disable this message with \"git config advice.updateSparsePath false\"
3636
EOF
37+
38+
cat >dirty_error_header <<-EOF &&
39+
The following paths have been moved outside the
40+
sparse-checkout definition but are not sparse due to local
41+
modifications.
42+
EOF
43+
44+
cat >dirty_hint <<-EOF
45+
hint: To correct the sparsity of these paths, do the following:
46+
hint: * Use \"git add --sparse <paths>\" to update the index
47+
hint: * Use \"git sparse-checkout reapply\" to apply the sparsity rules
48+
hint: Disable this message with \"git config advice.updateSparsePath false\"
49+
EOF
3750
"
3851

3952
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' '
431444
test_cmp expect stderr &&
432445
433446
git mv --sparse sub/d folder1 2>stderr &&
447+
cat dirty_error_header >expect &&
448+
echo "folder1/d" >>expect &&
449+
cat dirty_hint >>expect &&
450+
test_cmp expect stderr &&
434451
435452
test_path_is_missing sub/d &&
436453
test_path_is_file folder1/d &&
@@ -478,6 +495,11 @@ test_expect_success 'move partially-dirty dir from in-cone to out-of-cone' '
478495
test_cmp expect stderr &&
479496
480497
git mv --sparse sub/dir folder1 2>stderr &&
498+
cat dirty_error_header >expect &&
499+
echo "folder1/dir/e2" >>expect &&
500+
echo "folder1/dir/e3" >>expect &&
501+
cat dirty_hint >>expect &&
502+
test_cmp expect stderr &&
481503
482504
test_path_is_missing sub/dir &&
483505
test_path_is_missing folder1/dir/e &&

0 commit comments

Comments
 (0)