From: Peter Collingbourne Date: Mon, 11 Jan 2010 02:59:54 +0000 (+0000) Subject: Remove empty directories when checking out a commit with fewer submodules X-Git-Tag: v1.7.0-rc0~84^2 X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=c5e558a80ad27774b9984258a31fbf46a1d7c152;p=git.git 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 Signed-off-by: Junio C Hamano --- diff --git a/t/t7400-submodule-basic.sh b/t/t7400-submodule-basic.sh index a0cc99ab9..1a4dc5f89 100755 --- a/t/t7400-submodule-basic.sh +++ b/t/t7400-submodule-basic.sh @@ -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 warns' ' git submodule no-such-submodule 2> output.err && diff --git a/unpack-trees.c b/unpack-trees.c index dd5999c35..b69847d6c 100644 --- a/unpack-trees.c +++ b/unpack-trees.c @@ -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)); }