Re: [PATCH v2 06/45] Add parse_pathspec() that converts cmdline args to struct pathspec

2013-03-22 Thread Junio C Hamano
Nguyễn Thái Ngọc Duy  pclo...@gmail.com writes:

 diff --git a/Documentation/technical/api-setup.txt 
 b/Documentation/technical/api-setup.txt
 index 4f63a04..59a947e 100644
 --- a/Documentation/technical/api-setup.txt
 +++ b/Documentation/technical/api-setup.txt
 @@ -8,6 +8,23 @@ Talk about
  * is_inside_git_dir()
  * is_inside_work_tree()
  * setup_work_tree()
 -* get_pathspec()
  
  (Dscho)
 +
 +Pathspec
 +

asciidoc: ERROR: api-setup.txt: line 15: only book doctypes can
contain level 0 sections

Just demoting this to  should be sufficient, I think.

 +
 +See glossary-context.txt for the syntax of pathspec. In memory, a
 +pathspec set is represented by struct pathspec and is prepared by
 +parse_pathspec(). This function takes several arguments:
 +
 +- magic_mask specifies what features that are NOT supported by the
 +  following code. If a user attempts to use such a feature,
 +  parse_pathspec() can reject it early.
 +
 +- flags specifies other things that the caller wants parse_pathspec to
 +  perform.
 +
 +- prefix and args come from cmd_* functions
 +
 +get_pathspec() is obsolete and should never be used in new code.
 diff --git a/dir.c b/dir.c
 index 97ad45b..a442467 100644
 --- a/dir.c
 +++ b/dir.c
 @@ -338,7 +338,7 @@ int match_pathspec_depth(const struct pathspec *ps,
  /*
   * Return the length of the simple part of a path match limiter.
   */
 -static int simple_length(const char *match)
 +int simple_length(const char *match)
  {
   int len = -1;
  
 @@ -350,7 +350,7 @@ static int simple_length(const char *match)
   }
  }
  
 -static int no_wildcard(const char *string)
 +int no_wildcard(const char *string)
  {
   return string[simple_length(string)] == '\0';
  }
 diff --git a/dir.h b/dir.h
 index c3eb4b5..89427fd 100644
 --- a/dir.h
 +++ b/dir.h
 @@ -125,6 +125,8 @@ struct dir_struct {
  #define MATCHED_RECURSIVELY 1
  #define MATCHED_FNMATCH 2
  #define MATCHED_EXACTLY 3
 +extern int simple_length(const char *match);
 +extern int no_wildcard(const char *string);
  extern char *common_prefix(const char **pathspec);
  extern int match_pathspec(const char **pathspec, const char *name, int 
 namelen, int prefix, char *seen);
  extern int match_pathspec_depth(const struct pathspec *pathspec,
 diff --git a/pathspec.c b/pathspec.c
 index ab53b8a..ebe9844 100644
 --- a/pathspec.c
 +++ b/pathspec.c
 @@ -103,10 +103,6 @@ void die_if_path_beyond_symlink(const char *path, const 
 char *prefix)
  /*
   * Magic pathspec
   *
 - * NEEDSWORK: These need to be moved to dir.h or even to a new
 - * pathspec.h when we restructure get_pathspec() users to use the
 - * struct pathspec interface.
 - *
   * Possible future magic semantics include stuff like:
   *
   *   { PATHSPEC_NOGLOB, '!', noglob },
 @@ -115,7 +111,6 @@ void die_if_path_beyond_symlink(const char *path, const 
 char *prefix)
   *   { PATHSPEC_REGEXP, '\0', regexp },
   *
   */
 -#define PATHSPEC_FROMTOP(10)
  
  static struct pathspec_magic {
   unsigned bit;
 @@ -127,7 +122,7 @@ static struct pathspec_magic {
  
  /*
   * Take an element of a pathspec and check for magic signatures.
 - * Append the result to the prefix.
 + * Append the result to the prefix. Return the magic bitmap.
   *
   * For now, we only parse the syntax and throw out anything other than
   * top magic.
 @@ -138,10 +133,15 @@ static struct pathspec_magic {
   * the prefix part must always match literally, and a single stupid
   * string cannot express such a case.
   */
 -static const char *prefix_pathspec(const char *prefix, int prefixlen, const 
 char *elt)
 +static unsigned prefix_pathspec(struct pathspec_item *item,
 + unsigned *p_short_magic,
 + const char **raw, unsigned flags,
 + const char *prefix, int prefixlen,
 + const char *elt)
  {
 - unsigned magic = 0;
 + unsigned magic = 0, short_magic = 0;
   const char *copyfrom = elt;
 + char *match;
   int i;
  
   if (elt[0] != ':') {
 @@ -183,7 +183,7 @@ static const char *prefix_pathspec(const char *prefix, 
 int prefixlen, const char
   break;
   for (i = 0; i  ARRAY_SIZE(pathspec_magic); i++)
   if (pathspec_magic[i].mnemonic == ch) {
 - magic |= pathspec_magic[i].bit;
 + short_magic |= pathspec_magic[i].bit;
   break;
   }
   if (ARRAY_SIZE(pathspec_magic) = i)
 @@ -194,15 +194,128 @@ static const char *prefix_pathspec(const char *prefix, 
 int prefixlen, const char
   copyfrom++;
   }
  
 + magic |= short_magic;
 + *p_short_magic = short_magic;
 +
   if (magic  PATHSPEC_FROMTOP)
 - return xstrdup(copyfrom);
 + match = xstrdup(copyfrom);
   else
 -  

Re: [PATCH v2 06/45] Add parse_pathspec() that converts cmdline args to struct pathspec

2013-03-20 Thread Eric Sunshine
On Wed, Mar 20, 2013 at 8:16 AM, Nguyễn Thái Ngọc Duy pclo...@gmail.com wrote:
 +static void NORETURN unsupported_magic(const char *pattern,
 +  unsigned magic,
 +  unsigned short_magic)
 +{
 +   struct strbuf sb = STRBUF_INIT;
 +   int i, n;
 +   for (n = i = 0; i  ARRAY_SIZE(pathspec_magic); i++) {
 +   const struct pathspec_magic *m = pathspec_magic + i;
 +   if (!(magic  m-bit))
 +   continue;
 +   if (sb.len)
 +   strbuf_addstr(sb,  );
 +   if (short_magic  m-bit)
 +   strbuf_addf(sb, '%c', m-mnemonic);
 +   else
 +   strbuf_addf(sb, '%s', m-name);
 +   n++;
 +   }
 +   /*
 +* We may want to substitue this command with a command

s/substitue/substitute/

 +* name. E.g. when add--interactive dies when running
 +* checkout -p
 +*/
 +   die(_(%s: pathspec magic not supported by this command: %s),
 +   pattern, sb.buf);
 +}
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html