{"thread":{"id":"34140","subject":"[PATCH 0/3] Get rebase to work with :/foomery committish","startedAt":"2013-06-14T13:17:49Z","lastAt":"2013-06-17T02:52:49Z","messageCount":10,"participants":["Ramkumar Ramachandra","Philip Oakley","Junio C Hamano"],"isPatch":true,"patchVersion":1,"patchTotal":3},"messages":[{"id":"220819","messageId":"1371215872-9796-1-git-send-email-artagnon@gmail.com","threadId":"34140","inReplyTo":null,"subject":"[PATCH 0/3] Get rebase to work with :/foomery committish","fromName":"Ramkumar Ramachandra","fromEmail":"artagnon@gmail.com","sentAt":"2013-06-14T13:17:49Z","receivedAt":"2013-06-14T13:17:49Z","isPatch":true,"sender":{"key":"r@artagnon.com","avatar":"https://avatars.githubusercontent.com/u/37226?v=4"},"body":"Since the early preview, I realized that peel_committish() is required\nin exactly two places: the <onto> and <upstream> parsers facing\nend-user data.  Updated appropriately.\n\nThanks.\n\nRamkumar Ramachandra (3):\n  t/rebase: add failing tests for a peculiar revision\n  sh-setup: add new peel_committish() helper\n  rebase: use peel_committish() where appropriate\n\n git-rebase.sh                 |  4 ++--\n git-sh-setup.sh               | 12 ++++++++++++\n t/t3400-rebase.sh             | 11 +++++++++++\n t/t3404-rebase-interactive.sh | 11 +++++++++++\n 4 files changed, 36 insertions(+), 2 deletions(-)\n\n-- \n1.8.3.1.381.g12ca056.dirty\n"},{"id":"220820","messageId":"1371215872-9796-2-git-send-email-artagnon@gmail.com","threadId":"34140","inReplyTo":"1371215872-9796-1-git-send-email-artagnon@gmail.com","subject":"[PATCH 1/3] t/rebase: add failing tests for a peculiar revision","fromName":"Ramkumar Ramachandra","fromEmail":"artagnon@gmail.com","sentAt":"2013-06-14T13:17:50Z","receivedAt":"2013-06-14T13:17:50Z","isPatch":true,"sender":{"key":"r@artagnon.com","avatar":"https://avatars.githubusercontent.com/u/37226?v=4"},"body":"The following commands fail, even if :/quuxery and :/foomery resolve to\nperfectly valid commits:\n\n  $ git rebase [-i] --onto :/quuxery :/foomery\n\nThis is because rebase [-i] attempts to rev-parse ${REV}^0 to verify\nthat the given revision resolves to a commit.  Add tests to document\nthese failures.\n\nSigned-off-by: Ramkumar Ramachandra <artagnon@gmail.com>\n---\n t/t3400-rebase.sh             | 11 +++++++++++\n t/t3404-rebase-interactive.sh | 11 +++++++++++\n 2 files changed, 22 insertions(+)\n\ndiff --git a/t/t3400-rebase.sh b/t/t3400-rebase.sh\nindex b58fa1a..81ec517 100755\n--- a/t/t3400-rebase.sh\n+++ b/t/t3400-rebase.sh\n@@ -88,6 +88,17 @@ test_expect_success 'rebase fast-forward to master' '\n \ttest_i18ngrep \"Fast-forwarded HEAD to my-topic-branch\" out\n '\n \n+test_expect_failure 'rebase, with <onto> and <upstream> specified as :/quuxery' '\n+\ttest_when_finished \"git branch -D torebase\" &&\n+\tgit checkout -b torebase my-topic-branch^ &&\n+\tupstream=$(git rev-parse \":/Add B\") &&\n+\tonto=$(git rev-parse \":/Add A\") &&\n+\tgit rebase --onto $onto $upstream &&\n+\tgit reset --hard my-topic-branch^ &&\n+\tgit rebase --onto \":/Add A\" \":/Add B\" &&\n+\tgit checkout my-topic-branch\n+'\n+\n test_expect_success 'the rebase operation should not have destroyed author information' '\n \t! (git log | grep \"Author:\" | grep \"<>\")\n '\ndiff --git a/t/t3404-rebase-interactive.sh b/t/t3404-rebase-interactive.sh\nindex 79e8d3c..eb241f5 100755\n--- a/t/t3404-rebase-interactive.sh\n+++ b/t/t3404-rebase-interactive.sh\n@@ -947,4 +947,15 @@ test_expect_success 'rebase -i respects core.commentchar' '\n \ttest B = $(git cat-file commit HEAD^ | sed -ne \\$p)\n '\n \n+test_expect_failure 'rebase -i, with <onto> and <upstream> specified as :/quuxery' '\n+\ttest_when_finished \"git branch -D torebase\" &&\n+\tgit checkout -b torebase branch1 &&\n+\tupstream=$(git rev-parse \":/J\") &&\n+\tonto=$(git rev-parse \":/A\") &&\n+\tgit rebase --onto $onto $upstream &&\n+\tgit reset --hard branch1 &&\n+\tgit rebase --onto \":/A\" \":/J\" &&\n+\tgit checkout branch1\n+'\n+\n test_done\n-- \n1.8.3.1.381.g12ca056.dirty\n"},{"id":"220821","messageId":"1371215872-9796-3-git-send-email-artagnon@gmail.com","threadId":"34140","inReplyTo":"1371215872-9796-1-git-send-email-artagnon@gmail.com","subject":"[PATCH 2/3] sh-setup: add new peel_committish() helper","fromName":"Ramkumar Ramachandra","fromEmail":"artagnon@gmail.com","sentAt":"2013-06-14T13:17:51Z","receivedAt":"2013-06-14T13:17:51Z","isPatch":true,"sender":{"key":"r@artagnon.com","avatar":"https://avatars.githubusercontent.com/u/37226?v=4"},"body":"The normal way to check whether a certain revision resolves to a valid\ncommit is:\n\n  $ git rev-parse --verify $REV^0\n\nUnfortunately, this does not work when $REV is of the type :/quuxery.\nWrite a helper to work around this limitation.\n\nSuggested-by: Junio C Hamano <gitster@pobox.com>\nSigned-off-by: Ramkumar Ramachandra <artagnon@gmail.com>\n---\n git-sh-setup.sh | 12 ++++++++++++\n 1 file changed, 12 insertions(+)\n\ndiff --git a/git-sh-setup.sh b/git-sh-setup.sh\nindex 2f78359..7a964ad 100644\n--- a/git-sh-setup.sh\n+++ b/git-sh-setup.sh\n@@ -313,3 +313,15 @@ then\n \t}\n \t: ${GIT_OBJECT_DIRECTORY=\"$GIT_DIR/objects\"}\n fi\n+\n+peel_committish () {\n+\tcase \"$1\" in\n+\t:/*)\n+\t\tpeeltmp=$(git rev-parse --verify \"$1\") &&\n+\t\tgit rev-parse --verify \"${peeltmp}^0\"\n+\t\t;;\n+\t*)\n+\t\tgit rev-parse --verify \"${1}^0\"\n+\t\t;;\n+\tesac\n+}\n-- \n1.8.3.1.381.g12ca056.dirty\n"},{"id":"220822","messageId":"1371215872-9796-4-git-send-email-artagnon@gmail.com","threadId":"34140","inReplyTo":"1371215872-9796-1-git-send-email-artagnon@gmail.com","subject":"[PATCH 3/3] rebase: use peel_committish() where appropriate","fromName":"Ramkumar Ramachandra","fromEmail":"artagnon@gmail.com","sentAt":"2013-06-14T13:17:52Z","receivedAt":"2013-06-14T13:17:52Z","isPatch":true,"sender":{"key":"r@artagnon.com","avatar":"https://avatars.githubusercontent.com/u/37226?v=4"},"body":"The revisions specified on the command-line as <onto> and <upstream>\narguments could be of the form :/quuxery; so, use peel_committish() to\nresolve them.  The failing tests in t/rebase and t/rebase-interactive\nnow pass.\n\nSigned-off-by: Ramkumar Ramachandra <artagnon@gmail.com>\n---\n git-rebase.sh                 | 4 ++--\n t/t3400-rebase.sh             | 2 +-\n t/t3404-rebase-interactive.sh | 2 +-\n 3 files changed, 4 insertions(+), 4 deletions(-)\n\ndiff --git a/git-rebase.sh b/git-rebase.sh\nindex d0c11a9..6987b9b 100755\n--- a/git-rebase.sh\n+++ b/git-rebase.sh\n@@ -434,7 +434,7 @@ then\n \t\tshift\n \t\t;;\n \tesac\n-\tupstream=`git rev-parse --verify \"${upstream_name}^0\"` ||\n+\tupstream=$(peel_committish \"${upstream_name}\") ||\n \tdie \"$(eval_gettext \"invalid upstream \\$upstream_name\")\"\n \tupstream_arg=\"$upstream_name\"\n else\n@@ -470,7 +470,7 @@ case \"$onto_name\" in\n \tfi\n \t;;\n *)\n-\tonto=$(git rev-parse --verify \"${onto_name}^0\") ||\n+\tonto=$(peel_committish \"$onto_name\") ||\n \tdie \"$(eval_gettext \"Does not point to a valid commit: \\$onto_name\")\"\n \t;;\n esac\ndiff --git a/t/t3400-rebase.sh b/t/t3400-rebase.sh\nindex 81ec517..cbca71e 100755\n--- a/t/t3400-rebase.sh\n+++ b/t/t3400-rebase.sh\n@@ -88,7 +88,7 @@ test_expect_success 'rebase fast-forward to master' '\n \ttest_i18ngrep \"Fast-forwarded HEAD to my-topic-branch\" out\n '\n \n-test_expect_failure 'rebase, with <onto> and <upstream> specified as :/quuxery' '\n+test_expect_success 'rebase, with <onto> and <upstream> specified as :/quuxery' '\n \ttest_when_finished \"git branch -D torebase\" &&\n \tgit checkout -b torebase my-topic-branch^ &&\n \tupstream=$(git rev-parse \":/Add B\") &&\ndiff --git a/t/t3404-rebase-interactive.sh b/t/t3404-rebase-interactive.sh\nindex eb241f5..86917d1 100755\n--- a/t/t3404-rebase-interactive.sh\n+++ b/t/t3404-rebase-interactive.sh\n@@ -947,7 +947,7 @@ test_expect_success 'rebase -i respects core.commentchar' '\n \ttest B = $(git cat-file commit HEAD^ | sed -ne \\$p)\n '\n \n-test_expect_failure 'rebase -i, with <onto> and <upstream> specified as :/quuxery' '\n+test_expect_success 'rebase -i, with <onto> and <upstream> specified as :/quuxery' '\n \ttest_when_finished \"git branch -D torebase\" &&\n \tgit checkout -b torebase branch1 &&\n \tupstream=$(git rev-parse \":/J\") &&\n-- \n1.8.3.1.381.g12ca056.dirty\n"},{"id":"220884","messageId":"59954A85BB7C4B279B61C46CC1D81CCA@PhilipOakley","threadId":"34140","inReplyTo":"1371215872-9796-3-git-send-email-artagnon@gmail.com","subject":"Re: [PATCH 2/3] sh-setup: add new peel_committish() helper","fromName":"Philip Oakley","fromEmail":"philipoakley@iee.org","sentAt":"2013-06-14T16:05:03Z","receivedAt":"2013-06-14T16:05:03Z","isPatch":true,"sender":{"key":"philipoakley@iee.email","avatar":"https://avatars.githubusercontent.com/u/914343?v=4"},"body":"From: \"Ramkumar Ramachandra\" <artagnon@gmail.com>\nSent: Friday, June 14, 2013 2:17 PM\n> The normal way to check whether a certain revision resolves to a valid\n> commit is:\n>\n>  $ git rev-parse --verify $REV^0\n>\n> Unfortunately, this does not work when $REV is of the type :/quuxery.\n\nIs there a proper name for this style of revision specification? I've \nbeen letting this 'style' wash over me in the hope that I'd understand \neventually, but it hasn't.\n\nLoking at git-rev-parse I now see that it might be the 'Commit Message \nRegex' rev specifier.\n\nIf re-rolled, can this elucidation be included in the commit message?\n\n> Write a helper to work around this limitation.\n>\n> Suggested-by: Junio C Hamano <gitster@pobox.com>\n> Signed-off-by: Ramkumar Ramachandra <artagnon@gmail.com>\n> ---\n> git-sh-setup.sh | 12 ++++++++++++\n> 1 file changed, 12 insertions(+)\n>\n> diff --git a/git-sh-setup.sh b/git-sh-setup.sh\n> index 2f78359..7a964ad 100644\n> --- a/git-sh-setup.sh\n> +++ b/git-sh-setup.sh\n> @@ -313,3 +313,15 @@ then\n>  }\n>  : ${GIT_OBJECT_DIRECTORY=\"$GIT_DIR/objects\"}\n> fi\n> +\n> +peel_committish () {\n> + case \"$1\" in\n> + :/*)\n> + peeltmp=$(git rev-parse --verify \"$1\") &&\n> + git rev-parse --verify \"${peeltmp}^0\"\n> + ;;\n> + *)\n> + git rev-parse --verify \"${1}^0\"\n> + ;;\n> + esac\n> +}\n> -- \n> 1.8.3.1.381.g12ca056.dirty\n>\n> --\nPhilip \n"},{"id":"220887","messageId":"CALkWK0kCOJTRTQ-eKbOUnD18xWFqMnYi385aN=+_H4CoLZSLhQ@mail.gmail.com","threadId":"34140","inReplyTo":"59954A85BB7C4B279B61C46CC1D81CCA@PhilipOakley","subject":"Re: [PATCH 2/3] sh-setup: add new peel_committish() helper","fromName":"Ramkumar Ramachandra","fromEmail":"artagnon@gmail.com","sentAt":"2013-06-14T16:18:55Z","receivedAt":"2013-06-14T16:18:55Z","isPatch":true,"sender":{"key":"r@artagnon.com","avatar":"https://avatars.githubusercontent.com/u/37226?v=4"},"body":"Philip Oakley wrote:\n> Is there a proper name for this style of revision specification? I've been\n> letting this 'style' wash over me in the hope that I'd understand\n> eventually, but it hasn't.\n\nSee gitrevisions(7).  None of them have any names.\n\n> Loking at git-rev-parse I now see that it might be the 'Commit Message\n> Regex' rev specifier.\n\nDid you just invent that term?  I couldn't find any mentions of it.\n"},{"id":"220890","messageId":"02E12EC628804EACABF52ACDFE2BDCF4@PhilipOakley","threadId":"34140","inReplyTo":"CALkWK0kCOJTRTQ-eKbOUnD18xWFqMnYi385aN=+_H4CoLZSLhQ@mail.gmail.com","subject":"Re: [PATCH 2/3] sh-setup: add new peel_committish() helper","fromName":"Philip Oakley","fromEmail":"philipoakley@iee.org","sentAt":"2013-06-14T16:44:04Z","receivedAt":"2013-06-14T16:44:04Z","isPatch":true,"sender":{"key":"philipoakley@iee.email","avatar":"https://avatars.githubusercontent.com/u/914343?v=4"},"body":"From: \"Ramkumar Ramachandra\" <artagnon@gmail.com>\nSent: Friday, June 14, 2013 5:18 PM\n> Philip Oakley wrote:\n>> Is there a proper name for this style of revision specification? I've \n>> been\n>> letting this 'style' wash over me in the hope that I'd understand\n>> eventually, but it hasn't.\n>\n> See gitrevisions(7).  None of them have any names.\n... which is a shame...\n\n>\n>> Loking at git-rev-parse I now see that it might be the 'Commit \n>> Message\n>> Regex' rev specifier.\n>\n> Did you just invent that term?  I couldn't find any mentions of it.\n\nYep, hence the 'it might be'.   Maybe I missed a word and should have \nwritten 'it might be called' ;-)\n\nIt would be useful to have some descriptive names for these unusual \n(uncommon) methods.\nThere's already the \"pathspec :(glob) syntax\".\n\nPhilip \n"},{"id":"220891","messageId":"7vmwqspr52.fsf@alter.siamese.dyndns.org","threadId":"34140","inReplyTo":"1371215872-9796-4-git-send-email-artagnon@gmail.com","subject":"Re: [PATCH 3/3] rebase: use peel_committish() where appropriate","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2013-06-14T16:56:57Z","receivedAt":"2013-06-14T16:56:57Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Ramkumar Ramachandra <artagnon@gmail.com> writes:\n\n> The revisions specified on the command-line as <onto> and <upstream>\n> arguments could be of the form :/quuxery; so, use peel_committish() to\n> resolve them.  The failing tests in t/rebase and t/rebase-interactive\n> now pass.\n\nYou can also specify the commit at the end of the history to be\nrebased (very useful while trial runs to see where a series should\napply):\n\n    git rebase foo \":/Add B\"\n\nThis is already handled properly because it first gets turned into\nan object name $orig_head and then we use it (without ^0) to update\nthe ORIG_HEAD.\n\nEven after this patch, there is\n\n\tgit checkout -q \"$onto^0\"\n\nwhen detaching the HEAD to that commit.  Can that peeling be dropped\nnow (I am not suggesting to drop it in this patch)?\n\nWhat would happen when you are given \"--onto :/f...o\" is somewhat\ninteresting, but that may be a separate topic, I think.  At that\npoint, it is probably in the realm of \"don't do it then\" ;-)\n\n> Signed-off-by: Ramkumar Ramachandra <artagnon@gmail.com>\n> ---\n>  git-rebase.sh                 | 4 ++--\n>  t/t3400-rebase.sh             | 2 +-\n>  t/t3404-rebase-interactive.sh | 2 +-\n>  3 files changed, 4 insertions(+), 4 deletions(-)\n>\n> diff --git a/git-rebase.sh b/git-rebase.sh\n> index d0c11a9..6987b9b 100755\n> --- a/git-rebase.sh\n> +++ b/git-rebase.sh\n> @@ -434,7 +434,7 @@ then\n>  \t\tshift\n>  \t\t;;\n>  \tesac\n> -\tupstream=`git rev-parse --verify \"${upstream_name}^0\"` ||\n> +\tupstream=$(peel_committish \"${upstream_name}\") ||\n>  \tdie \"$(eval_gettext \"invalid upstream \\$upstream_name\")\"\n>  \tupstream_arg=\"$upstream_name\"\n>  else\n> @@ -470,7 +470,7 @@ case \"$onto_name\" in\n>  \tfi\n>  \t;;\n>  *)\n> -\tonto=$(git rev-parse --verify \"${onto_name}^0\") ||\n> +\tonto=$(peel_committish \"$onto_name\") ||\n>  \tdie \"$(eval_gettext \"Does not point to a valid commit: \\$onto_name\")\"\n>  \t;;\n>  esac\n> diff --git a/t/t3400-rebase.sh b/t/t3400-rebase.sh\n> index 81ec517..cbca71e 100755\n> --- a/t/t3400-rebase.sh\n> +++ b/t/t3400-rebase.sh\n> @@ -88,7 +88,7 @@ test_expect_success 'rebase fast-forward to master' '\n>  \ttest_i18ngrep \"Fast-forwarded HEAD to my-topic-branch\" out\n>  '\n>  \n> -test_expect_failure 'rebase, with <onto> and <upstream> specified as :/quuxery' '\n> +test_expect_success 'rebase, with <onto> and <upstream> specified as :/quuxery' '\n>  \ttest_when_finished \"git branch -D torebase\" &&\n>  \tgit checkout -b torebase my-topic-branch^ &&\n>  \tupstream=$(git rev-parse \":/Add B\") &&\n> diff --git a/t/t3404-rebase-interactive.sh b/t/t3404-rebase-interactive.sh\n> index eb241f5..86917d1 100755\n> --- a/t/t3404-rebase-interactive.sh\n> +++ b/t/t3404-rebase-interactive.sh\n> @@ -947,7 +947,7 @@ test_expect_success 'rebase -i respects core.commentchar' '\n>  \ttest B = $(git cat-file commit HEAD^ | sed -ne \\$p)\n>  '\n>  \n> -test_expect_failure 'rebase -i, with <onto> and <upstream> specified as :/quuxery' '\n> +test_expect_success 'rebase -i, with <onto> and <upstream> specified as :/quuxery' '\n>  \ttest_when_finished \"git branch -D torebase\" &&\n>  \tgit checkout -b torebase branch1 &&\n>  \tupstream=$(git rev-parse \":/J\") &&\n"},{"id":"220948","messageId":"CALkWK0k5jgafQa6b5=_d2vTT1zzdc4rCgzuoFhOCA1Xtm8v19w@mail.gmail.com","threadId":"34140","inReplyTo":"7vmwqspr52.fsf@alter.siamese.dyndns.org","subject":"Re: [PATCH 3/3] rebase: use peel_committish() where appropriate","fromName":"Ramkumar Ramachandra","fromEmail":"artagnon@gmail.com","sentAt":"2013-06-15T13:47:37Z","receivedAt":"2013-06-15T13:47:37Z","isPatch":true,"sender":{"key":"r@artagnon.com","avatar":"https://avatars.githubusercontent.com/u/37226?v=4"},"body":"Junio C Hamano wrote:\n> You can also specify the commit at the end of the history to be\n> rebased (very useful while trial runs to see where a series should\n> apply):\n>\n>     git rebase foo \":/Add B\"\n>\n> This is already handled properly because it first gets turned into\n> an object name $orig_head and then we use it (without ^0) to update\n> the ORIG_HEAD.\n\nCorrect, but what sense does it make unless <branch> is a ref to update?\n\n  $ git rebase master :/v1.8.1\n  First, rewinding head to replay your work on top of it...\n  Fast-forwarded :/v1.8.1 to master.\n\nHuh?  The message is wrong, and no end-user can figure out what happened.\n\n> Even after this patch, there is\n>\n>         git checkout -q \"$onto^0\"\n>\n> when detaching the HEAD to that commit.  Can that peeling be dropped\n> now (I am not suggesting to drop it in this patch)?\n\nYeah, that can be dropped.\n\n> What would happen when you are given \"--onto :/f...o\" is somewhat\n> interesting, but that may be a separate topic, I think.  At that\n> point, it is probably in the realm of \"don't do it then\" ;-)\n\nThe utility of this very series can be questioned.  I've rarely wanted\nto use the :/fommery with rebase, so this mostly an exercise in\n\"theoretical correctness\" (something I usually stay away from).\n"},{"id":"221025","messageId":"7vy5a9ih32.fsf@alter.siamese.dyndns.org","threadId":"34140","inReplyTo":"CALkWK0k5jgafQa6b5=_d2vTT1zzdc4rCgzuoFhOCA1Xtm8v19w@mail.gmail.com","subject":"Re: [PATCH 3/3] rebase: use peel_committish() where appropriate","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2013-06-17T02:52:49Z","receivedAt":"2013-06-17T02:52:49Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Ramkumar Ramachandra <artagnon@gmail.com> writes:\n\n> Junio C Hamano wrote:\n>> You can also specify the commit at the end of the history to be\n>> rebased (very useful while trial runs to see where a series should\n>> apply):\n>>\n>>     git rebase foo \":/Add B\"\n>>\n>> This is already handled properly because it first gets turned into\n>> an object name $orig_head and then we use it (without ^0) to update\n>> the ORIG_HEAD.\n>\n> Correct, but what sense does it make unless <branch> is a ref to update?\n\nIt often is necessary, after applying a patch series that was\nprepared against commit that is unnecessarily new (e.g. a bugfix\nthat should apply to 'maint' prepared against 'next'), to see if the\nresult rebases on older codebase.  Giving a commit (not branch) to\nthe command to force rebasing the commit on a detached HEAD is a\nvery handy technique to do so without damaging the original branch.\n\n    $ git checkout mater^0\n    $ git am -s mbox\n    Applying A\n    Applying B\n    Applying C\n    $ git rebase --onto maint master \":/B\"\n\nwould see if the earlier two commits that are pure bugfix cleanly\napplies to 'maint' (and then I can rebuild the topic by forking a\nbranch from 'maint', queue A and B, and if C is not needed for that\nfix, fork another from that point, possibly merge 'master' to it and\nthen queue C).\n\n>> What would happen when you are given \"--onto :/f...o\" is somewhat\n>> interesting, but that may be a separate topic, I think.  At that\n>> point, it is probably in the realm of \"don't do it then\" ;-)\n>\n> The utility of this very series can be questioned.  I've rarely wanted\n> to use the :/fommery with rebase, so this mostly an exercise in\n> \"theoretical correctness\" (something I usually stay away from).\n\nWe are saying the same thing: \"don't do it then\".\n"}]}