aboutsummaryrefslogtreecommitdiff
path: root/builtin/rm.c
diff options
context:
space:
mode:
authorJens Lehmann <Jens.Lehmann@web.de>2012-11-22 23:32:26 +0100
committerJunio C Hamano <gitster@pobox.com>2012-11-23 18:35:15 -0800
commit53e4c5dcab33d2718476867b865da9679bd2c24a (patch)
treec1de0d72c32d656a2de096fa36e2ab1056897ca9 /builtin/rm.c
parent3469c7ebbf41fe5fc684583dc84973b95289a6a2 (diff)
downloadgit-53e4c5dcab33d2718476867b865da9679bd2c24a.tar.gz
git-53e4c5dcab33d2718476867b865da9679bd2c24a.tar.xz
Teach rm to remove submodules when given with a trailing '/'
Doing a "git rm submod/" on a submodule results in an error: fatal: pathspec 'submod/' did not match any files This is really inconvenient as e.g. using TAB completion in a shell on a submodule automatically adds the trailing '/' when it completes the path of the submodule directory. The user has then to remove the '/' herself to make a "git rm" succeed. Doing a "git rm -r somedir/" is working fine, so there is no reason why that shouldn't work for submodules too. Teach git rm to not error out when a '/' is appended to the path of a submodule. Achieve this by chopping off trailing slashes from the path names given if they represent directories. Add tests to make sure that logic only applies to directories and not to files. Signed-off-by: Jens Lehmann <Jens.Lehmann@web.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'builtin/rm.c')
-rw-r--r--builtin/rm.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/builtin/rm.c b/builtin/rm.c
index 4a881ab27..4e5e8abeb 100644
--- a/builtin/rm.c
+++ b/builtin/rm.c
@@ -234,6 +234,21 @@ int cmd_rm(int argc, const char **argv, const char *prefix)
if (read_cache() < 0)
die(_("index file corrupt"));
+ /*
+ * Drop trailing directory separators from directories so we'll find
+ * submodules in the index.
+ */
+ for (i = 0; i < argc; i++) {
+ size_t pathlen = strlen(argv[i]);
+ if (pathlen && is_dir_sep(argv[i][pathlen - 1]) &&
+ is_directory(argv[i])) {
+ do {
+ pathlen--;
+ } while (pathlen && is_dir_sep(argv[i][pathlen - 1]));
+ argv[i] = xmemdupz(argv[i], pathlen);
+ }
+ }
+
pathspec = get_pathspec(prefix, argv);
refresh_index(&the_index, REFRESH_QUIET, pathspec, NULL, NULL);