Skip to content
Snippets Groups Projects
Commit c8a97fa742b7 authored by Katsunori FUJIWARA's avatar Katsunori FUJIWARA
Browse files

rebase: use dirstateguard instead of dirstate.invalidate

Before this patch, "rebase.concludenode()" uses "dirstate.invalidate()"
as a kind of "restore .hg/dirstate to the original status" during a failure.

But it just discards changes in memory, and doesn't actually restore
".hg/dirstate". Then, it can't work as expected, if "dirstate.write()"
is executed while processing.

This patch uses "dirstateguard" instead of "dirstate.invalidate()" to
restore ".hg/dirstate" during a failure even if "dirstate.write()" is
executed before a failure.

This patch also removes "beginparentchage()" and "endparentchange()",
because "dirstateguard" makes them useless.

This is a part of preparations to fix the issue that the recent (in
memory) dirstate isn't visible to external processes (e.g. "precommit"
hook).

After this patch, the changed dirstate becomes visible to external
"precommit" hooks during "hg rebase" in "test-largefiles-misc.t",
because "dirstateguard()" writes it out. But this content isn't yet
correct, because:

  - "normal3" should be marked as "A"(dded) at committing

    It is newly added in the changeset being rebased.

  - but it is marked as "M"(odified)

    The result of "repo.setparents()" after "dirstateguard()" isn't
    yet written out before "precommit". So, merging is still in
    progress for "hg status" in it.

    This causes marking the file newly added on "other" branch as "A".

This will be fixed by subsequent patch.
parent 12f3c7144a39
No related branches found
No related tags found
No related merge requests found
......@@ -530,4 +530,5 @@
'''Commit the wd changes with parents p1 and p2. Reuse commit info from rev
but also store useful information in extra.
Return node of committed revision.'''
dsguard = cmdutil.dirstateguard(repo, 'rebase')
try:
......@@ -533,3 +534,2 @@
try:
repo.dirstate.beginparentchange()
repo.setparents(repo[p1].node(), repo[p2].node())
......@@ -535,5 +535,4 @@
repo.setparents(repo[p1].node(), repo[p2].node())
repo.dirstate.endparentchange()
ctx = repo[rev]
if commitmsg is None:
commitmsg = ctx.description()
......@@ -552,4 +551,5 @@
repo.ui.restoreconfig(backup)
repo.dirstate.setbranch(repo[newnode].branch())
dsguard.close()
return newnode
......@@ -555,8 +555,6 @@
return newnode
except util.Abort:
# Invalidate the previous setparents
repo.dirstate.invalidate()
raise
finally:
release(dsguard)
def rebasenode(repo, rev, p1, base, state, collapse, target):
'Rebase a single revision rev on top of p1 using base as merge ancestor'
......
......@@ -1017,7 +1017,7 @@
$ hg -R no-largefiles -q pull --rebase
Invoking status precommit hook
? normal3
M normal3
(test reverting)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment