# HG changeset patch # User Matt Harbison # Date 2015-06-17 03:03:36 # Node ID 70ac1868b70724677673c18385e915867a9f7468 # Parent 695b93a79d171bbcc4ac47b1229918ce809a5d65 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 @@ class basectx(object): 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, allowwdir=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 @@ def _sanitize(ui, vfs, ignore): "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 @@ def subrepo(ctx, path): 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):