Browse Source

Remove empty directories when checking out a commit with fewer submodules

Change the unlink_entry function to use rmdir to remove submodule
directories.  Currently we try to use unlink, which will never succeed.

Of course rmdir will only succeed for empty (i.e. not checked out)
submodule directories.  Behaviour if a submodule is checked out stays
essentially the same: print a warning message and keep the submodule
directory.

Signed-off-by: Peter Collingbourne <peter@pcc.me.uk>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Peter Collingbourne 15 years ago committed by Junio C Hamano
parent
commit
c5e558a80a
  1. 9
      t/t7400-submodule-basic.sh
  2. 12
      unpack-trees.c

9
t/t7400-submodule-basic.sh

@ -299,6 +299,15 @@ test_expect_success 'ls-files gracefully handles trailing slash' ' @@ -299,6 +299,15 @@ test_expect_success 'ls-files gracefully handles trailing slash' '

'

test_expect_success 'moving to a commit without submodule does not leave empty dir' '
rm -rf init &&
mkdir init &&
git reset --hard &&
git checkout initial &&
test ! -d init &&
git checkout second
'

test_expect_success 'submodule <invalid-path> warns' '

git submodule no-such-submodule 2> output.err &&

12
unpack-trees.c

@ -61,8 +61,16 @@ static void unlink_entry(struct cache_entry *ce) @@ -61,8 +61,16 @@ static void unlink_entry(struct cache_entry *ce)
{
if (has_symlink_or_noent_leading_path(ce->name, ce_namelen(ce)))
return;
if (unlink_or_warn(ce->name))
return;
if (S_ISGITLINK(ce->ce_mode)) {
if (rmdir(ce->name)) {
warning("unable to rmdir %s: %s",
ce->name, strerror(errno));
return;
}
}
else
if (unlink_or_warn(ce->name))
return;
schedule_dir_for_removal(ce->name, ce_namelen(ce));
}


Loading…
Cancel
Save