This patch series make cat-file reuse ref-filter logic, which based on 5a5b5f78 ([GSOC] ref-filter: add %(rest) atom) Change from last version: 1. Use free_array_item_internal() to solve the memory leak problem. 2. Change commit message of ([GSOC] ref-filter: teach get_object() return useful value). ZheNing Hu (9): [GSOC] ref-filter: add obj-type check in grab contents [GSOC] ref-filter: add %(raw) atom [GSOC] ref-filter: use non-const ref_format in *_atom_parser() [GSOC] ref-filter: add %(rest) atom [GSOC] ref-filter: teach get_object() return useful value [GSOC] ref-filter: introduce free_array_item_internal() function [GSOC] cat-file: reuse ref-filter logic [GSOC] cat-file: reuse err buf in batch_objet_write() [GSOC] cat-file: re-implement --textconv, --filters options Documentation/git-cat-file.txt | 6 + Documentation/git-for-each-ref.txt | 9 + builtin/cat-file.c | 267 ++++++----------------- builtin/tag.c | 2 +- ref-filter.c | 331 ++++++++++++++++++++++------- ref-filter.h | 14 +- t/t1006-cat-file.sh | 252 ++++++++++++++++++++++ t/t3203-branch-output.sh | 4 + t/t6300-for-each-ref.sh | 211 ++++++++++++++++++ t/t6301-for-each-ref-errors.sh | 2 +- t/t7004-tag.sh | 4 + t/t7030-verify-tag.sh | 4 + 12 files changed, 829 insertions(+), 277 deletions(-) base-commit: 1197f1a46360d3ae96bd9c15908a3a6f8e562207 Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-980%2Fadlternative%2Fcat-file-batch-refactor-v2 Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-980/adlternative/cat-file-batch-refactor-v2 Pull-Request: https://github.com/gitgitgadget/git/pull/980 Range-diff vs v1: 1: 48d256db5c34 = 1: 48d256db5c34 [GSOC] ref-filter: add obj-type check in grab contents 2: abee6a03becb = 2: abee6a03becb [GSOC] ref-filter: add %(raw) atom 3: c99d1d070a18 = 3: c99d1d070a18 [GSOC] ref-filter: use non-const ref_format in *_atom_parser() 4: 5a5b5f78aeea = 4: 5a5b5f78aeea [GSOC] ref-filter: add %(rest) atom 5: c208b8a45d66 ! 5: 49063372e003 [GSOC] ref-filter: teach get_object() return useful value @@ Commit message [GSOC] ref-filter: teach get_object() return useful value Let `populate_value()`, `get_ref_atom_value()` and - `format_ref_array_item()` get the return value of `get_value()` + `format_ref_array_item()` get the return value of `get_object()` correctly. This can help us later let `cat-file --batch` get the - correct error message and return value of `get_value()`. + correct error message and return value of `get_object()`. Mentored-by: Christian Couder <christian.couder@xxxxxxxxx> Mentored-by: Hariom Verma <hariom18599@xxxxxxxxx> -: ------------ > 6: d2f2563eb76a [GSOC] ref-filter: introduce free_array_item_internal() function 6: 44ebf75e2e93 ! 7: 765337a46ab0 [GSOC] cat-file: reuse ref-filter logic @@ builtin/cat-file.c: static void batch_write(struct batch_options *opt, const voi + if (!ret) { + strbuf_addch(scratch, '\n'); + batch_write(opt, scratch->buf, scratch->len); -+ strbuf_release(&err); + } else if (ret < 0) { + die("%s\n", err.buf); -+ strbuf_release(&err); + } else { + /* when ret > 0 , don't call die and print the err to stdout*/ + printf("%s\n", err.buf); + fflush(stdout); -+ strbuf_release(&err); } ++ free_array_item_internal(&item); ++ strbuf_release(&err); } + static void batch_one_object(const char *obj_name, @@ builtin/cat-file.c: static void batch_one_object(const char *obj_name, return; } @@ builtin/cat-file.c: static int batch_objects(struct batch_options *opt) return 0; } @@ builtin/cat-file.c: static int batch_objects(struct batch_options *opt) - batch_one_object(input.buf, &output, opt, &data); } -- + + strbuf_release(&format); strbuf_release(&input); strbuf_release(&output); 7: d31059c391d0 ! 8: 058b304686fd [GSOC] cat-file: reuse err buf in batch_objet_write() @@ builtin/cat-file.c: static void batch_write(struct batch_options *opt, const voi if (!ret) { strbuf_addch(scratch, '\n'); batch_write(opt, scratch->buf, scratch->len); -- strbuf_release(&err); } else if (ret < 0) { - die("%s\n", err.buf); -- strbuf_release(&err); + die("%s\n", err->buf); } else { /* when ret > 0 , don't call die and print the err to stdout*/ - printf("%s\n", err.buf); + printf("%s\n", err->buf); fflush(stdout); -- strbuf_release(&err); } + free_array_item_internal(&item); +- strbuf_release(&err); } static void batch_one_object(const char *obj_name, @@ builtin/cat-file.c: static int batch_objects(struct batch_options *opt, const st - batch_one_object(input.buf, &output, opt, &data); + batch_one_object(input.buf, &output, &err, opt, &data); } + strbuf_release(&format); strbuf_release(&input); strbuf_release(&output); 8: 0004d5b24a0f ! 9: cbf7d51933ea [GSOC] cat-file: re-implement --textconv, --filters options @@ ref-filter.h: struct ref_format { + int use_filters; int use_rest; int use_color; -- - /* Internal state to ref-filter */ + +@@ ref-filter.h: struct ref_format { int need_color_reset_at_eol; }; -- gitgitgadget