Mercurial > hg
diff hgext/convert/subversion.py @ 11128:a9b427b5821e stable
convert/svn: handle files/links replaced by dirs (issue2166)
author | Patrick Mezard <pmezard@gmail.com> |
---|---|
date | Sun, 09 May 2010 19:11:02 +0200 |
parents | ab575114ddd8 |
children | e81966e88e80 6798536454e6 |
line wrap: on
line diff
--- a/hgext/convert/subversion.py Sun May 09 19:11:02 2010 +0200 +++ b/hgext/convert/subversion.py Sun May 09 19:11:02 2010 +0200 @@ -645,14 +645,7 @@ self.ui.debug("gone from %s\n" % ent.copyfrom_rev) pmodule, prevnum = self.revsplit(parents[0])[1:] parentpath = pmodule + "/" + entrypath - self.ui.debug("entry %s\n" % parentpath) - - # We can avoid the reparent calls if the module has - # not changed but it probably does not worth the pain. - prevmodule = self.reparent('') - fromkind = svn.ra.check_path(self.ra, parentpath.strip('/'), - prevnum) - self.reparent(prevmodule) + fromkind = self._checkpath(entrypath, prevnum, pmodule) if fromkind == svn.core.svn_node_file: removed.add(self.recode(entrypath)) @@ -668,11 +661,18 @@ else: self.ui.debug('unknown path in revision %d: %s\n' % \ (revnum, path)) - elif kind == svn.core.svn_node_dir: - # If the directory just had a prop change, - # then we shouldn't need to look for its children. + elif kind == svn.core.svn_node_dir: if ent.action == 'M': + # If the directory just had a prop change, + # then we shouldn't need to look for its children. continue + elif ent.action == 'R' and parents: + # If a directory is replacing a file, mark the previous + # file as deleted + pmodule, prevnum = self.revsplit(parents[0])[1:] + pkind = self._checkpath(entrypath, prevnum, pmodule) + if pkind == svn.core.svn_node_file: + removed.add(self.recode(entrypath)) children = sorted(self._find_children(path, revnum)) for child in children: @@ -898,11 +898,18 @@ self.ui.debug('%r is not under %r, ignoring\n' % (path, module)) return None - def _checkpath(self, path, revnum): - # ra.check_path does not like leading slashes very much, it leads - # to PROPFIND subversion errors - return svn.ra.check_path(self.ra, path.strip('/'), revnum) - + def _checkpath(self, path, revnum, module=None): + if module is not None: + prevmodule = self.reparent('') + path = module + '/' + path + try: + # ra.check_path does not like leading slashes very much, it leads + # to PROPFIND subversion errors + return svn.ra.check_path(self.ra, path.strip('/'), revnum) + finally: + if module is not None: + self.reparent(prevmodule) + def _getlog(self, paths, start, end, limit=0, discover_changed_paths=True, strict_node_history=False): # Normalize path names, svn >= 1.5 only wants paths relative to