Patchwork D6127: split: use the new movedirstate() we now have in scmutil

login
register
mail settings
Submitter phabricator
Date March 13, 2019, 6:39 p.m.
Message ID <differential-rev-PHID-DREV-762uzhgr36pvyqp45ic5-req@phab.mercurial-scm.org>
Download mbox | patch
Permalink /patch/39238/
State Superseded
Headers show

Comments

phabricator - March 13, 2019, 6:39 p.m.
martinvonz created this revision.
Herald added a subscriber: mercurial-devel.
Herald added a reviewer: hg-reviewers.

REVISION SUMMARY
  This avoids unnecessarily touching the working copy when splitting the
  parent of the working copy. That also makes the test-removeemptydirs.t
  case invalid, so we can just delete it.

REPOSITORY
  rHG Mercurial

REVISION DETAIL
  https://phab.mercurial-scm.org/D6127

AFFECTED FILES
  hgext/split.py
  tests/test-removeemptydirs.t

CHANGE DETAILS




To: martinvonz, #hg-reviewers
Cc: mercurial-devel
phabricator - March 15, 2019, 1:56 p.m.
pulkit added inline comments.

INLINE COMMENTS

> test-removeemptydirs.t:269
> -
> -Testing `hg split` being run from inside of a directory that was created in the
> -commit being split:

Do we have other tests covering such cases?

This test might be helpful in future for someone changing some behavior around the dirstate handling code.

REPOSITORY
  rHG Mercurial

REVISION DETAIL
  https://phab.mercurial-scm.org/D6127

To: martinvonz, #hg-reviewers
Cc: pulkit, mercurial-devel
phabricator - March 15, 2019, 2:14 p.m.
martinvonz marked an inline comment as done.
martinvonz added inline comments.

INLINE COMMENTS

> pulkit wrote in test-removeemptydirs.t:269
> Do we have other tests covering such cases?
> 
> This test might be helpful in future for someone changing some behavior around the dirstate handling code.

Not for split. It just doesn't happen anymore, because split no longer touches the working directory. We have other tests for removed directories in this file.

REPOSITORY
  rHG Mercurial

REVISION DETAIL
  https://phab.mercurial-scm.org/D6127

To: martinvonz, #hg-reviewers
Cc: pulkit, mercurial-devel

Patch

diff --git a/tests/test-removeemptydirs.t b/tests/test-removeemptydirs.t
--- a/tests/test-removeemptydirs.t
+++ b/tests/test-removeemptydirs.t
@@ -265,91 +265,3 @@ 
   0:d17db4b0303a add bar
 
   $ cd $TESTTMP
-
-Testing `hg split` being run from inside of a directory that was created in the
-commit being split:
-
-  $ hg init hgsplit
-  $ cd hgsplit
-  $ cat >> .hg/hgrc << EOF
-  > [ui]
-  > interactive = 1
-  > [extensions]
-  > split =
-  > EOF
-  $ echo anchor > anchor.txt
-  $ hg ci -qAm anchor
-
-Create a changeset with '/otherfile_in_root' and 'somedir/foo', then try to
-split it.
-  $ echo otherfile > otherfile_in_root
-  $ mkdir somedir
-  $ cd somedir
-  $ echo hi > foo
-  $ hg ci -qAm split_me
-(Note: need to make this file not in this directory, or else the bug doesn't
-reproduce; we're using a separate file due to concerns of portability on
-`echo -e`)
-  $ cat > ../split_commands << EOF
-  > n
-  > y
-  > y
-  > a
-  > EOF
-
-The split succeeds on no-rmcwd platforms, which alters the rest of the tests
-#if rmcwd
-  $ cat ../split_commands | hg split
-  current directory was removed
-  (consider changing to repo root: $TESTTMP/hgsplit)
-  diff --git a/otherfile_in_root b/otherfile_in_root
-  new file mode 100644
-  examine changes to 'otherfile_in_root'? [Ynesfdaq?] n
-  
-  diff --git a/somedir/foo b/somedir/foo
-  new file mode 100644
-  examine changes to 'somedir/foo'? [Ynesfdaq?] y
-  
-  @@ -0,0 +1,1 @@
-  +hi
-  record change 2/2 to 'somedir/foo'? [Ynesfdaq?] y
-  
-  abort: $ENOENT$
-  [255]
-#endif
-
-Let's try that again without the rmdir
-  $ cd $TESTTMP/hgsplit/somedir
-Show that the previous split didn't do anything
-  $ hg log -T '{rev}:{node|short} {desc}\n'
-  1:e26b22a4f0b7 split_me
-  0:7e53273730c0 anchor
-  $ hg status
-  ? split_commands
-Try again
-  $ cat ../split_commands | hg $NO_RM split
-  diff --git a/otherfile_in_root b/otherfile_in_root
-  new file mode 100644
-  examine changes to 'otherfile_in_root'? [Ynesfdaq?] n
-  
-  diff --git a/somedir/foo b/somedir/foo
-  new file mode 100644
-  examine changes to 'somedir/foo'? [Ynesfdaq?] y
-  
-  @@ -0,0 +1,1 @@
-  +hi
-  record change 2/2 to 'somedir/foo'? [Ynesfdaq?] y
-  
-  created new head
-  diff --git a/otherfile_in_root b/otherfile_in_root
-  new file mode 100644
-  examine changes to 'otherfile_in_root'? [Ynesfdaq?] a
-  
-  saved backup bundle to $TESTTMP/hgsplit/.hg/strip-backup/*-split.hg (glob)
-Show that this split did something
-  $ hg log -T '{rev}:{node|short} {desc}\n'
-  2:a440f24fca4f split_me
-  1:c994f20276ab split_me
-  0:7e53273730c0 anchor
-  $ hg status
-  ? split_commands
diff --git a/hgext/split.py b/hgext/split.py
--- a/hgext/split.py
+++ b/hgext/split.py
@@ -134,13 +134,10 @@ 
     committed = [] # [ctx]
 
     # Set working parent to ctx.p1(), and keep working copy as ctx's content
-    # NOTE: if we can have "update without touching working copy" API, the
-    # revert step could be cheaper.
-    hg.clean(repo, ctx.p1().node(), show_stats=False)
-    parents = repo.changelog.parents(ctx.node())
-    ui.pushbuffer()
-    cmdutil.revert(ui, repo, ctx, parents)
-    ui.popbuffer() # discard "reverting ..." messages
+    if ctx.node() != repo.dirstate.p1():
+        hg.clean(repo, ctx.node(), show_stats=False)
+    with repo.dirstate.parentchange():
+        scmutil.movedirstate(repo, ctx.p1())
 
     # Any modified, added, removed, deleted result means split is incomplete
     incomplete = lambda repo: any(repo.status()[:4])