Re: [PATCH v5 07/11] ref-filter: add option to match literal pattern

2015-07-30 Thread Karthik Nayak
On Wed, Jul 29, 2015 at 3:19 AM, Eric Sunshine sunsh...@sunshineco.com wrote:
 On Mon, Jul 27, 2015 at 3:27 AM, Karthik Nayak karthik@gmail.com wrote:
 From: Karthik Nayak karthik@gmail.com

 Since 'ref-filter' only has an option to match path names add an
 option for plain fnmatch pattern-matching.

 This is to support the pattern matching options which are used in `git
 tag -l` and `git branch -l` where we can match patterns like `git tag
 -l foo*` which would match all tags which has a foo* pattern.

 Signed-off-by: Karthik Nayak karthik@gmail.com
 ---
 diff --git a/ref-filter.c b/ref-filter.c
 index 26eb26c..597b189 100644
 --- a/ref-filter.c
 +++ b/ref-filter.c
 @@ -946,6 +946,32 @@ static int commit_contains(struct ref_filter *filter, 
 struct commit *commit)

  /*
   * Return 1 if the refname matches one of the patterns, otherwise 0.
 + * A pattern can be a literal prefix (e.g. a refname refs/heads/master
 + * matches a pattern refs/heads/mas) or a wildcard (e.g. the same ref
 + * matches refs/heads/mas*, too).
 + */
 +static int match_pattern(const char **patterns, const char *refname)
 +{
 +   /*
 +* When no '--format' option is given we need to skip the prefix
 +* for matching refs of tags and branches.
 +*/
 +   if (skip_prefix(refname, refs/tags/, refname))
 +   ;
 +   else if (skip_prefix(refname, refs/heads/, refname))
 +   ;
 +   else if (skip_prefix(refname, refs/remotes/, refname))
 +   ;

 Or, more concisely:

 skip_prefix(refname, refs/tags/, refname) ||
 skip_prefix(refname, refs/heads/, refname) ||
 skip_prefix(refname, refs/remotes/, refname);


Gives a warning: value computed is not used [-Wunused-value]

so I typecasted the output as:

  (void)(skip_prefix(refname, refs/tags/, refname) ||
skip_prefix(refname, refs/heads/, refname) ||
skip_prefix(refname, refs/remotes/, refname));

Just wondering if that's alright.

-- 
Regards,
Karthik Nayak
--
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


Re: [PATCH v5 07/11] ref-filter: add option to match literal pattern

2015-07-29 Thread Karthik Nayak
On Wed, Jul 29, 2015 at 3:19 AM, Eric Sunshine sunsh...@sunshineco.com wrote:
 On Mon, Jul 27, 2015 at 3:27 AM, Karthik Nayak karthik@gmail.com wrote:
 From: Karthik Nayak karthik@gmail.com

 Since 'ref-filter' only has an option to match path names add an
 option for plain fnmatch pattern-matching.

 This is to support the pattern matching options which are used in `git
 tag -l` and `git branch -l` where we can match patterns like `git tag
 -l foo*` which would match all tags which has a foo* pattern.

 Signed-off-by: Karthik Nayak karthik@gmail.com
 ---
 diff --git a/ref-filter.c b/ref-filter.c
 index 26eb26c..597b189 100644
 --- a/ref-filter.c
 +++ b/ref-filter.c
 @@ -946,6 +946,32 @@ static int commit_contains(struct ref_filter *filter, 
 struct commit *commit)

  /*
   * Return 1 if the refname matches one of the patterns, otherwise 0.
 + * A pattern can be a literal prefix (e.g. a refname refs/heads/master
 + * matches a pattern refs/heads/mas) or a wildcard (e.g. the same ref
 + * matches refs/heads/mas*, too).
 + */
 +static int match_pattern(const char **patterns, const char *refname)
 +{
 +   /*
 +* When no '--format' option is given we need to skip the prefix
 +* for matching refs of tags and branches.
 +*/
 +   if (skip_prefix(refname, refs/tags/, refname))
 +   ;
 +   else if (skip_prefix(refname, refs/heads/, refname))
 +   ;
 +   else if (skip_prefix(refname, refs/remotes/, refname))
 +   ;

 Or, more concisely:

 skip_prefix(refname, refs/tags/, refname) ||
 skip_prefix(refname, refs/heads/, refname) ||
 skip_prefix(refname, refs/remotes/, refname);

 since || short-circuits. No need for the 'if' or cascading 'else if's.

 +   for (; *patterns; patterns++) {
 +   if (!wildmatch(*patterns, refname, 0, NULL))
 +   return 1;
 +   }
 +   return 0;
 +}

Looks better thanks :)

