git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH] am: handle stray $dotest directory case

From
Junio C Hamano <gitster@pobox.com>
Date
Jun 13, 2013, 18:40 UTC
Message-ID
<7vmwqtua5r.fsf@alter.siamese.dyndns.org>
In-Reply-To
<CALkWK0mUnNTfJQuGQAoMtnsOXvXU+z+W6D_MMuio1sq4vkucjA@mail.gmail.com>
Ramkumar Ramachandra <artagnon@gmail.com> writes:
Show 11 quoted lines
> Junio C Hamano wrote:
>> Perhaps _that_ guarding condition is what needs
>> to be fixed, by reverting it back to just "does $dotest exist?"
>>
>> Adding a single case workaround smells like a band-aid to me.
>
> Like I pointed out earlier, the original codepath is not equipped to
> handle this case.  A "normal" git am --abort runs:
>
>   git read-tree --reset -u HEAD ORIG_HEAD
>   git reset ORIG_HEAD
Hmph, when did ORIG_HEAD set, and what commit does it point at?

As "git am" reading from stdin, waiting, hasn't moved HEAD yet at all, I think two things need to happen to fix that:

 (1) at around the call to check_patch_format and split_patches,
     clear ORIG_HEAD (this may have to be done only !$rebasing,
     though).
 (2) safe_to_abort() should make sure ORIG_HEAD exists; otherwise it
     is unsafe.

But that is entirely an independent issue (I am going to agree with you in the end).

Show 11 quoted lines
> blowing away the top commit in the scenario you outlined.
>
> This happens because that codepath incorrectly believes that an am is
> "in progress".  What this means is that it believes that some of the
> am code actually got executed in the previous run, setting ORIG_HEAD
> etc.  In your scenario
>
>   % git am
>   ^C
>
> nothing is executed, and a stray directory is left behind.

That is a correct observation. But it needed a bit of thinking to reach your conclusion that special casing this and handling --abort in a new different codepath is the right solution.

Show 7 quoted lines
> If anything, I think the check for $dotest/{next,last} has made the
> code more robust by correctly verifying that some code did get
> executed, and that an am is indeed in progress.  The bug you have
> outlined is equivalent to:
>
>   % mkdir .git/rebase-apply
>   % git am --abort

Yes. Or a previous "git am" run lost "$dotest/last" by a bug and then the user asked to "am --abort". Either case, the best you can do is probably to blow away .git/rebase-apply directory.

How would "am --skip", "am --resolved", or "am anothermbox" behave in this "we already have $dotest because the user started one session but killed it" case, which used to be covered by -d $dotest alone but now flows to the other side of the if/else/fi codepath? Do they need a similar treatment, or would they naturally error out as they should?

Previous: Ramkumar RamachandraNext: Ramkumar Ramachandra
Message 4 of 6 in “am: handle stray $dotest directory case”
  1. am: handle stray $dotest directory caseRamkumar Ramachandra, Jun 13, 2013
  2. Junio C HamanoJun 13, 2013
  3. Ramkumar RamachandraJun 13, 2013
  4. Junio C HamanoJun 13, 2013
  5. Ramkumar RamachandraJun 13, 2013
  6. Junio C HamanoJun 13, 2013

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.