parse_pathspec: add PATHSPEC_PREFER_{CWD,FULL} flags
authorNguyễn Thái Ngọc Duy <pclouds@gmail.com>
Sun, 14 Jul 2013 08:35:30 +0000 (15:35 +0700)
committerJunio C Hamano <gitster@pobox.com>
Mon, 15 Jul 2013 17:56:06 +0000 (10:56 -0700)
We have two ways of dealing with empty pathspec:

1. limit it to current prefix
2. match the entire working directory

Some commands go with #1, some #2. get_pathspec() and parse_pathspec()
only support #1. Make parse_pathspec() reject empty pathspec by
default. #1 and #2 can be specified via new flags. This makes it more
expressive about default behavior at command level.

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
pathspec.c
pathspec.h
index f94beb6075ccc1de55c419d2b6182031fa625ff5..6d99a3dcedbf7bec234094da37f1212cbd2fe368 100644 (file)
@@ -271,10 +271,20 @@ void parse_pathspec(struct pathspec *pathspec,
        if (!entry && !prefix)
                return;
 
+       if ((flags & PATHSPEC_PREFER_CWD) &&
+           (flags & PATHSPEC_PREFER_FULL))
+               die("BUG: PATHSPEC_PREFER_CWD and PATHSPEC_PREFER_FULL are incompatible");
+
        /* No arguments with prefix -> prefix pathspec */
        if (!entry) {
                static const char *raw[2];
 
+               if (flags & PATHSPEC_PREFER_FULL)
+                       return;
+
+               if (!(flags & PATHSPEC_PREFER_CWD))
+                       die("BUG: PATHSPEC_PREFER_CWD requires arguments");
+
                pathspec->items = item = xmalloc(sizeof(*item));
                memset(item, 0, sizeof(*item));
                item->match = prefix;
@@ -340,7 +350,8 @@ const char **get_pathspec(const char *prefix, const char **pathspec)
        struct pathspec ps;
        parse_pathspec(&ps,
                       PATHSPEC_ALL_MAGIC & ~PATHSPEC_FROMTOP,
-                      0, prefix, pathspec);
+                      PATHSPEC_PREFER_CWD,
+                      prefix, pathspec);
        return ps.raw;
 }
 
index cc5841b77f8ca96510341f7763d19b932a85924e..d630e8b1f9eb24824f8876965358253fe00e3232 100644 (file)
@@ -24,6 +24,10 @@ struct pathspec {
        } *items;
 };
 
+/* parse_pathspec flags */
+#define PATHSPEC_PREFER_CWD (1<<0) /* No args means match cwd */
+#define PATHSPEC_PREFER_FULL (1<<1) /* No args means match everything */
+
 extern int init_pathspec(struct pathspec *, const char **);
 extern void parse_pathspec(struct pathspec *pathspec,
                           unsigned magic_mask,