Re: [PATCH 2/2] rm: re-use parse_pathspec's trailing-slash removal
From: John Keeping <hidden>
Date: 2016-06-15 22:58:43
On Wed, Sep 11, 2013 at 02:48:51PM +0700, Duy Nguyen wrote:
On Wed, Sep 11, 2013 at 2:13 AM, John Keeping [off-list ref] wrote:quoted
Instead of re-implementing the "remove trailing slashes" loop in builtin/rm.c just pass PATHSPEC_STRIP_SUBMODULE_SLASH_CHEAP to parse_pathspec. Signed-off-by: John Keeping <redacted> --- builtin/rm.c | 20 ++++---------------- 1 file changed, 4 insertions(+), 16 deletions(-)diff --git a/builtin/rm.c b/builtin/rm.c index 9b59ab3..3a0e0ea 100644 --- a/builtin/rm.c +++ b/builtin/rm.c@@ -298,22 +298,10 @@ 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); - } - } - - parse_pathspec(&pathspec, 0, PATHSPEC_PREFER_CWD, prefix, argv); + parse_pathspec(&pathspec, 0, + PATHSPEC_PREFER_CWD | + PATHSPEC_STRIP_SUBMODULE_SLASH_CHEAP,I notice that _CHEAP implementation and the removed code are not exactly the same. But I think they have the same purpose so it's probably ok even there are some subtle behavioral changes.
Providing that there's only one trailing slash, the user-visible effect should be the same since the only case affected by that is submodules. In fact _CHEAP does better in the case where the submodule does not exist in the working tree.
You may want to improve _CHEAP to remove consecutive trailing slashes (i.e. foo//// -> foo) too. And maybe is is_dir_sep() instead of explicit == '/' comparison in there.
Sounds good, I'll try to look at that tonight.
quoted
+ prefix, argv); refresh_index(&the_index, REFRESH_QUIET, &pathspec, NULL, NULL); seen = xcalloc(pathspec.nr, 1);