diff --git a/mercurial/subrepo.py b/mercurial/subrepo.py --- a/mercurial/subrepo.py +++ b/mercurial/subrepo.py @@ -715,13 +715,24 @@ class svnsubrepo(abstractsubrepo): return True def basestate(self): - return self._wcrev() + lastrev, rev = self._wcrevs() + if lastrev != rev: + # Last committed rev is not the same than rev. We would + # like to take lastrev but we do not know if the subrepo + # URL exists at lastrev. Test it and fallback to rev it + # is not there. + try: + self._svncommand(['info', '%s@%s' % (self._state[0], lastrev)]) + return lastrev + except error.Abort: + pass + return rev def commit(self, text, user, date): # user and date are out of our hands since svn is centralized changed, extchanged, missing = self._wcchanged() if not changed: - return self._wcrev() + return self.basestate() if extchanged: # Do not try to commit externals raise util.Abort(_('cannot commit svn externals')) diff --git a/tests/test-subrepo-svn.t b/tests/test-subrepo-svn.t --- a/tests/test-subrepo-svn.t +++ b/tests/test-subrepo-svn.t @@ -564,3 +564,42 @@ traceback $ hg forget 'notafile*' notafile*: No such file or directory [1] + +Test a subrepo referencing a just moved svn path. Last commit rev will +be different from the revision, and the path will be different as +well. + + $ cd $WCROOT + $ svn up > /dev/null + $ mkdir trunk/subdir branches + $ echo a > trunk/subdir/a + $ svn add trunk/subdir branches + A trunk/subdir + A trunk/subdir/a + A branches + $ svn ci -m addsubdir + Adding branches + Adding trunk/subdir + Adding trunk/subdir/a + Transmitting file data . + Committed revision 14. + $ svn cp -m branchtrunk $SVNREPO/trunk $SVNREPO/branches/somebranch + + Committed revision 15. + $ cd .. + + $ hg init repo2 + $ cd repo2 + $ svn co $SVNREPO/branches/somebranch/subdir + A subdir/a + Checked out revision 15. + $ echo "subdir = [svn] $SVNREPO/branches/somebranch/subdir" > .hgsub + $ hg add .hgsub + $ hg ci -m addsub + $ hg up null + 0 files updated, 0 files merged, 2 files removed, 0 files unresolved + $ hg up + A *subdir/a (glob) + Checked out revision 15. + 2 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ cd ..