[PATCH 1 of 3 V2] subrepo: allow a representation of the working directory subrepo

Matt Harbison mharbison72 at gmail.com
Tue Jun 16 22:39:22 CDT 2015

# HG changeset patch
# User Matt Harbison <matt_harbison at yahoo.com>
# Date 1434510216 14400
#      Tue Jun 16 23:03:36 2015 -0400
# Node ID ba8fc81a1f23ec0d763aa59f78745d06bb648be2
# Parent  f1d46075b13a90671c14b2737b1d4f07a3fa1a4a
subrepo: allow a representation of the working directory subrepo

Some code cannot handle a subrepo based on the working directory (e.g.
sub.dirty()), so the caller must opt in.  This will be useful for archive, and
perhaps some other commands.  The git and svn methods where this is used may
need to be fixed up on a case by case basis.

diff --git a/mercurial/context.py b/mercurial/context.py
--- a/mercurial/context.py
+++ b/mercurial/context.py
@@ -249,11 +249,18 @@
             return ''
     def sub(self, path):
+        '''return a subrepo for the stored revision of path, never wdir()'''
         return subrepo.subrepo(self, path)
     def nullsub(self, path, pctx):
         return subrepo.nullsubrepo(self, path, pctx)
+    def workingsub(self, path):
+        '''return a subrepo for the stored revision, or wdir if this is a wdir
+        context.
+        '''
+        return subrepo.subrepo(self, path, True)
     def match(self, pats=[], include=None, exclude=None, default='glob',
               listsubrepos=False, badfn=None):
         r = self._repo
diff --git a/mercurial/subrepo.py b/mercurial/subrepo.py
--- a/mercurial/subrepo.py
+++ b/mercurial/subrepo.py
@@ -324,7 +324,7 @@
                           "in '%s'\n") % vfs.join(dirname))
                 vfs.unlink(vfs.reljoin(dirname, f))
-def subrepo(ctx, path):
+def subrepo(ctx, path, allowwdir=False):
     """return instance of the right subrepo class for subrepo in path"""
     # subrepo inherently violates our import layering rules
     # because it wants to make repo objects from deep inside the stack
@@ -338,6 +338,8 @@
     state = ctx.substate[path]
     if state[2] not in types:
         raise util.Abort(_('unknown subrepo type %s') % state[2])
+    if allowwdir:
+        state = (state[0], ctx.subrev(path), state[2])
     return types[state[2]](ctx, path, state[:2])
 def nullsubrepo(ctx, path, pctx):

More information about the Mercurial-devel mailing list