-- 
Regards,
Karthik Nayak
--
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


Re: [PATCH v5 07/11] ref-filter: add option to match literal pattern

2015-07-28 Thread Eric Sunshine
On Mon, Jul 27, 2015 at 3:27 AM, Karthik Nayak karthik@gmail.com wrote:
 From: Karthik Nayak karthik@gmail.com

 Since 'ref-filter' only has an option to match path names add an
 option for plain fnmatch pattern-matching.

 This is to support the pattern matching options which are used in `git
 tag -l` and `git branch -l` where we can match patterns like `git tag
 -l foo*` which would match all tags which has a foo* pattern.

 Signed-off-by: Karthik Nayak karthik@gmail.com
 ---
 diff --git a/ref-filter.c b/ref-filter.c
 index 26eb26c..597b189 100644
 --- a/ref-filter.c
 +++ b/ref-filter.c
 @@ -946,6 +946,32 @@ static int commit_contains(struct ref_filter *filter, 
 struct commit *commit)

  /*
   * Return 1 if the refname matches one of the patterns, otherwise 0.
 + * A pattern can be a literal prefix (e.g. a refname refs/heads/master
 + * matches a pattern refs/heads/mas) or a wildcard (e.g. the same ref
 + * matches refs/heads/mas*, too).
 + */
 +static int match_pattern(const char **patterns, const char *refname)
 +{
 +   /*
 +* When no '--format' option is given we need to skip the prefix
 +* for matching refs of tags and branches.
 +*/
 +   if (skip_prefix(refname, refs/tags/, refname))
 +   ;
 +   else if (skip_prefix(refname, refs/heads/, refname))
 +   ;
 +   else if (skip_prefix(refname, refs/remotes/, refname))
 +   ;

Or, more concisely:

skip_prefix(refname, refs/tags/, refname) ||
skip_prefix(refname, refs/heads/, refname) ||
skip_prefix(refname, refs/remotes/, refname);

since || short-circuits. No need for the 'if' or cascading 'else if's.

 +   for (; *patterns; patterns++) {
 +   if (!wildmatch(*patterns, refname, 0, NULL))
 +   return 1;
 +   }
 +   return 0;
 +}
--
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


Re: [PATCH v5 07/11] ref-filter: add option to match literal pattern

