[PATCH] revert: process subrepos before the local repo

Matt Mackall mpm at selenic.com
Fri Mar 27 13:48:04 CDT 2015


On Thu, 2015-03-26 at 23:30 -0400, Matt Harbison wrote:
> # HG changeset patch
> # User Matt Harbison <matt_harbison at yahoo.com>
> # Date 1427423049 14400
> #      Thu Mar 26 22:24:09 2015 -0400
> # Node ID 910503083e4a0f49e71b9b392913990e00b63f3c
> # Parent  30ddc3cf76df464f7b4ad38eb49e4d1f49457f01
> revert: process subrepos before the local repo
> 
> The initial match variable 'm', built from the 'pats' passed to the method, is
> replaced part way through the method.  But when the 'pats' list is replaced by
> a matcher in an upcoming patch, that will need to be narrowed and passed to the
> subrepo.  Rather than breaking naming conventions, move the subrepo processing
> to before the replacement, and revert from bottom up.

I was thinking of something more like this:

diff -r 95cbc77c0cad mercurial/cmdutil.py
--- a/mercurial/cmdutil.py	Wed Mar 25 15:53:30 2015 -0700
+++ b/mercurial/cmdutil.py	Fri Mar 27 13:37:15 2015 -0500
@@ -2811,6 +2811,10 @@
         interactive = opts.get('interactive', False)
         wctx = repo[None]
         m = scmutil.match(wctx, pats, opts)
+
+        # we'll need this later
+        targetsubs = sorted(s for s in wctx.substate if m(s))
+
         if not m.always():
             m.bad = lambda x, y: False
             for abs in repo.walk(m):
@@ -3048,10 +3052,6 @@
             _revertprefetch(repo, ctx, *[actions[name][0] for name in needdata])
             _performrevert(repo, parents, ctx, actions, interactive)
 
-        # get the list of subrepos that must be reverted
-        subrepomatch = scmutil.match(wctx, pats, opts)
-        targetsubs = sorted(s for s in wctx.substate if subrepomatch(s))
-
         if targetsubs:
             # Revert the subrepos on the revert list
             for sub in targetsubs:

I'm not clear if there's something gained in your approach?

> The additional '.hgsub not found' message is because the .hgsub file used to be
> reverted before the subrepo list was built.  So maybe there is merit to
> reverting from top down?  OTOH, reverting .hgsub to some revision where the
> subrepo didn't exist before processing subrepos will prevent that subrepo from
> being reverted.  If we are reverting based on the working directory, we probably
> need to stick with it for better or worse.
> 
> The other two .hgsub related messages in the area are from:
>    1) The repo.walk() under 'not always()'
>    2) repo.status(), just below that
> 
> Shouldn't the @propertycache on basectx.substate() cache the result of
> subrepo.state(), so that it is only read once from disk, and therefore the
> message is only displayed once?
> 
> diff --git a/mercurial/cmdutil.py b/mercurial/cmdutil.py
> --- a/mercurial/cmdutil.py
> +++ b/mercurial/cmdutil.py
> @@ -2813,6 +2813,20 @@
>  
>          wctx = repo[None]
>          m = scmutil.match(wctx, pats, opts)
> +
> +        # get the list of subrepos that must be reverted
> +        subrepomatch = m
> +        targetsubs = sorted(s for s in wctx.substate if subrepomatch(s))
> +
> +        if targetsubs:
> +            # Revert the subrepos on the revert list
> +            for sub in targetsubs:
> +                try:
> +                    wctx.sub(sub).revert(ctx.substate[sub], *pats, **opts)
> +                except KeyError:
> +                    raise util.Abort("subrepository '%s' does not exist in %s!"
> +                                      % (sub, short(ctx.node())))
> +
>          if not m.always():
>              m.bad = lambda x, y: False
>              for abs in repo.walk(m):
> @@ -3047,19 +3061,6 @@
>              _revertprefetch(repo, ctx, *[actions[name][0] for name in needdata])
>              interactive = opts.get('interactive', False)
>              _performrevert(repo, parents, ctx, actions, interactive)
> -
> -        # get the list of subrepos that must be reverted
> -        subrepomatch = scmutil.match(wctx, pats, opts)
> -        targetsubs = sorted(s for s in wctx.substate if subrepomatch(s))
> -
> -        if targetsubs:
> -            # Revert the subrepos on the revert list
> -            for sub in targetsubs:
> -                try:
> -                    wctx.sub(sub).revert(ctx.substate[sub], *pats, **opts)
> -                except KeyError:
> -                    raise util.Abort("subrepository '%s' does not exist in %s!"
> -                                      % (sub, short(ctx.node())))
>      finally:
>          wlock.release()
>  
> diff --git a/tests/test-largefiles-misc.t b/tests/test-largefiles-misc.t
> --- a/tests/test-largefiles-misc.t
> +++ b/tests/test-largefiles-misc.t
> @@ -1035,9 +1035,9 @@
>    M large
>    M no-largefiles/normal1
>    $ hg -R subrepo-root revert --all
> -  reverting subrepo-root/.hglf/large (glob)
>    reverting subrepo no-largefiles
>    reverting subrepo-root/no-largefiles/normal1 (glob)
> +  reverting subrepo-root/.hglf/large (glob)
>  
>    $ cd ..
>  
> diff --git a/tests/test-subrepo-missing.t b/tests/test-subrepo-missing.t
> --- a/tests/test-subrepo-missing.t
> +++ b/tests/test-subrepo-missing.t
> @@ -34,6 +34,7 @@
>    $ hg revert .hgsub
>    warning: subrepo spec file .hgsub not found
>    warning: subrepo spec file .hgsub not found
> +  warning: subrepo spec file .hgsub not found
>  
>  delete .hgsubstate and revert it
>  
> diff --git a/tests/test-subrepo.t b/tests/test-subrepo.t
> --- a/tests/test-subrepo.t
> +++ b/tests/test-subrepo.t
> @@ -914,8 +914,8 @@
>    $ rm repo/s/b
>    $ touch -t 200001010000 repo/.hgsubstate
>    $ hg -R repo revert --all
> +  reverting subrepo s
>    reverting repo/.hgsubstate (glob)
> -  reverting subrepo s
>    $ hg -R repo update
>    1 files updated, 0 files merged, 0 files removed, 0 files unresolved
>    $ cat repo/s/b
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at selenic.com
> http://selenic.com/mailman/listinfo/mercurial-devel

-- 
Mathematics is the supreme nostalgia of our time.




More information about the Mercurial-devel mailing list