diff --git a/mercurial/subrepo.py b/mercurial/subrepo.py --- a/mercurial/subrepo.py +++ b/mercurial/subrepo.py @@ -703,32 +703,31 @@ class hgsubrepo(abstractsubrepo): source, revision, kind = state if revision in self._repo.unfiltered(): return + self._repo._subsource = source + srcurl = _abssource(self._repo) + other = hg.peer(self._repo, {}, srcurl) + if len(self._repo) == 0: + self._repo.ui.status(_('cloning subrepo %s from %s\n') + % (subrelpath(self), srcurl)) + parentrepo = self._repo._subparent + shutil.rmtree(self._repo.path) + other, cloned = hg.clone(self._repo._subparent.baseui, {}, + other, self._repo.root, + update=False) + self._repo = cloned.local() + self._initrepo(parentrepo, source, create=True) + self._cachestorehash(srcurl) else: - self._repo._subsource = source - srcurl = _abssource(self._repo) - other = hg.peer(self._repo, {}, srcurl) - if len(self._repo) == 0: - self._repo.ui.status(_('cloning subrepo %s from %s\n') - % (subrelpath(self), srcurl)) - parentrepo = self._repo._subparent - shutil.rmtree(self._repo.path) - other, cloned = hg.clone(self._repo._subparent.baseui, {}, - other, self._repo.root, - update=False) - self._repo = cloned.local() - self._initrepo(parentrepo, source, create=True) + self._repo.ui.status(_('pulling subrepo %s from %s\n') + % (subrelpath(self), srcurl)) + cleansub = self.storeclean(srcurl) + remotebookmarks = other.listkeys('bookmarks') + self._repo.pull(other) + bookmarks.updatefromremote(self._repo.ui, self._repo, + remotebookmarks, srcurl) + if cleansub: + # keep the repo clean after pull self._cachestorehash(srcurl) - else: - self._repo.ui.status(_('pulling subrepo %s from %s\n') - % (subrelpath(self), srcurl)) - cleansub = self.storeclean(srcurl) - remotebookmarks = other.listkeys('bookmarks') - self._repo.pull(other) - bookmarks.updatefromremote(self._repo.ui, self._repo, - remotebookmarks, srcurl) - if cleansub: - # keep the repo clean after pull - self._cachestorehash(srcurl) @annotatesubrepoerror def get(self, state, overwrite=False):