2015-07-27 Thread Matthieu Moy
Karthik Nayak karthik@gmail.com writes:

 --- a/ref-filter.c
 +++ b/ref-filter.c
 @@ -946,6 +946,32 @@ static int commit_contains(struct ref_filter *filter, 
 struct commit *commit)

 +/*
 + * Return 1 if the refname matches one of the patterns, otherwise 0.
   * A pattern can be path prefix (e.g. a refname refs/heads/master
   * matches a pattern refs/heads/) or a wildcard (e.g. the same ref
   * matches refs/heads/m*,too).

Nit: you used to s/,too/, too/ in the comment in a previous version.

I think I already suggested saying explicitly ... matches a pattern
refs/heads/ but not refs/heads/m), but I won't insist on that. Just
a reminder in case you missed it.

-- 
Matthieu Moy
http://www-verimag.imag.fr/~moy/
--
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


Re: [PATCH v5 07/11] ref-filter: add option to match literal pattern

2015-07-27 Thread Karthik Nayak
On Mon, Jul 27, 2015 at 9:27 PM, Karthik Nayak karthik@gmail.com wrote:
 On Mon, Jul 27, 2015 at 6:24 PM, Matthieu Moy
 matthieu@grenoble-inp.fr wrote:
 Karthik Nayak karthik@gmail.com writes:

 --- a/ref-filter.c
 +++ b/ref-filter.c
 @@ -946,6 +946,32 @@ static int commit_contains(struct ref_filter *filter, 
 struct commit *commit)

 +/*
 + * Return 1 if the refname matches one of the patterns, otherwise 0.
   * A pattern can be path prefix (e.g. a refname refs/heads/master
   * matches a pattern refs/heads/) or a wildcard (e.g. the same ref
   * matches refs/heads/m*,too).

 Nit: you used to s/,too/, too/ in the comment in a previous version.


 That's carried over from a previous patch, ill change it.

 I think I already suggested saying explicitly ... matches a pattern
 refs/heads/ but not refs/heads/m), but I won't insist on that. Just
 a reminder in case you missed it.


 Sorry, I missed that out. Thanks for reminding.


If I remember right, I didn't change that cause It didn't pertain to
this commit.
I forgot to mention it in your previous mail.

-- 
Regards,
Karthik Nayak
--
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


Re: [PATCH v5 07/11] ref-filter: add option to match literal pattern

2015-07-27 Thread Karthik Nayak
On Mon, Jul 27, 2015 at 6:24 PM, Matthieu Moy
matthieu@grenoble-inp.fr wrote:
 Karthik Nayak karthik@gmail.com writes:

 --- a/ref-filter.c
 +++ b/ref-filter.c
 @@ -946,6 +946,32 @@ static int commit_contains(struct ref_filter *filter, 
 struct commit *commit)

 +/*
 + * Return 1 if the refname matches one of the patterns, otherwise 0.
   * A pattern can be path prefix (e.g. a refname refs/heads/master
   * matches a pattern refs/heads/) or a wildcard (e.g. the same ref
   * matches refs/heads/m*,too).

 Nit: you used to s/,too/, too/ in the comment in a previous version.


That's carried over from a previous patch, ill change it.

 I think I already suggested saying explicitly ... matches a pattern
 refs/heads/ but not refs/heads/m), but I won't insist on that. Just
 a reminder in case you missed it.


Sorry, I missed that out. Thanks for reminding.

-- 
Regards,
Karthik Nayak
--
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


Re: [PATCH v5 07/11] ref-filter: add option to match literal pattern

2015-07-27 Thread Matthieu Moy
Karthik Nayak karthik@gmail.com writes:

 On Mon, Jul 27, 2015 at 9:27 PM, Karthik Nayak karthik@gmail.com wrote:
 On Mon, Jul 27, 2015 at 6:24 PM, Matthieu Moy
 matthieu@grenoble-inp.fr wrote:
 Karthik Nayak karthik@gmail.com writes:

 --- a/ref-filter.c
 +++ b/ref-filter.c
 @@ -946,6 +946,32 @@ static int commit_contains(struct ref_filter *filter, 
 struct commit *commit)

 +/*
 + * Return 1 if the refname matches one of the patterns, otherwise 0.
   * A pattern can be path prefix (e.g. a refname refs/heads/master
   * matches a pattern refs/heads/) or a wildcard (e.g. the same ref
   * matches refs/heads/m*,too).

 Nit: you used to s/,too/, too/ in the comment in a previous version.


 That's carried over from a previous patch, ill change it.

 I think I already suggested saying explicitly ... matches a pattern
 refs/heads/ but not refs/heads/m), but I won't insist on that. Just
 a reminder in case you missed it.


 Sorry, I missed that out. Thanks for reminding.


 If I remember right, I didn't change that cause It didn't pertain to
 this commit. I forgot to mention it in your previous mail.

The but not refs/heads/m part makes sense in this patch to document
explicitly the difference with the other function. But again, it's just
a suggestion, you chose whether to apply it or not.

-- 
Matthieu Moy
http://www-verimag.imag.fr/~moy/
--
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


Re: [PATCH v5 07/11] ref-filter: add option to match literal pattern

2015-07-27 Thread Karthik Nayak
On Mon, Jul 27, 2015 at 9:36 PM, Matthieu Moy
matthieu@grenoble-inp.fr wrote:
 Karthik Nayak karthik@gmail.com writes:

 On Mon, Jul 27, 2015 at 9:27 PM, Karthik Nayak karthik@gmail.com wrote:
 On Mon, Jul 27, 2015 at 6:24 PM, Matthieu Moy
 matthieu@grenoble-inp.fr wrote:
 Karthik Nayak karthik@gmail.com writes:

 --- a/ref-filter.c
 +++ b/ref-filter.c
 @@ -946,6 +946,32 @@ static int commit_contains(struct ref_filter 
 *filter, struct commit *commit)

 +/*
 + * Return 1 if the refname matches one of the patterns, otherwise 0.
   * A pattern can be path prefix (e.g. a refname refs/heads/master
   * matches a pattern refs/heads/) or a wildcard (e.g. the same ref
   * matches refs/heads/m*,too).

 Nit: you used to s/,too/, too/ in the comment in a previous version.


 That's carried over from a previous patch, ill change it.

 I think I already suggested saying explicitly ... matches a pattern
 refs/heads/ but not refs/heads/m), but I won't insist on that. Just
 a reminder in case you missed it.


 Sorry, I missed that out. Thanks for reminding.


 If I remember right, I didn't change that cause It didn't pertain to
 this commit. I forgot to mention it in your previous mail.

 The but not refs/heads/m part makes sense in this patch to document
 explicitly the difference with the other function. But again, it's just
 a suggestion, you chose whether to apply it or not.


I think it's a valid add-on, will include it :)

-- 
Regards,
Karthik Nayak
--
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


[PATCH v5 07/11] ref-filter: add option to match literal pattern

2015-07-27 Thread Karthik Nayak
From: Karthik Nayak karthik@gmail.com

Since 'ref-filter' only has an option to match path names add an
option for plain fnmatch pattern-matching.

This is to support the pattern matching options which are used in `git
tag -l` and `git branch -l` where we can match patterns like `git tag
-l foo*` which would match all tags which has a foo* pattern.

Mentored-by: Christian Couder christian.cou...@gmail.com
Mentored-by: Matthieu Moy matthieu@grenoble-inp.fr
Signed-off-by: Karthik Nayak karthik@gmail.com
---
 builtin/for-each-ref.c |  1 +
 ref-filter.c   | 38 +-
 ref-filter.h   |  3 ++-
 3 files changed, 40 insertions(+), 2 deletions(-)

diff --git a/builtin/for-each-ref.c b/builtin/for-each-ref.c
index e4a4f8a..3ad6a64 100644
--- a/builtin/for-each-ref.c
+++ b/builtin/for-each-ref.c
@@ -68,6 +68,7 @@ int cmd_for_each_ref(int argc, const char **argv, const char 
*prefix)
git_config(git_default_config, NULL);
 
filter.name_patterns = argv;
+   filter.match_as_path = 1;
filter_refs(array, filter, FILTER_REFS_ALL | 
FILTER_REFS_INCLUDE_BROKEN);
ref_array_sort(sorting, array);
 
diff --git a/ref-filter.c b/ref-filter.c
index 26eb26c..597b189 100644
--- a/ref-filter.c
+++ b/ref-filter.c
@@ -946,6 +946,32 @@ static int commit_contains(struct ref_filter *filter, 
struct commit *commit)
 
 /*
  * Return 1 if the refname matches one of the patterns, otherwise 0.
+ * A pattern can be a literal prefix (e.g. a refname refs/heads/master
+ * matches a pattern refs/heads/mas) or a wildcard (e.g. the same ref
+ * matches refs/heads/mas*, too).
+ */
+static int match_pattern(const char **patterns, const char *refname)
+{
+   /*
+* When no '--format' option is given we need to skip the prefix
+* for matching refs of tags and branches.
+*/
+   if (skip_prefix(refname, refs/tags/, refname))
+   ;
+   else if (skip_prefix(refname, refs/heads/, refname))
+   ;
+   else if (skip_prefix(refname, refs/remotes/, refname))
+   ;
+
+   for (; *patterns; patterns++) {
+   if (!wildmatch(*patterns, refname, 0, NULL))
+   return 1;
+   }
+   return 0;
+}
+
+/*
+ * Return 1 if the refname matches one of the patterns, otherwise 0.
  * A pattern can be path prefix (e.g. a refname refs/heads/master
  * matches a pattern refs/heads/) or a wildcard (e.g. the same ref
  * matches refs/heads/m*,too).
@@ -969,6 +995,16 @@ static int match_name_as_path(const char **pattern, const 
char *refname)
return 0;
 }
 
+/* Return 1 if the refname matches one of the patterns, otherwise 0. */
+static int filter_pattern_match(struct ref_filter *filter, const char *refname)
+{
+   if (!*filter-name_patterns)
+   return 1; /* No pattern always matches */
+   if (filter-match_as_path)
+   return match_name_as_path(filter-name_patterns, refname);
+   return match_pattern(filter-name_patterns, refname);
+}
+
 /*
  * Given a ref (sha1, refname), check if the ref belongs to the array
  * of sha1s. If the given ref is a tag, check if the given tag points
@@ -1037,7 +1073,7 @@ static int ref_filter_handler(const char *refname, const 
struct object_id *oid,
return 0;
}
 
-   if (*filter-name_patterns  
!match_name_as_path(filter-name_patterns, refname))
+   if (!filter_pattern_match(filter, refname))
return 0;
 
if (filter-points_at.nr  !match_points_at(filter-points_at, 
oid-hash, refname))
diff --git a/ref-filter.h b/ref-filter.h
index 5406721..a27745f 100644
--- a/ref-filter.h
+++ b/ref-filter.h
@@ -64,7 +64,8 @@ struct ref_filter {
} merge;
struct commit *merge_commit;
 
-   unsigned int with_commit_tag_algo : 1;
+   unsigned int with_commit_tag_algo : 1,
+   match_as_path : 1;
unsigned int lines;
 };
 
-- 
2.4.6

--
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