Re: [PATCH v3 3/9] ref-filter: support printing N lines from tag annotation
On Mon, Jul 20, 2015 at 5:32 AM, Eric Sunshine sunsh...@sunshineco.com wrote: On Sat, Jul 18, 2015 at 3:12 PM, Karthik Nayak karthik@gmail.com wrote: In 'tag.c' we can print N lines from the annotation of the tag using the '-nnum' option. Copy code from 'tag.c' to 'ref-filter' and modify 'ref-filter' to support printing of N lines from the annotation of tags. Signed-off-by: Karthik Nayak karthik@gmail.com --- diff --git a/ref-filter.c b/ref-filter.c index 771c48d..82731ac 100644 --- a/ref-filter.c +++ b/ref-filter.c @@ -1288,7 +1288,48 @@ static void assign_formating(struct ref_array_item *ref, int parsed_atom, struct } } -void show_ref_array_item(struct ref_array_item *info, const char *format, int quote_style) +/* Print 'lines' no of lines of a given oid */ This is difficult to read and understand. I presume you meant no. as shorthand for number but dropped the period. Even with the period, it's still hard to read. Perhaps rewrite it as: If 'lines' is greater than 0, print that may lines of... or something. Ah okay :) Will change it to a better explanation. diff --git a/ref-filter.h b/ref-filter.h index c18781b..7dfdea0 100644 --- a/ref-filter.h +++ b/ref-filter.h @@ -87,8 +88,11 @@ int parse_ref_filter_atom(const char *atom, const char *ep); int verify_ref_format(const char *format); /* Sort the given ref_array as per the ref_sorting provided */ void ref_array_sort(struct ref_sorting *sort, struct ref_array *array); -/* Print the ref using the given format and quote_style */ -void show_ref_array_item(struct ref_array_item *info, const char *format, int quote_style); +/* + * Print the ref using the given format and quote_style. If lines 0, + * prints the lines no of lines of the objected pointed to. + */ Same problem. This literal no is quite confusing. Perhaps rewrite as above: If lines 0, print that many lines of... Will change this too. +void show_ref_array_item(struct ref_array_item *info, const char *format, int quote_style, unsigned int lines); ref-filter.h seems to be setting a precedent for overlong lines. Wrapping this manually could improve readability. Definitely! Thanks for all the suggestions. -- 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 v3 3/9] ref-filter: support printing N lines from tag annotation
On Sat, Jul 18, 2015 at 3:12 PM, Karthik Nayak karthik@gmail.com wrote: In 'tag.c' we can print N lines from the annotation of the tag using the '-nnum' option. Copy code from 'tag.c' to 'ref-filter' and modify 'ref-filter' to support printing of N lines from the annotation of tags. Signed-off-by: Karthik Nayak karthik@gmail.com --- diff --git a/ref-filter.c b/ref-filter.c index 771c48d..82731ac 100644 --- a/ref-filter.c +++ b/ref-filter.c @@ -1288,7 +1288,48 @@ static void assign_formating(struct ref_array_item *ref, int parsed_atom, struct } } -void show_ref_array_item(struct ref_array_item *info, const char *format, int quote_style) +/* Print 'lines' no of lines of a given oid */ This is difficult to read and understand. I presume you meant no. as shorthand for number but dropped the period. Even with the period, it's still hard to read. Perhaps rewrite it as: If 'lines' is greater than 0, print that may lines of... or something. diff --git a/ref-filter.h b/ref-filter.h index c18781b..7dfdea0 100644 --- a/ref-filter.h +++ b/ref-filter.h @@ -87,8 +88,11 @@ int parse_ref_filter_atom(const char *atom, const char *ep); int verify_ref_format(const char *format); /* Sort the given ref_array as per the ref_sorting provided */ void ref_array_sort(struct ref_sorting *sort, struct ref_array *array); -/* Print the ref using the given format and quote_style */ -void show_ref_array_item(struct ref_array_item *info, const char *format, int quote_style); +/* + * Print the ref using the given format and quote_style. If lines 0, + * prints the lines no of lines of the objected pointed to. + */ Same problem. This literal no is quite confusing. Perhaps rewrite as above: If lines 0, print that many lines of... +void show_ref_array_item(struct ref_array_item *info, const char *format, int quote_style, unsigned int lines); ref-filter.h seems to be setting a precedent for overlong lines. Wrapping this manually could improve readability. /* Callback function for parsing the sort option */ int parse_opt_ref_sorting(const struct option *opt, const char *arg, int unset); /* Default sort option based on refname */ -- 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
[PATCH v3 3/9] ref-filter: support printing N lines from tag annotation
From: Karthik Nayak karthik@gmail.com In 'tag.c' we can print N lines from the annotation of the tag using the '-nnum' option. Copy code from 'tag.c' to 'ref-filter' and modify 'ref-filter' to support printing of N lines from the annotation of tags. 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 | 2 +- builtin/tag.c | 4 ref-filter.c | 48 +++- ref-filter.h | 8 ++-- 4 files changed, 58 insertions(+), 4 deletions(-) diff --git a/builtin/for-each-ref.c b/builtin/for-each-ref.c index 40f343b..e4a4f8a 100644 --- a/builtin/for-each-ref.c +++ b/builtin/for-each-ref.c @@ -74,7 +74,7 @@ int cmd_for_each_ref(int argc, const char **argv, const char *prefix) if (!maxcount || array.nr maxcount) maxcount = array.nr; for (i = 0; i maxcount; i++) - show_ref_array_item(array.items[i], format, quote_style); + show_ref_array_item(array.items[i], format, quote_style, 0); ref_array_clear(array); return 0; } diff --git a/builtin/tag.c b/builtin/tag.c index 071d001..10b11ce 100644 --- a/builtin/tag.c +++ b/builtin/tag.c @@ -185,6 +185,10 @@ static enum contains_result contains(struct commit *candidate, return contains_test(candidate, want); } +/* + * Currently duplicated in ref-filter, will eventually be removed as + * we port tag.c to use ref-filter APIs. + */ static void show_tag_lines(const struct object_id *oid, int lines) { int i; diff --git a/ref-filter.c b/ref-filter.c index 771c48d..82731ac 100644 --- a/ref-filter.c +++ b/ref-filter.c @@ -1288,7 +1288,48 @@ static void assign_formating(struct ref_array_item *ref, int parsed_atom, struct } } -void show_ref_array_item(struct ref_array_item *info, const char *format, int quote_style) +/* Print 'lines' no of lines of a given oid */ +static void show_tag_lines(const struct object_id *oid, int lines) +{ + int i; + unsigned long size; + enum object_type type; + char *buf, *sp, *eol; + size_t len; + + buf = read_sha1_file(oid-hash, type, size); + if (!buf) + die_errno(unable to read object %s, oid_to_hex(oid)); + if (type != OBJ_COMMIT type != OBJ_TAG) + goto free_return; + if (!size) + die(an empty %s object %s?, + typename(type), oid_to_hex(oid)); + + /* skip header */ + sp = strstr(buf, \n\n); + if (!sp) + goto free_return; + + /* only take up to lines lines, and strip the signature from a tag */ + if (type == OBJ_TAG) + size = parse_signature(buf, size); + for (i = 0, sp += 2; i lines sp buf + size; i++) { + if (i) + printf(\n); + eol = memchr(sp, '\n', size - (sp - buf)); + len = eol ? eol - sp : size - (sp - buf); + fwrite(sp, len, 1, stdout); + if (!eol) + break; + sp = eol + 1; + } +free_return: + free(buf); +} + +void show_ref_array_item(struct ref_array_item *info, const char *format, +int quote_style, unsigned int lines) { const char *cp, *sp, *ep; @@ -1317,6 +1358,11 @@ void show_ref_array_item(struct ref_array_item *info, const char *format, int qu resetv.s = color; print_value(resetv, quote_style); } + if (lines 0) { + struct object_id oid; + hashcpy(oid.hash, info-objectname); + show_tag_lines(oid, lines); + } putchar('\n'); } diff --git a/ref-filter.h b/ref-filter.h index c18781b..7dfdea0 100644 --- a/ref-filter.h +++ b/ref-filter.h @@ -56,6 +56,7 @@ struct ref_filter { struct commit *merge_commit; unsigned int with_commit_tag_algo : 1; + unsigned int lines; }; struct ref_filter_cbdata { @@ -87,8 +88,11 @@ int parse_ref_filter_atom(const char *atom, const char *ep); int verify_ref_format(const char *format); /* Sort the given ref_array as per the ref_sorting provided */ void ref_array_sort(struct ref_sorting *sort, struct ref_array *array); -/* Print the ref using the given format and quote_style */ -void show_ref_array_item(struct ref_array_item *info, const char *format, int quote_style); +/* + * Print the ref using the given format and quote_style. If lines 0, + * prints the lines no of lines of the objected pointed to. + */ +void show_ref_array_item(struct ref_array_item *info, const char *format, int quote_style, unsigned int lines); /* Callback function for parsing the sort option */ int parse_opt_ref_sorting(const struct option *opt, const char *arg, int unset); /* Default sort option based on refname */ --