From: "ZheNing Hu via GitGitGadget" <gitgitgadget@gmail.com>
To: git@vger.kernel.org
Cc: Junio C Hamano <gitster@pobox.com>,
Christian Couder <christian.couder@gmail.com>,
Hariom Verma <hariom18599@gmail.com>,
ZheNing Hu <adlternative@gmail.com>,
ZheNing Hu <adlternative@gmail.com>
Subject: [PATCH] [GSOC] ref-filter: add contents:raw atom
Date: Thu, 20 May 2021 08:49:52 +0000 [thread overview]
Message-ID: <pull.958.git.1621500593126.gitgitgadget@gmail.com> (raw)
From: ZheNing Hu <adlternative@gmail.com>
Add new formatting option %(contents:raw), which will
print all the object contents without any changes.
It will help further to migrate all cat-file formatting
logic from cat-file to ref-filter.
Signed-off-by: ZheNing Hu <adlternative@gmail.com>
---
[GSOC] ref-filter: add contents:raw atom
Learn from Olga's %(raw):
https://github.com/git/git/pull/568/commits/bf22dae7ca387dbc92c5586c92e60cd395099399
We can add a %(contents:raw) atom to ref-filter, which can output object
contents without any change.
%(contents:raw) can work on the refs which point to blob,tree,commit,tag
objects.
It also support %(*contents:raw) to dereference.
With %(cotent:raw), we can later provide support for printing the
content of the "raw" object for cat-file --batch.
Why not just use Olga's %(raw)? Because %(contents) can output object
contents already, we can reuse it, instead of using another atom %(raw).
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-958%2Fadlternative%2Fref-filter-raw-v1
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-958/adlternative/ref-filter-raw-v1
Pull-Request: https://github.com/gitgitgadget/git/pull/958
ref-filter.c | 27 +++++++++++++++++++++------
t/t6300-for-each-ref.sh | 31 +++++++++++++++++++++++++++++++
2 files changed, 52 insertions(+), 6 deletions(-)
diff --git a/ref-filter.c b/ref-filter.c
index e2eac50d9508..fc384a194c0c 100644
--- a/ref-filter.c
+++ b/ref-filter.c
@@ -133,7 +133,7 @@ static struct used_atom {
unsigned int nobracket : 1, push : 1, push_remote : 1;
} remote_ref;
struct {
- enum { C_BARE, C_BODY, C_BODY_DEP, C_LENGTH, C_LINES,
+ enum { C_RAW, C_BARE, C_BODY, C_BODY_DEP, C_LENGTH, C_LINES,
C_SIG, C_SUB, C_SUB_SANITIZE, C_TRAILERS } option;
struct process_trailer_options trailer_opts;
unsigned int nlines;
@@ -347,6 +347,8 @@ static int contents_atom_parser(const struct ref_format *format, struct used_ato
{
if (!arg)
atom->u.contents.option = C_BARE;
+ else if (!strcmp(arg, "raw"))
+ atom->u.contents.option = C_RAW;
else if (!strcmp(arg, "body"))
atom->u.contents.option = C_BODY;
else if (!strcmp(arg, "size"))
@@ -1292,7 +1294,8 @@ static void append_lines(struct strbuf *out, const char *buf, unsigned long size
}
/* See grab_values */
-static void grab_sub_body_contents(struct atom_value *val, int deref, void *buf)
+static void grab_sub_body_contents(struct atom_value *val, int deref, void *buf,
+ unsigned long buf_size, enum object_type object_type)
{
int i;
const char *subpos = NULL, *bodypos = NULL, *sigpos = NULL;
@@ -1312,6 +1315,13 @@ static void grab_sub_body_contents(struct atom_value *val, int deref, void *buf)
!starts_with(name, "trailers") &&
!starts_with(name, "contents"))
continue;
+ if (atom->u.contents.option == C_RAW) {
+ v->s = xmemdupz(buf, buf_size);
+ continue;
+ }
+ if (object_type != OBJ_TAG && object_type != OBJ_COMMIT)
+ continue;
+
if (!subpos)
find_subpos(buf,
&subpos, &sublen,
@@ -1374,25 +1384,30 @@ static void fill_missing_values(struct atom_value *val)
* pointed at by the ref itself; otherwise it is the object the
* ref (which is a tag) refers to.
*/
-static void grab_values(struct atom_value *val, int deref, struct object *obj, void *buf)
+static void grab_values(struct atom_value *val, int deref, struct object *obj, struct expand_data *data)
{
+ void *buf = data->content;
+ unsigned long buf_size = data->size;
+
switch (obj->type) {
case OBJ_TAG:
grab_tag_values(val, deref, obj);
- grab_sub_body_contents(val, deref, buf);
+ grab_sub_body_contents(val, deref, buf, buf_size, obj->type);
grab_person("tagger", val, deref, buf);
break;
case OBJ_COMMIT:
grab_commit_values(val, deref, obj);
- grab_sub_body_contents(val, deref, buf);
+ grab_sub_body_contents(val, deref, buf, buf_size, obj->type);
grab_person("author", val, deref, buf);
grab_person("committer", val, deref, buf);
break;
case OBJ_TREE:
/* grab_tree_values(val, deref, obj, buf, sz); */
+ grab_sub_body_contents(val, deref, buf, buf_size, obj->type);
break;
case OBJ_BLOB:
/* grab_blob_values(val, deref, obj, buf, sz); */
+ grab_sub_body_contents(val, deref, buf, buf_size, obj->type);
break;
default:
die("Eh? Object of type %d?", obj->type);
@@ -1614,7 +1629,7 @@ static int get_object(struct ref_array_item *ref, int deref, struct object **obj
return strbuf_addf_ret(err, -1, _("parse_object_buffer failed on %s for %s"),
oid_to_hex(&oi->oid), ref->refname);
}
- grab_values(ref->value, deref, *obj, oi->content);
+ grab_values(ref->value, deref, *obj, oi);
}
grab_common_values(ref->value, deref, oi);
diff --git a/t/t6300-for-each-ref.sh b/t/t6300-for-each-ref.sh
index 9e0214076b4d..baa3a40a70b1 100755
--- a/t/t6300-for-each-ref.sh
+++ b/t/t6300-for-each-ref.sh
@@ -686,6 +686,17 @@ test_atom refs/tags/signed-empty contents:body ''
test_atom refs/tags/signed-empty contents:signature "$sig"
test_atom refs/tags/signed-empty contents "$sig"
+test_expect_success 'basic atom: refs/tags/signed-empty contents:raw' '
+ git cat-file tag refs/tags/signed-empty >expected &&
+ git for-each-ref --format="%(contents:raw)" refs/tags/signed-empty >actual &&
+ sanitize_pgp <expected >expected.clean &&
+ sanitize_pgp <actual >actual.clean &&
+ echo "" >>expected.clean &&
+ test_cmp expected.clean actual.clean
+'
+
+test_atom refs/tags/signed-empty *contents:raw $(git cat-file commit HEAD)
+
test_atom refs/tags/signed-short subject 'subject line'
test_atom refs/tags/signed-short subject:sanitize 'subject-line'
test_atom refs/tags/signed-short contents:subject 'subject line'
@@ -695,6 +706,15 @@ test_atom refs/tags/signed-short contents:signature "$sig"
test_atom refs/tags/signed-short contents "subject line
$sig"
+test_expect_success 'basic atom: refs/tags/signed-short contents:raw' '
+ git cat-file tag refs/tags/signed-short >expected &&
+ git for-each-ref --format="%(contents:raw)" refs/tags/signed-short >actual &&
+ sanitize_pgp <expected >expected.clean &&
+ sanitize_pgp <actual >actual.clean &&
+ echo "" >>expected.clean &&
+ test_cmp expected.clean actual.clean
+'
+
test_atom refs/tags/signed-long subject 'subject line'
test_atom refs/tags/signed-long subject:sanitize 'subject-line'
test_atom refs/tags/signed-long contents:subject 'subject line'
@@ -708,6 +728,15 @@ test_atom refs/tags/signed-long contents "subject line
body contents
$sig"
+test_expect_success 'basic atom: refs/tags/signed-long contents:raw' '
+ git cat-file tag refs/tags/signed-long >expected &&
+ git for-each-ref --format="%(contents:raw)" refs/tags/signed-long >actual &&
+ sanitize_pgp <expected >expected.clean &&
+ sanitize_pgp <actual >actual.clean &&
+ echo "" >>expected.clean &&
+ test_cmp expected.clean actual.clean
+'
+
test_expect_success 'set up refs pointing to tree and blob' '
git update-ref refs/mytrees/first refs/heads/main^{tree} &&
git update-ref refs/myblobs/first refs/heads/main:one
@@ -718,6 +747,7 @@ test_atom refs/mytrees/first contents:subject ""
test_atom refs/mytrees/first body ""
test_atom refs/mytrees/first contents:body ""
test_atom refs/mytrees/first contents:signature ""
+test_atom refs/mytrees/first contents:raw $(git cat-file tree refs/mytrees/first)
test_atom refs/mytrees/first contents ""
test_atom refs/myblobs/first subject ""
@@ -725,6 +755,7 @@ test_atom refs/myblobs/first contents:subject ""
test_atom refs/myblobs/first body ""
test_atom refs/myblobs/first contents:body ""
test_atom refs/myblobs/first contents:signature ""
+test_atom refs/myblobs/first contents:raw $(git cat-file blob refs/myblobs/first)
test_atom refs/myblobs/first contents ""
test_expect_success 'set up multiple-sort tags' '
base-commit: 97eea85a0a1ec66d356567808a1e4ca2367e0ce7
--
gitgitgadget
next reply other threads:[~2021-05-20 8:49 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-05-20 8:49 ZheNing Hu via GitGitGadget [this message]
2021-05-20 11:29 ` [PATCH] [GSOC] ref-filter: add contents:raw atom Hariom verma
2021-05-20 14:34 ` ZheNing Hu
2021-05-20 16:20 ` Christian Couder
2021-05-21 4:43 ` ZheNing Hu
2021-05-21 9:10 ` Christian Couder
2021-05-21 13:12 ` ZheNing Hu
2021-05-21 13:39 ` ZheNing Hu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=pull.958.git.1621500593126.gitgitgadget@gmail.com \
--to=gitgitgadget@gmail.com \
--cc=adlternative@gmail.com \
--cc=christian.couder@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=hariom18599@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.