hgext/convert/subversion.py
changeset 8884 8b603c7c808e
parent 8883 ede2247e61aa
child 8885 2c184bd2b37a
equal deleted inserted replaced
8883:ede2247e61aa 8884:8b603c7c808e
   642                 self.ui.debug(_("copied to %s from %s@%s\n") %
   642                 self.ui.debug(_("copied to %s from %s@%s\n") %
   643                               (entrypath, copyfrom_path, ent.copyfrom_rev))
   643                               (entrypath, copyfrom_path, ent.copyfrom_rev))
   644                 copies[self.recode(entry)] = self.recode(copyfrom_path)
   644                 copies[self.recode(entry)] = self.recode(copyfrom_path)
   645             elif kind == 0: # gone, but had better be a deleted *file*
   645             elif kind == 0: # gone, but had better be a deleted *file*
   646                 self.ui.debug(_("gone from %s\n") % ent.copyfrom_rev)
   646                 self.ui.debug(_("gone from %s\n") % ent.copyfrom_rev)
   647 
   647                 pmodule, prevnum = self.revsplit(parents[0])[1:]
   648                 # if a branch is created but entries are removed in
   648                 parentpath = pmodule + "/" + entrypath
   649                 # the same changeset, get the right fromrev
   649                 self.ui.debug(_("entry %s\n") % parentpath)
   650                 # parents cannot be empty here, you cannot remove
       
   651                 # things from a root revision.
       
   652                 uuid, old_module, fromrev = self.revsplit(parents[0])
       
   653 
       
   654                 basepath = old_module + "/" + self.getrelpath(path)
       
   655                 entrypath = basepath
       
   656 
       
   657                 def lookup_parts(p):
       
   658                     rc = None
       
   659                     parts = p.split("/")
       
   660                     for i in range(len(parts)):
       
   661                         part = "/".join(parts[:i])
       
   662                         info = part, copyfrom.get(part, None)
       
   663                         if info[1] is not None:
       
   664                             self.ui.debug(_("found parent directory %s\n") % info[1])
       
   665                             rc = info
       
   666                     return rc
       
   667 
       
   668                 self.ui.debug(_("base, entry %s %s\n") % (basepath, entrypath))
       
   669 
       
   670                 frompath, froment = lookup_parts(entrypath) or (None, revnum - 1)
       
   671 
       
   672                 # need to remove fragment from lookup_parts and
       
   673                 # replace with copyfrom_path
       
   674                 if frompath is not None:
       
   675                     self.ui.debug(_("munge-o-matic\n"))
       
   676                     self.ui.debug(entrypath + '\n')
       
   677                     self.ui.debug(entrypath[len(frompath):] + '\n')
       
   678                     entrypath = froment.copyfrom_path + entrypath[len(frompath):]
       
   679                     fromrev = froment.copyfrom_rev
       
   680                     self.ui.debug(_("info: %s %s %s %s\n") % (frompath, froment, ent, entrypath))
       
   681 
   650 
   682                 # We can avoid the reparent calls if the module has
   651                 # We can avoid the reparent calls if the module has
   683                 # not changed but it probably does not worth the pain.
   652                 # not changed but it probably does not worth the pain.
   684                 prevmodule = self.reparent('')
   653                 prevmodule = self.reparent('')
   685                 fromkind = svn.ra.check_path(self.ra, entrypath.strip('/'), fromrev)
   654                 fromkind = svn.ra.check_path(self.ra, parentpath.strip('/'), prevnum)
   686                 self.reparent(prevmodule)
   655                 self.reparent(prevmodule)
   687 
   656 
   688                 if fromkind == svn.core.svn_node_file:
   657                 if fromkind == svn.core.svn_node_file:
   689                     entries.append(self.recode(entry))
   658                     entries.append(self.recode(entry))
   690                 elif fromkind == svn.core.svn_node_dir:
   659                 elif fromkind == svn.core.svn_node_dir:
   691                     # Sometimes this is tricky. For example: in The
       
   692                     # Subversion Repository revision 6940 a dir was
       
   693                     # copied and one of its files was deleted from the
       
   694                     # new location in the same commit. This code can't
       
   695                     # deal with that yet.
       
   696                     if ent.action == 'C':
   660                     if ent.action == 'C':
   697                         children = self._find_children(path, fromrev)
   661                         children = self._find_children(path, prevnum)
   698                     else:
   662                     else:
   699                         oroot = entrypath.strip('/')
   663                         oroot = parentpath.strip('/')
   700                         nroot = path.strip('/')
   664                         nroot = path.strip('/')
   701                         children = self._find_children(oroot, fromrev)
   665                         children = self._find_children(oroot, prevnum)
   702                         children = [s.replace(oroot,nroot) for s in children]
   666                         children = [s.replace(oroot,nroot) for s in children]
   703 
   667 
   704                     for child in children:
   668                     for child in children:
   705                         entrypath = self.getrelpath("/" + child, old_module)
   669                         childpath = self.getrelpath("/" + child, pmodule)
   706                         if not entrypath:
   670                         if not childpath:
   707                             continue
   671                             continue
   708                         if entrypath in copies:
   672                         if childpath in copies:
   709                             del copies[entrypath]
   673                             del copies[childpath]
   710                         entries.append(entrypath)
   674                         entries.append(childpath)
   711                 else:
   675                 else:
   712                     self.ui.debug(_('unknown path in revision %d: %s\n') % \
   676                     self.ui.debug(_('unknown path in revision %d: %s\n') % \
   713                                   (revnum, path))
   677                                   (revnum, path))
   714             elif kind == svn.core.svn_node_dir:
   678             elif kind == svn.core.svn_node_dir:
   715                 # If the directory just had a prop change,
   679                 # If the directory just had a prop change,