hgext/convert/monotone.py
changeset 8099 3cdf4872941a
parent 8050 087cc65bebff
child 8100 233f11b544f5
child 8101 d8229670710f
equal deleted inserted replaced
8081:6c3b8132078e 8099:3cdf4872941a
   106                 value = value.replace(r'\"', '"')
   106                 value = value.replace(r'\"', '"')
   107                 value = value.replace(r'\\', '\\')
   107                 value = value.replace(r'\\', '\\')
   108                 certs[name] = value
   108                 certs[name] = value
   109         return certs
   109         return certs
   110 
   110 
   111     def mtnrenamefiles(self, files, fromdir, todir):
       
   112         renamed = {}
       
   113         for tofile in files:
       
   114             if tofile.startswith(todir + '/'):
       
   115                 renamed[tofile] = fromdir + tofile[len(todir):]
       
   116         return renamed
       
   117 
       
   118     # implement the converter_source interface:
   111     # implement the converter_source interface:
   119 
   112 
   120     def getheads(self):
   113     def getheads(self):
   121         if not self.rev:
   114         if not self.rev:
   122             return self.mtnrun("leaves").splitlines()
   115             return self.mtnrun("leaves").splitlines()
   125 
   118 
   126     def getchanges(self, rev):
   119     def getchanges(self, rev):
   127         #revision = self.mtncmd("get_revision %s" % rev).split("\n\n")
   120         #revision = self.mtncmd("get_revision %s" % rev).split("\n\n")
   128         revision = self.mtnrun("get_revision", rev).split("\n\n")
   121         revision = self.mtnrun("get_revision", rev).split("\n\n")
   129         files = {}
   122         files = {}
       
   123         addedfiles = {}
       
   124         renameddirs = []
   130         copies = {}
   125         copies = {}
   131         for e in revision:
   126         for e in revision:
   132             m = self.add_file_re.match(e)
   127             m = self.add_file_re.match(e)
   133             if m:
   128             if m:
   134                 files[m.group(1)] = rev
   129                 files[m.group(1)] = rev
       
   130                 addedfiles[m.group(1)] = rev
   135             m = self.patch_re.match(e)
   131             m = self.patch_re.match(e)
   136             if m:
   132             if m:
   137                 files[m.group(1)] = rev
   133                 files[m.group(1)] = rev
   138 
       
   139             # Delete/rename is handled later when the convert engine
   134             # Delete/rename is handled later when the convert engine
   140             # discovers an IOError exception from getfile,
   135             # discovers an IOError exception from getfile,
   141             # but only if we add the "from" file to the list of changes.
   136             # but only if we add the "from" file to the list of changes.
   142             m = self.delete_re.match(e)
   137             m = self.delete_re.match(e)
   143             if m:
   138             if m:
   148                 fromname = m.group(1)
   143                 fromname = m.group(1)
   149                 if self.mtnisfile(toname, rev):
   144                 if self.mtnisfile(toname, rev):
   150                     copies[toname] = fromname
   145                     copies[toname] = fromname
   151                     files[toname] = rev
   146                     files[toname] = rev
   152                     files[fromname] = rev
   147                     files[fromname] = rev
   153                 if self.mtnisdir(toname, rev):
   148                 elif self.mtnisdir(toname, rev):
   154                     renamed = self.mtnrenamefiles(self.files, fromname, toname)
   149                     renameddirs.append((fromname, toname))
   155                     for tofile, fromfile in renamed.items():
   150 
   156                         self.ui.debug (_("copying file in renamed dir from '%s' to '%s'") % (fromfile, tofile), '\n')
   151         # Directory renames can be handled only once we have recorded
   157                         files[tofile] = rev
   152         # all new files
   158                         copies[tofile] = fromfile
   153         for fromdir, todir in renameddirs:
   159                     for fromfile in renamed.values():
   154             renamed = {}
   160                         files[fromfile] = rev
   155             for tofile in self.files:
       
   156                 if tofile in addedfiles:
       
   157                     continue
       
   158                 if tofile.startswith(todir + '/'):
       
   159                     renamed[tofile] = fromdir + tofile[len(todir):]
       
   160             for tofile, fromfile in renamed.items():
       
   161                 self.ui.debug (_("copying file in renamed dir from '%s' to '%s'") 
       
   162                                % (fromfile, tofile), '\n')
       
   163                 files[tofile] = rev
       
   164                 copies[tofile] = fromfile
       
   165             for fromfile in renamed.values():
       
   166                 files[fromfile] = rev
       
   167 
   161         return (files.items(), copies)
   168         return (files.items(), copies)
   162 
   169 
   163     def getmode(self, name, rev):
   170     def getmode(self, name, rev):
   164         self.mtnloadmanifest(rev)
   171         self.mtnloadmanifest(rev)
   165         try:
   172         try: