[PATCH 2 of 2 v3] evolve: lock the working copy early in next and prev (issue5244)

Pierre-Yves David pierre-yves.david at ens-lyon.org
Sun Oct 16 14:31:52 EDT 2016



On 10/16/2016 06:53 PM, Simon Farnsworth wrote:
> # HG changeset patch
> # User Simon Farnsworth <simonfar at fb.com>
> # Date 1476636773 25200
> #      Sun Oct 16 09:52:53 2016 -0700
> # Node ID 778468237ecf195c4eb1d87bc4f7b5d30e538c63
> # Parent  ee284d7c5faa5d9f17853f51c17883844b985c58
> evolve: lock the working copy early in next and prev (issue5244)
>
> Both next and prev depend on a consistent working copy, but were waiting to
> take the lock until they were ready to alter the working copy.
>
> Take the lock before reading the working copy state, and do not release it
> until we're definitely not going to change the working copy.

These are pushed on stable, thanks (the fake-editor hack is a bit ugly, 
but lets move forward).

> diff --git a/hgext/evolve.py b/hgext/evolve.py
> --- a/hgext/evolve.py
> +++ b/hgext/evolve.py
> @@ -2213,10 +2213,13 @@
>      """update to parent revision
>
>      Displays the summary line of the destination for clarity."""
> -    if True:
> +    wlock = None
> +    dryrunopt = opts['dry_run']
> +    if not dryrunopt:
> +        wlock = repo.wlock()
> +    try:
>          wkctx = repo[None]
>          wparents = wkctx.parents()
> -        dryrunopt = opts['dry_run']
>          if len(wparents) != 1:
>              raise error.Abort('merge in progress')
>          if not opts['merge']:
> @@ -2246,7 +2249,6 @@
>                  ret = hg.update(repo, p.rev())
>                  if not ret:
>                      tr = lock = None
> -                    wlock = repo.wlock()
>                      try:
>                          lock = repo.lock()
>                          tr = repo.transaction('previous')
> @@ -2257,7 +2259,8 @@
>                              bmdeactivate(repo)
>                          tr.close()
>                      finally:
> -                        lockmod.release(tr, lock, wlock)
> +                        lockmod.release(tr, lock)
> +
>              displayer.show(p)
>              return 0
>          else:
> @@ -2265,6 +2268,8 @@
>                  displayer.show(p)
>              ui.warn(_('multiple parents, explicitly update to one\n'))
>              return 1
> +    finally:
> +        lockmod.release(wlock)
>
>  @command('^next',
>           [('B', 'move-bookmark', False,
> @@ -2282,10 +2287,13 @@
>
>      Displays the summary line of the destination for clarity.
>      """
> -    if True:
> +    wlock = None
> +    dryrunopt = opts['dry_run']
> +    if not dryrunopt:
> +        wlock = repo.wlock()
> +    try:
>          wkctx = repo[None]
>          wparents = wkctx.parents()
> -        dryrunopt = opts['dry_run']
>          if len(wparents) != 1:
>              raise error.Abort('merge in progress')
>          if not opts['merge']:
> @@ -2315,7 +2323,6 @@
>                  ret = hg.update(repo, c.rev())
>                  if not ret:
>                      lock = tr = None
> -                    wlock = repo.wlock()
>                      try:
>                          lock = repo.lock()
>                          tr = repo.transaction('next')
> @@ -2326,7 +2333,7 @@
>                              bmdeactivate(repo)
>                          tr.close()
>                      finally:
> -                        lockmod.release(tr, lock, wlock)
> +                        lockmod.release(tr, lock)
>              displayer.show(c)
>              result = 0
>          elif children:
> @@ -2368,6 +2375,8 @@
>                  return result
>              return 1
>          return result
> +    finally:
> +        lockmod.release(wlock)
>
>  def _reachablefrombookmark(repo, revs, bookmarks):
>      """filter revisions and bookmarks reachable from the given bookmark
> diff --git a/tests/fake-editor.sh b/tests/fake-editor.sh
> new file mode 100755
> --- /dev/null
> +++ b/tests/fake-editor.sh
> @@ -0,0 +1,3 @@
> +#!/bin/sh
> +sleep 5
> +echo "new desc" >> $1
> diff --git a/tests/test-prev-next.t b/tests/test-prev-next.t
> --- a/tests/test-prev-next.t
> +++ b/tests/test-prev-next.t
> @@ -206,3 +206,34 @@
>    move:[5] added d
>    atop:[6] added b (3)
>    working directory is now at 47ea25be8aea
> +
> +prev and next should lock properly against other commands
> +
> +  $ hg init repo
> +  $ cd repo
> +  $ HGEDITOR=${TESTDIR}/fake-editor.sh
> +  $ echo hi > foo
> +  $ hg ci -Am 'one'
> +  adding foo
> +  $ echo bye > foo
> +  $ hg ci -Am 'two'
> +
> +  $ hg amend --edit &
> +  $ sleep 1
> +  $ hg prev
> +  waiting for lock on working directory of $TESTTMP/repo held by process '*' on host '*' (glob)
> +  got lock after [4-6] seconds (re)
> +  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
> +  [0] one
> +  $ wait
> +
> +  $ hg amend --edit &
> +  $ sleep 1
> +  $ hg next --evolve
> +  waiting for lock on working directory of $TESTTMP/repo held by process '*' on host '*' (glob)
> +  1 new unstable changesets
> +  got lock after [4-6] seconds (re)
> +  move:[2] two
> +  atop:[3] one
> +  working directory now at a7d885c75614
> +  $ wait
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at mercurial-scm.org
> https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel
>

-- 
Pierre-Yves David


More information about the Mercurial-devel mailing list