Re: [RFC/PATCH 5/9] ref-filter: add option to match literal pattern

2015-06-30 Thread Karthik Nayak
On Mon, Jun 29, 2015 at 11:50 PM, Junio C Hamano gits...@pobox.com wrote:
 Karthik Nayak karthik@gmail.com writes:

 Since 'ref-filter' only has an option to match path names.

 That is not a whole sentence ;-)


Argh! Noted.

 Add an option for regular pattern matching.

 Mentored-by: Christian Couder christian.cou...@gmail.com
 Mentored-by: Matthieu Moy matthieu@grenoble-inp.fr
 Signed-off-by: Karthik Nayak karthik@gmail.com

 - if (flag  REF_BAD_NAME) {
 -   warning(ignoring ref with broken name %s, refname);
 -   return 0;
 - }
 -

 Hmm, where did this check go in the new code?  Or is it now OK not
 to warn or ignore, and if so why?


Merge conflict, I've replied with a fixing patch, shouldn't be there
in the next version :)

   if (flag  REF_ISBROKEN) {
   warning(ignoring broken ref %s, refname);
   return 0;
   }

 - if (*filter-name_patterns  
 !match_name_as_path(filter-name_patterns, refname))
 + if (!filter_pattern_match(filter, refname))
   return 0;

   if (!match_points_at(filter-points_at, oid-hash, refname))

 diff --git a/ref-filter.h b/ref-filter.h
 index 6b6fb96..a4809c8 100644
 --- a/ref-filter.h
 +++ b/ref-filter.h
 @@ -54,7 +54,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;

 Lose SP on both sides of the colon, or have SP on both sides
 (same for the last patch in the previous series).

Will Do!

Thanks for the quick review.

-- 
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: [RFC/PATCH 5/9] ref-filter: add option to match literal pattern

2015-06-29 Thread Junio C Hamano
Karthik Nayak karthik@gmail.com writes:

 Since 'ref-filter' only has an option to match path names.

That is not a whole sentence ;-)

 Add an option for regular pattern matching.

 Mentored-by: Christian Couder christian.cou...@gmail.com
 Mentored-by: Matthieu Moy matthieu@grenoble-inp.fr
 Signed-off-by: Karthik Nayak karthik@gmail.com

 - if (flag  REF_BAD_NAME) {
 -   warning(ignoring ref with broken name %s, refname);
 -   return 0;
 - }
 -

Hmm, where did this check go in the new code?  Or is it now OK not
to warn or ignore, and if so why?

   if (flag  REF_ISBROKEN) {
   warning(ignoring broken ref %s, refname);
   return 0;
   }
  
 - if (*filter-name_patterns  
 !match_name_as_path(filter-name_patterns, refname))
 + if (!filter_pattern_match(filter, refname))
   return 0;
  
   if (!match_points_at(filter-points_at, oid-hash, refname))

 diff --git a/ref-filter.h b/ref-filter.h
 index 6b6fb96..a4809c8 100644
 --- a/ref-filter.h
 +++ b/ref-filter.h
 @@ -54,7 +54,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;

Lose SP on both sides of the colon, or have SP on both sides
(same for the last patch in the previous series).
--
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: [RFC/PATCH 5/9] ref-filter: add option to match literal pattern

2015-06-26 Thread Karthik Nayak

Just a few things I need to fix, personal note.

On 06/25/2015 05:13 PM, Karthik Nayak wrote:

Since 'ref-filter' only has an option to match path names.
Add an option for regular pattern matching.

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   | 30 --
  ref-filter.h   |  3 ++-
  3 files changed, 27 insertions(+), 7 deletions(-)

diff --git a/builtin/for-each-ref.c b/builtin/for-each-ref.c
index c318e33..01d5363 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 e307fab..1f97910 100644
--- a/ref-filter.c
+++ b/ref-filter.c
@@ -954,6 +954,20 @@ 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/m) or a wildcard (e.g. the same ref
+ * matches refs/heads/m*,too).
+ */
+static int match_pattern(const char **patterns, const char *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).
@@ -977,6 +991,15 @@ static int match_name_as_path(const char **pattern, const 
char *refname)
return 0;
  }

+static int filter_pattern_match(struct ref_filter *filter, const char *refname)
+{
+   if (!*filter-name_patterns)
+   return 0;


Should return 1.


+   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) see if it points to one of the sha1s
   * in a sha1_array.
@@ -1026,17 +1049,12 @@ static int ref_filter_handler(const char *refname, 
const struct object_id *oid,
struct ref_array_item *ref;
struct commit *commit = NULL;

-   if (flag  REF_BAD_NAME) {
- warning(ignoring ref with broken name %s, refname);
- return 0;
-   }
-


Undo this merge conflict.


if (flag  REF_ISBROKEN) {
warning(ignoring broken ref %s, refname);
return 0;
}

-   if (*filter-name_patterns  
!match_name_as_path(filter-name_patterns, refname))
+   if (!filter_pattern_match(filter, refname))
return 0;

if (!match_points_at(filter-points_at, oid-hash, refname))
diff --git a/ref-filter.h b/ref-filter.h
index 6b6fb96..a4809c8 100644
--- a/ref-filter.h
+++ b/ref-filter.h
@@ -54,7 +54,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;
  };




I'll add these changes to my local branch.

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


[RFC/PATCH 5/9] ref-filter: add option to match literal pattern

2015-06-25 Thread Karthik Nayak
Since 'ref-filter' only has an option to match path names.
Add an option for regular pattern matching.

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   | 30 --
 ref-filter.h   |  3 ++-
 3 files changed, 27 insertions(+), 7 deletions(-)

diff --git a/builtin/for-each-ref.c b/builtin/for-each-ref.c
index c318e33..01d5363 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 e307fab..1f97910 100644
--- a/ref-filter.c
+++ b/ref-filter.c
@@ -954,6 +954,20 @@ 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/m) or a wildcard (e.g. the same ref
+ * matches refs/heads/m*,too).
+ */
+static int match_pattern(const char **patterns, const char *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).
@@ -977,6 +991,15 @@ static int match_name_as_path(const char **pattern, const 
char *refname)
return 0;
 }
 
+static int filter_pattern_match(struct ref_filter *filter, const char *refname)
+{
+   if (!*filter-name_patterns)
+   return 0;
+   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) see if it points to one of the sha1s
  * in a sha1_array.
@@ -1026,17 +1049,12 @@ static int ref_filter_handler(const char *refname, 
const struct object_id *oid,
struct ref_array_item *ref;
struct commit *commit = NULL;
 
-   if (flag  REF_BAD_NAME) {
- warning(ignoring ref with broken name %s, refname);
- return 0;
-   }
-
if (flag  REF_ISBROKEN) {
warning(ignoring broken ref %s, refname);
return 0;
}
 
-   if (*filter-name_patterns  
!match_name_as_path(filter-name_patterns, refname))
+   if (!filter_pattern_match(filter, refname))
return 0;
 
if (!match_points_at(filter-points_at, oid-hash, refname))
diff --git a/ref-filter.h b/ref-filter.h
index 6b6fb96..a4809c8 100644
--- a/ref-filter.h
+++ b/ref-filter.h
@@ -54,7 +54,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.4

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