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