{"thread":{"id":"14147","subject":"[Bug] for-each-ref: %(object) and %(type) unimplemented","startedAt":"2008-06-25T15:01:01Z","lastAt":"2008-06-26T08:21:13Z","messageCount":11,"participants":["Lea Wiemann","Jeff King","Mikael Magnusson","Junio C Hamano"],"isPatch":false,"patchVersion":null,"patchTotal":null},"messages":[{"id":"81125","messageId":"48625DAD.5040404@gmail.com","threadId":"14147","inReplyTo":null,"subject":"[Bug] for-each-ref: %(object) and %(type) unimplemented","fromName":"Lea Wiemann","fromEmail":"lewiemann@gmail.com","sentAt":"2008-06-25T15:01:01Z","receivedAt":"2008-06-25T15:01:01Z","isPatch":false,"sender":{"key":"lewiemann@gmail.com","avatar":null},"body":"Try the following on a repository with tag objects in it:\n\ngit for-each-ref --format='%(object)'\ngit for-each-ref --format='%(type)'\n\nEach command prints only newlines.  The %(type) and %(object) options \nare not rejected with an error message (like \"%(doesnotexist)\"), but \nthey don't seem to be implemented.  \"%(tag)\" works though.\n\nAnyone care to implement the missing options?  Or should they rather be \nremoved from the documentation?\n\n-- Lea\n"},{"id":"81133","messageId":"20080625160814.GA3321@sigill.intra.peff.net","threadId":"14147","inReplyTo":"48625DAD.5040404@gmail.com","subject":"Re: [Bug] for-each-ref: %(object) and %(type) unimplemented","fromName":"Jeff King","fromEmail":"peff@peff.net","sentAt":"2008-06-25T16:08:15Z","receivedAt":"2008-06-25T16:08:15Z","isPatch":false,"sender":{"key":"peff@peff.net","avatar":"https://avatars.githubusercontent.com/u/45925?v=4"},"body":"On Wed, Jun 25, 2008 at 05:01:01PM +0200, Lea Wiemann wrote:\n\n> Try the following on a repository with tag objects in it:\n>\n> git for-each-ref --format='%(object)'\n> git for-each-ref --format='%(type)'\n>\n> Each command prints only newlines.  The %(type) and %(object) options are \n> not rejected with an error message (like \"%(doesnotexist)\"), but they \n> don't seem to be implemented.  \"%(tag)\" works though.\n>\n> Anyone care to implement the missing options?  Or should they rather be  \n> removed from the documentation?\n\nLooks like they were part of the original set of atoms, but they just\nnever ended up implemented. Clearly nobody has actually cared in the\nintervening time, but it is easy enough to add them. See below.\n\nSince you seem to be testing for-each-ref, maybe it would make sense to\nput together a test script that exercises each of the atoms?\n\n-- >8 --\nfor-each-ref: implement missing tag values\n\nThe \"type\" and \"object\" fields for tags were accepted as\nvalid atoms, but never implemented. Consequently, they\nsimply returned the empty string, even for valid tags.\n\nNoticed by Lea Wiemann.\n\nSigned-off-by: Jeff King <peff@peff.net>\n---\n builtin-for-each-ref.c |    7 +++++++\n 1 files changed, 7 insertions(+), 0 deletions(-)\n\ndiff --git a/builtin-for-each-ref.c b/builtin-for-each-ref.c\nindex 07d9c57..fef93d7 100644\n--- a/builtin-for-each-ref.c\n+++ b/builtin-for-each-ref.c\n@@ -234,6 +234,13 @@ static void grab_tag_values(struct atom_value *val, int deref, struct object *ob\n \t\t\tname++;\n \t\tif (!strcmp(name, \"tag\"))\n \t\t\tv->s = tag->tag;\n+\t\telse if (!strcmp(name, \"type\") && tag->tagged)\n+\t\t\tv->s = typename(tag->tagged->type);\n+\t\telse if (!strcmp(name, \"object\") && tag->tagged) {\n+\t\t\tchar *s = xmalloc(41);\n+\t\t\tstrcpy(s, sha1_to_hex(tag->tagged->sha1));\n+\t\t\tv->s = s;\n+\t\t}\n \t}\n }\n \n-- \n1.5.6.129.g8dea5.dirty\n"},{"id":"81134","messageId":"20080625161433.GA6612@sigill.intra.peff.net","threadId":"14147","inReplyTo":"20080625160814.GA3321@sigill.intra.peff.net","subject":"Re: [Bug] for-each-ref: %(object) and %(type) unimplemented","fromName":"Jeff King","fromEmail":"peff@peff.net","sentAt":"2008-06-25T16:14:33Z","receivedAt":"2008-06-25T16:14:33Z","isPatch":false,"sender":{"key":"peff@peff.net","avatar":"https://avatars.githubusercontent.com/u/45925?v=4"},"body":"On Wed, Jun 25, 2008 at 12:08:15PM -0400, Jeff King wrote:\n\n> Since you seem to be testing for-each-ref, maybe it would make sense to\n> put together a test script that exercises each of the atoms?\n\nHmm. Actually, there is a test in t6300 that runs with each atom name.\nUnfortunately, it doesn't bother actually checking the output for\nsanity, so the fact that these atoms returned the empty string was\nmissed.\n\n-Peff\n"},{"id":"81162","messageId":"237967ef0806251208u65c17652gc6091da98294f807@mail.gmail.com","threadId":"14147","inReplyTo":"20080625161433.GA6612@sigill.intra.peff.net","subject":"Re: [Bug] for-each-ref: %(object) and %(type) unimplemented","fromName":"Mikael Magnusson","fromEmail":"mikachu@gmail.com","sentAt":"2008-06-25T19:08:30Z","receivedAt":"2008-06-25T19:08:30Z","isPatch":false,"sender":{"key":"mikachu@gmail.com","avatar":null},"body":"2008/6/25 Jeff King <peff@peff.net>:\n> On Wed, Jun 25, 2008 at 12:08:15PM -0400, Jeff King wrote:\n>\n>> Since you seem to be testing for-each-ref, maybe it would make sense to\n>> put together a test script that exercises each of the atoms?\n>\n> Hmm. Actually, there is a test in t6300 that runs with each atom name.\n> Unfortunately, it doesn't bother actually checking the output for\n> sanity, so the fact that these atoms returned the empty string was\n> missed.\n\nThe documentation also says \"tree\" and \"parent\" should work (which they\nalso don't).\n\n-- \nMikael Magnusson\n"},{"id":"81167","messageId":"7v63rx1ezw.fsf@gitster.siamese.dyndns.org","threadId":"14147","inReplyTo":"237967ef0806251208u65c17652gc6091da98294f807@mail.gmail.com","subject":"Re: [Bug] for-each-ref: %(object) and %(type) unimplemented","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2008-06-25T19:38:59Z","receivedAt":"2008-06-25T19:38:59Z","isPatch":false,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"\"Mikael Magnusson\" <mikachu@gmail.com> writes:\n\n> 2008/6/25 Jeff King <peff@peff.net>:\n>> On Wed, Jun 25, 2008 at 12:08:15PM -0400, Jeff King wrote:\n>>\n>>> Since you seem to be testing for-each-ref, maybe it would make sense to\n>>> put together a test script that exercises each of the atoms?\n>>\n>> Hmm. Actually, there is a test in t6300 that runs with each atom name.\n>> Unfortunately, it doesn't bother actually checking the output for\n>> sanity, so the fact that these atoms returned the empty string was\n>> missed.\n>\n> The documentation also says \"tree\" and \"parent\" should work (which they\n> also don't).\n\nThe doc does not say any such thing.  A tag object does not have 'parent'\nnor 'tree' header fields.\n\nNeither a commit have 'object' nor 'type' header fields and you cannot ask\nfor them when showing a commit object.\n"},{"id":"81179","messageId":"237967ef0806251336r67bdc13w5886dd1a42fa01e6@mail.gmail.com","threadId":"14147","inReplyTo":"7v63rx1ezw.fsf@gitster.siamese.dyndns.org","subject":"Re: [Bug] for-each-ref: %(object) and %(type) unimplemented","fromName":"Mikael Magnusson","fromEmail":"mikachu@gmail.com","sentAt":"2008-06-25T20:36:33Z","receivedAt":"2008-06-25T20:36:33Z","isPatch":false,"sender":{"key":"mikachu@gmail.com","avatar":null},"body":"2008/6/25 Junio C Hamano <gitster@pobox.com>:\n> \"Mikael Magnusson\" <mikachu@gmail.com> writes:\n>\n>> 2008/6/25 Jeff King <peff@peff.net>:\n>>> On Wed, Jun 25, 2008 at 12:08:15PM -0400, Jeff King wrote:\n>>>\n>>>> Since you seem to be testing for-each-ref, maybe it would make sense to\n>>>> put together a test script that exercises each of the atoms?\n>>>\n>>> Hmm. Actually, there is a test in t6300 that runs with each atom name.\n>>> Unfortunately, it doesn't bother actually checking the output for\n>>> sanity, so the fact that these atoms returned the empty string was\n>>> missed.\n>>\n>> The documentation also says \"tree\" and \"parent\" should work (which they\n>> also don't).\n>\n> The doc does not say any such thing.  A tag object does not have 'parent'\n> nor 'tree' header fields.\n>\n> Neither a commit have 'object' nor 'type' header fields and you cannot ask\n> for them when showing a commit object.\n\nAh, sorry, I read this paragraph:\n              In addition to the above, for commit and tag objects,\nthe header field\n              names (tree, parent, object, type, and tag) can be used\nto specify the\n              value in the header field.\n\nBut not this one (which perhaps should be right after the\n                  above instead of 3 paragraphs down):\n              In any case, a field name that refers to a field\ninapplicable to the\n              object referred by the ref does not cause an error. It\nreturns an empty\n              string instead.\n\n\n-- \nMikael Magnusson\n"},{"id":"81234","messageId":"20080626053551.GA20767@sigill.intra.peff.net","threadId":"14147","inReplyTo":"20080625161433.GA6612@sigill.intra.peff.net","subject":"Re: [Bug] for-each-ref: %(object) and %(type) unimplemented","fromName":"Jeff King","fromEmail":"peff@peff.net","sentAt":"2008-06-26T05:35:51Z","receivedAt":"2008-06-26T05:35:51Z","isPatch":false,"sender":{"key":"peff@peff.net","avatar":"https://avatars.githubusercontent.com/u/45925?v=4"},"body":"On Wed, Jun 25, 2008 at 12:14:33PM -0400, Jeff King wrote:\n\n> Hmm. Actually, there is a test in t6300 that runs with each atom name.\n> Unfortunately, it doesn't bother actually checking the output for\n> sanity, so the fact that these atoms returned the empty string was\n> missed.\n\nAnd here is a two patch series cleaning up the test script and fixing\nthe bug.\n\n-Peff\n"},{"id":"81235","messageId":"20080626053741.GA20824@sigill.intra.peff.net","threadId":"14147","inReplyTo":"20080626053551.GA20767@sigill.intra.peff.net","subject":"[PATCH 1/2] improve for-each-ref test script","fromName":"Jeff King","fromEmail":"peff@peff.net","sentAt":"2008-06-26T05:37:42Z","receivedAt":"2008-06-26T05:37:42Z","isPatch":true,"sender":{"key":"peff@peff.net","avatar":"https://avatars.githubusercontent.com/u/45925?v=4"},"body":"Previously, we did a sanity check by doing for-each-ref\nusing each possible format atom. However, we never checked\nthe actual output produced by that atom. This patch checks\nthe output, and in doing so reveals breakage on a few atoms.\n\nWhile we're at it, also clean up a few '!' into\ntest_must_fail.\n\nSigned-off-by: Jeff King <peff@peff.net>\n---\n t/t6300-for-each-ref.sh |   87 +++++++++++++++++++++++++++++++++++++---------\n 1 files changed, 70 insertions(+), 17 deletions(-)\n\ndiff --git a/t/t6300-for-each-ref.sh b/t/t6300-for-each-ref.sh\nindex 91ea85d..415e1d1 100755\n--- a/t/t6300-for-each-ref.sh\n+++ b/t/t6300-for-each-ref.sh\n@@ -26,25 +26,78 @@ test_expect_success 'Create sample commit with known timestamp' '\n \tgit tag -a -m \"Tagging at $datestamp\" testtag\n '\n \n-test_expect_success 'Check atom names are valid' '\n-\tbad=\n-\tfor token in \\\n-\t\trefname objecttype objectsize objectname tree parent \\\n-\t\tnumparent object type author authorname authoremail \\\n-\t\tauthordate committer committername committeremail \\\n-\t\tcommitterdate tag tagger taggername taggeremail \\\n-\t\ttaggerdate creator creatordate subject body contents\n-\tdo\n-\t\tgit for-each-ref --format=\"$token=%($token)\" refs/heads || {\n-\t\t\tbad=$token\n-\t\t\tbreak\n-\t\t}\n-\tdone\n-\ttest -z \"$bad\"\n+test_atom() {\n+\tcase \"$1\" in\n+\t\thead) ref=refs/heads/master ;;\n+\t\t tag) ref=refs/tags/testtag ;;\n+\tesac\n+\tprintf '%s\\n' \"$3\" >expected\n+\ttest_expect_${4:-success} \"basic atom: $1 $2\" \"\n+\t\tgit for-each-ref --format='%($2)' $ref >actual &&\n+\t\ttest_cmp expected actual\n+\t\"\n+}\n+\n+test_atom head refname refs/heads/master\n+test_atom head objecttype commit\n+test_atom head objectsize 171\n+test_atom head objectname 67a36f10722846e891fbada1ba48ed035de75581\n+test_atom head tree 0e51c00fcb93dffc755546f27593d511e1bdb46f\n+test_atom head parent ''\n+test_atom head numparent 0\n+test_atom head object ''\n+test_atom head type ''\n+test_atom head author 'A U Thor <author@example.com> 1151939924 +0200'\n+test_atom head authorname 'A U Thor'\n+test_atom head authoremail '<author@example.com>'\n+test_atom head authordate 'Mon Jul 3 17:18:44 2006 +0200'\n+test_atom head committer 'C O Mitter <committer@example.com> 1151939923 +0200'\n+test_atom head committername 'C O Mitter'\n+test_atom head committeremail '<committer@example.com>'\n+test_atom head committerdate 'Mon Jul 3 17:18:43 2006 +0200'\n+test_atom head tag ''\n+test_atom head tagger ''\n+test_atom head taggername ''\n+test_atom head taggeremail ''\n+test_atom head taggerdate ''\n+test_atom head creator 'C O Mitter <committer@example.com> 1151939923 +0200'\n+test_atom head creatordate 'Mon Jul 3 17:18:43 2006 +0200'\n+test_atom head subject 'Initial'\n+test_atom head body ''\n+test_atom head contents 'Initial\n+'\n+\n+test_atom tag refname refs/tags/testtag\n+test_atom tag objecttype tag\n+test_atom tag objectsize 154\n+test_atom tag objectname 98b46b1d36e5b07909de1b3886224e3e81e87322\n+test_atom tag tree ''\n+test_atom tag parent ''\n+test_atom tag numparent ''\n+test_atom tag object '67a36f10722846e891fbada1ba48ed035de75581' failure\n+test_atom tag type 'commit' failure\n+test_atom tag author ''\n+test_atom tag authorname ''\n+test_atom tag authoremail ''\n+test_atom tag authordate ''\n+test_atom tag committer ''\n+test_atom tag committername ''\n+test_atom tag committeremail ''\n+test_atom tag committerdate ''\n+test_atom tag tag 'testtag'\n+test_atom tag tagger 'C O Mitter <committer@example.com> 1151939925 +0200'\n+test_atom tag taggername 'C O Mitter'\n+test_atom tag taggeremail '<committer@example.com>'\n+test_atom tag taggerdate 'Mon Jul 3 17:18:45 2006 +0200'\n+test_atom tag creator 'C O Mitter <committer@example.com> 1151939925 +0200'\n+test_atom tag creatordate 'Mon Jul 3 17:18:45 2006 +0200'\n+test_atom tag subject 'Tagging at 1151939927'\n+test_atom tag body ''\n+test_atom tag contents 'Tagging at 1151939927\n '\n \n test_expect_success 'Check invalid atoms names are errors' '\n-\t! git-for-each-ref --format=\"%(INVALID)\" refs/heads\n+\ttest_must_fail git-for-each-ref --format=\"%(INVALID)\" refs/heads\n '\n \n test_expect_success 'Check format specifiers are ignored in naming date atoms' '\n@@ -64,7 +117,7 @@ test_expect_success 'Check valid format specifiers for date fields' '\n '\n \n test_expect_success 'Check invalid format specifiers are errors' '\n-\t! git-for-each-ref --format=\"%(authordate:INVALID)\" refs/heads\n+\ttest_must_fail git-for-each-ref --format=\"%(authordate:INVALID)\" refs/heads\n '\n \n cat >expected <<\\EOF\n-- \n1.5.6\n"},{"id":"81236","messageId":"20080626053804.GB20824@sigill.intra.peff.net","threadId":"14147","inReplyTo":"20080626053551.GA20767@sigill.intra.peff.net","subject":"[PATCH 2/2] for-each-ref: implement missing tag values","fromName":"Jeff King","fromEmail":"peff@peff.net","sentAt":"2008-06-26T05:38:04Z","receivedAt":"2008-06-26T05:38:04Z","isPatch":true,"sender":{"key":"peff@peff.net","avatar":"https://avatars.githubusercontent.com/u/45925?v=4"},"body":"The \"type\" and \"object\" fields for tags were accepted as\nvalid atoms, but never implemented. Consequently, they\nsimply returned the empty string, even for valid tags.\n\nSigned-off-by: Jeff King <peff@peff.net>\n---\n builtin-for-each-ref.c  |    7 +++++++\n t/t6300-for-each-ref.sh |    4 ++--\n 2 files changed, 9 insertions(+), 2 deletions(-)\n\ndiff --git a/builtin-for-each-ref.c b/builtin-for-each-ref.c\nindex 07d9c57..fef93d7 100644\n--- a/builtin-for-each-ref.c\n+++ b/builtin-for-each-ref.c\n@@ -234,6 +234,13 @@ static void grab_tag_values(struct atom_value *val, int deref, struct object *ob\n \t\t\tname++;\n \t\tif (!strcmp(name, \"tag\"))\n \t\t\tv->s = tag->tag;\n+\t\telse if (!strcmp(name, \"type\") && tag->tagged)\n+\t\t\tv->s = typename(tag->tagged->type);\n+\t\telse if (!strcmp(name, \"object\") && tag->tagged) {\n+\t\t\tchar *s = xmalloc(41);\n+\t\t\tstrcpy(s, sha1_to_hex(tag->tagged->sha1));\n+\t\t\tv->s = s;\n+\t\t}\n \t}\n }\n \ndiff --git a/t/t6300-for-each-ref.sh b/t/t6300-for-each-ref.sh\nindex 415e1d1..a3c8941 100755\n--- a/t/t6300-for-each-ref.sh\n+++ b/t/t6300-for-each-ref.sh\n@@ -74,8 +74,8 @@ test_atom tag objectname 98b46b1d36e5b07909de1b3886224e3e81e87322\n test_atom tag tree ''\n test_atom tag parent ''\n test_atom tag numparent ''\n-test_atom tag object '67a36f10722846e891fbada1ba48ed035de75581' failure\n-test_atom tag type 'commit' failure\n+test_atom tag object '67a36f10722846e891fbada1ba48ed035de75581'\n+test_atom tag type 'commit'\n test_atom tag author ''\n test_atom tag authorname ''\n test_atom tag authoremail ''\n-- \n1.5.6\n"},{"id":"81248","messageId":"20080626080841.GA27935@sigill.intra.peff.net","threadId":"14147","inReplyTo":"20080626053551.GA20767@sigill.intra.peff.net","subject":"Re: [Bug] for-each-ref: %(object) and %(type) unimplemented","fromName":"Jeff King","fromEmail":"peff@peff.net","sentAt":"2008-06-26T08:08:41Z","receivedAt":"2008-06-26T08:08:41Z","isPatch":false,"sender":{"key":"peff@peff.net","avatar":"https://avatars.githubusercontent.com/u/45925?v=4"},"body":"On Thu, Jun 26, 2008 at 01:35:51AM -0400, Jeff King wrote:\n\n> > Hmm. Actually, there is a test in t6300 that runs with each atom name.\n> > Unfortunately, it doesn't bother actually checking the output for\n> > sanity, so the fact that these atoms returned the empty string was\n> > missed.\n> \n> And here is a two patch series cleaning up the test script and fixing\n> the bug.\n\nHmm, looks like I just missed you applying the original fix to maint.\nIgnore 2/2, then, as you already have it. I think it is still worth\ndoing the test script cleanup, though. Here it is, rebased on the\ncurrent master (the only difference is we don't have to mark the\nbreakage as expect_failure).\n\n-- >8 --\nimprove for-each-ref test script\n\nPreviously, we did a sanity check by doing for-each-ref\nusing each possible format atom. However, we never checked\nthe actual output produced by that atom, which recently let\nan obvious bug go undetected for some time.\n\nWhile we're at it, also clean up a few '!' into\ntest_must_fail.\n---\n t/t6300-for-each-ref.sh |   87 +++++++++++++++++++++++++++++++++++++---------\n 1 files changed, 70 insertions(+), 17 deletions(-)\n\ndiff --git a/t/t6300-for-each-ref.sh b/t/t6300-for-each-ref.sh\nindex 91ea85d..a3c8941 100755\n--- a/t/t6300-for-each-ref.sh\n+++ b/t/t6300-for-each-ref.sh\n@@ -26,25 +26,78 @@ test_expect_success 'Create sample commit with known timestamp' '\n \tgit tag -a -m \"Tagging at $datestamp\" testtag\n '\n \n-test_expect_success 'Check atom names are valid' '\n-\tbad=\n-\tfor token in \\\n-\t\trefname objecttype objectsize objectname tree parent \\\n-\t\tnumparent object type author authorname authoremail \\\n-\t\tauthordate committer committername committeremail \\\n-\t\tcommitterdate tag tagger taggername taggeremail \\\n-\t\ttaggerdate creator creatordate subject body contents\n-\tdo\n-\t\tgit for-each-ref --format=\"$token=%($token)\" refs/heads || {\n-\t\t\tbad=$token\n-\t\t\tbreak\n-\t\t}\n-\tdone\n-\ttest -z \"$bad\"\n+test_atom() {\n+\tcase \"$1\" in\n+\t\thead) ref=refs/heads/master ;;\n+\t\t tag) ref=refs/tags/testtag ;;\n+\tesac\n+\tprintf '%s\\n' \"$3\" >expected\n+\ttest_expect_${4:-success} \"basic atom: $1 $2\" \"\n+\t\tgit for-each-ref --format='%($2)' $ref >actual &&\n+\t\ttest_cmp expected actual\n+\t\"\n+}\n+\n+test_atom head refname refs/heads/master\n+test_atom head objecttype commit\n+test_atom head objectsize 171\n+test_atom head objectname 67a36f10722846e891fbada1ba48ed035de75581\n+test_atom head tree 0e51c00fcb93dffc755546f27593d511e1bdb46f\n+test_atom head parent ''\n+test_atom head numparent 0\n+test_atom head object ''\n+test_atom head type ''\n+test_atom head author 'A U Thor <author@example.com> 1151939924 +0200'\n+test_atom head authorname 'A U Thor'\n+test_atom head authoremail '<author@example.com>'\n+test_atom head authordate 'Mon Jul 3 17:18:44 2006 +0200'\n+test_atom head committer 'C O Mitter <committer@example.com> 1151939923 +0200'\n+test_atom head committername 'C O Mitter'\n+test_atom head committeremail '<committer@example.com>'\n+test_atom head committerdate 'Mon Jul 3 17:18:43 2006 +0200'\n+test_atom head tag ''\n+test_atom head tagger ''\n+test_atom head taggername ''\n+test_atom head taggeremail ''\n+test_atom head taggerdate ''\n+test_atom head creator 'C O Mitter <committer@example.com> 1151939923 +0200'\n+test_atom head creatordate 'Mon Jul 3 17:18:43 2006 +0200'\n+test_atom head subject 'Initial'\n+test_atom head body ''\n+test_atom head contents 'Initial\n+'\n+\n+test_atom tag refname refs/tags/testtag\n+test_atom tag objecttype tag\n+test_atom tag objectsize 154\n+test_atom tag objectname 98b46b1d36e5b07909de1b3886224e3e81e87322\n+test_atom tag tree ''\n+test_atom tag parent ''\n+test_atom tag numparent ''\n+test_atom tag object '67a36f10722846e891fbada1ba48ed035de75581'\n+test_atom tag type 'commit'\n+test_atom tag author ''\n+test_atom tag authorname ''\n+test_atom tag authoremail ''\n+test_atom tag authordate ''\n+test_atom tag committer ''\n+test_atom tag committername ''\n+test_atom tag committeremail ''\n+test_atom tag committerdate ''\n+test_atom tag tag 'testtag'\n+test_atom tag tagger 'C O Mitter <committer@example.com> 1151939925 +0200'\n+test_atom tag taggername 'C O Mitter'\n+test_atom tag taggeremail '<committer@example.com>'\n+test_atom tag taggerdate 'Mon Jul 3 17:18:45 2006 +0200'\n+test_atom tag creator 'C O Mitter <committer@example.com> 1151939925 +0200'\n+test_atom tag creatordate 'Mon Jul 3 17:18:45 2006 +0200'\n+test_atom tag subject 'Tagging at 1151939927'\n+test_atom tag body ''\n+test_atom tag contents 'Tagging at 1151939927\n '\n \n test_expect_success 'Check invalid atoms names are errors' '\n-\t! git-for-each-ref --format=\"%(INVALID)\" refs/heads\n+\ttest_must_fail git-for-each-ref --format=\"%(INVALID)\" refs/heads\n '\n \n test_expect_success 'Check format specifiers are ignored in naming date atoms' '\n@@ -64,7 +117,7 @@ test_expect_success 'Check valid format specifiers for date fields' '\n '\n \n test_expect_success 'Check invalid format specifiers are errors' '\n-\t! git-for-each-ref --format=\"%(authordate:INVALID)\" refs/heads\n+\ttest_must_fail git-for-each-ref --format=\"%(authordate:INVALID)\" refs/heads\n '\n \n cat >expected <<\\EOF\n-- \n1.5.6.129.g8dea5.dirty\n"},{"id":"81251","messageId":"7vbq1osj2e.fsf@gitster.siamese.dyndns.org","threadId":"14147","inReplyTo":"20080626080841.GA27935@sigill.intra.peff.net","subject":"Re: [Bug] for-each-ref: %(object) and %(type) unimplemented","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2008-06-26T08:21:13Z","receivedAt":"2008-06-26T08:21:13Z","isPatch":false,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Jeff King <peff@peff.net> writes:\n\n> Hmm, looks like I just missed you applying the original fix to maint.\n> Ignore 2/2, then, as you already have it. I think it is still worth\n> doing the test script cleanup, though.\n\nAbsolutely.  And thanks.\n"}]}