From: ZheNing Hu <adlternative@xxxxxxxxx> Note that `--pretty="%N"` can view notes related to the commit. So add `%(notes)` to ref-filter seem is a good choice. This atom `%(notes)` view the notes associated with the ref, and support dereference. Signed-off-by: ZheNing Hu <adlternative@xxxxxxxxx> --- [GSOC] ref-filter: add %(notes) format atom An important step in the GSOC project Use ref-filter formats in git cat-file is to integrate different format atoms into the ref-filter. Olga and Hariom have also made a lot of efforts in this area. Currently, I noticed that there may be some format atoms in "pretty.c" that have not been migrated to ref-filter, such as --pretty="%N", --pretty="%(describe)". So in this patch, I tried to migrate --pretty=%N to --format=%(notes). Hope this will be hopeful !!! Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-944%2Fadlternative%2Fformat-notes-atom-v1 Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-944/adlternative/format-notes-atom-v1 Pull-Request: https://github.com/gitgitgadget/git/pull/944 Documentation/git-for-each-ref.txt | 4 ++++ ref-filter.c | 31 ++++++++++++++++++++++++++++-- t/t6300-for-each-ref.sh | 10 ++++++++++ 3 files changed, 43 insertions(+), 2 deletions(-) diff --git a/Documentation/git-for-each-ref.txt b/Documentation/git-for-each-ref.txt index 2ae2478de706..07f037a16e13 100644 --- a/Documentation/git-for-each-ref.txt +++ b/Documentation/git-for-each-ref.txt @@ -139,6 +139,9 @@ deltabase:: given object, if it is stored as a delta. Otherwise it expands to the null object name (all zeroes). +notes:: + The notes associated with the ref. + upstream:: The name of a local ref which can be considered ``upstream'' from the displayed ref. Respects `:short`, `:lstrip` and @@ -302,6 +305,7 @@ git for-each-ref --count=3 --sort='-*authordate' \ Subject: %(*subject) Date: %(*authordate) Ref: %(*refname) +Notes: %(*notes) %(*body) ' 'refs/tags' diff --git a/ref-filter.c b/ref-filter.c index a0adb4551d87..42a5608a3056 100644 --- a/ref-filter.c +++ b/ref-filter.c @@ -23,6 +23,7 @@ #include "worktree.h" #include "hashmap.h" #include "strvec.h" +#include "run-command.h" static struct ref_msg { const char *gone; @@ -506,6 +507,7 @@ static struct { { "objectsize", SOURCE_OTHER, FIELD_ULONG, objectsize_atom_parser }, { "objectname", SOURCE_OTHER, FIELD_STR, oid_atom_parser }, { "deltabase", SOURCE_OTHER, FIELD_STR, deltabase_atom_parser }, + { "notes", SOURCE_OTHER, FIELD_STR }, { "tree", SOURCE_OBJ, FIELD_STR, oid_atom_parser }, { "parent", SOURCE_OBJ, FIELD_STR, oid_atom_parser }, { "numparent", SOURCE_OBJ, FIELD_ULONG }, @@ -953,6 +955,24 @@ static int grab_oid(const char *name, const char *field, const struct object_id return 0; } +static int grab_notes(const struct object_id *oid, struct atom_value *v) +{ + struct child_process cmd = CHILD_PROCESS_INIT; + struct strbuf out = STRBUF_INIT; + struct strbuf err = STRBUF_INIT; + const char *args[] = { "notes", "show", NULL }; + int ret; + + cmd.git_cmd = 1; + strvec_pushv(&cmd.args, args); + strvec_push(&cmd.args, oid_to_hex(oid)); + ret = pipe_command(&cmd, NULL, 0, &out, 0, &err, 0); + strbuf_trim_trailing_newline(&out); + v->s = strbuf_detach(&out, NULL); + strbuf_release(&err); + return ret; +} + /* See grab_values */ static void grab_common_values(struct atom_value *val, int deref, struct expand_data *oi) { @@ -975,8 +995,12 @@ static void grab_common_values(struct atom_value *val, int deref, struct expand_ v->s = xstrfmt("%"PRIuMAX , (uintmax_t)oi->size); } else if (!strcmp(name, "deltabase")) v->s = xstrdup(oid_to_hex(&oi->delta_base_oid)); - else if (deref) - grab_oid(name, "objectname", &oi->oid, v, &used_atom[i]); + else if (deref) { + if (!strcmp(name, "notes")) + grab_notes(&oi->oid, v); + else + grab_oid(name, "objectname", &oi->oid, v, &used_atom[i]); + } } } @@ -1767,6 +1791,9 @@ static int populate_value(struct ref_array_item *ref, struct strbuf *err) continue; } else if (!deref && grab_oid(name, "objectname", &ref->objectname, v, atom)) { continue; + } else if (!deref && !strcmp(name, "notes")) { + grab_notes(&ref->objectname, v); + continue; } else if (!strcmp(name, "HEAD")) { if (atom->u.head && !strcmp(ref->refname, atom->u.head)) v->s = xstrdup("*"); diff --git a/t/t6300-for-each-ref.sh b/t/t6300-for-each-ref.sh index 9e0214076b4d..61cdbeb696ff 100755 --- a/t/t6300-for-each-ref.sh +++ b/t/t6300-for-each-ref.sh @@ -32,8 +32,10 @@ test_expect_success setup ' git add one && git commit -m "Initial" && git branch -M main && + git notes add -m "commit-notes" HEAD && setdate_and_increment && git tag -a -m "Tagging at $datestamp" testtag && + git notes add -m "tag-notes" testtag && git update-ref refs/remotes/origin/main main && git remote add origin nowhere && git config branch.main.remote origin && @@ -162,6 +164,7 @@ test_atom head contents:signature '' test_atom head contents 'Initial ' test_atom head HEAD '*' +test_atom head notes $(git notes show refs/heads/main) test_atom tag refname refs/tags/testtag test_atom tag refname:short testtag @@ -220,6 +223,8 @@ test_atom tag contents:signature '' test_atom tag contents 'Tagging at 1151968727 ' test_atom tag HEAD ' ' +test_atom tag notes $(git notes show refs/tags/testtag) +test_atom tag "*notes" $(git notes show refs/heads/main) test_expect_success 'Check invalid atoms names are errors' ' test_must_fail git for-each-ref --format="%(INVALID)" refs/heads @@ -380,6 +385,7 @@ test_expect_success 'exercise strftime with odd fields' ' cat >expected <<\EOF refs/heads/main +refs/notes/commits refs/remotes/origin/main refs/tags/testtag EOF @@ -393,6 +399,7 @@ test_expect_success 'Verify ascending sort' ' cat >expected <<\EOF refs/tags/testtag refs/remotes/origin/main +refs/notes/commits refs/heads/main EOF @@ -429,6 +436,7 @@ test_expect_success 'exercise glob patterns with prefixes' ' cat >expected <<\EOF 'refs/heads/main' +'refs/notes/commits' 'refs/remotes/origin/main' 'refs/tags/testtag' EOF @@ -450,6 +458,7 @@ test_expect_success 'Quoting style: python' ' cat >expected <<\EOF "refs/heads/main" +"refs/notes/commits" "refs/remotes/origin/main" "refs/tags/testtag" EOF @@ -509,6 +518,7 @@ test_expect_success 'Check for invalid refname format' ' test_expect_success 'set up color tests' ' cat >expected.color <<-EOF && $(git rev-parse --short refs/heads/main) <GREEN>main<RESET> + $(git rev-parse --short refs/notes/commits) <GREEN>notes/commits<RESET> $(git rev-parse --short refs/remotes/myfork/main) <GREEN>myfork/main<RESET> $(git rev-parse --short refs/remotes/origin/main) <GREEN>origin/main<RESET> $(git rev-parse --short refs/tags/testtag) <GREEN>testtag<RESET> base-commit: 311531c9de557d25ac087c1637818bd2aad6eb3a -- gitgitgadget