hgext/convert/monotone.py
changeset 8127 17ab4dab50a6
parent 8102 18710802cd49
parent 8125 da9f3866c637
child 8250 1b60efdb8bc5
equal deleted inserted replaced
8122:fa6fdea19909 8127:17ab4dab50a6
   111                 name, value = m.groups()
   111                 name, value = m.groups()
   112                 value = value.replace(r'\"', '"')
   112                 value = value.replace(r'\"', '"')
   113                 value = value.replace(r'\\', '\\')
   113                 value = value.replace(r'\\', '\\')
   114                 certs[name] = value
   114                 certs[name] = value
   115         # Monotone may have subsecond dates: 2005-02-05T09:39:12.364306
   115         # Monotone may have subsecond dates: 2005-02-05T09:39:12.364306
   116         certs["date"] = certs["date"].split('.')[0]
   116         # and all times are stored in UTC
       
   117         certs["date"] = certs["date"].split('.')[0] + " UTC"
   117         return certs
   118         return certs
   118 
   119 
   119     # implement the converter_source interface:
   120     # implement the converter_source interface:
   120 
   121 
   121     def getheads(self):
   122     def getheads(self):
   126 
   127 
   127     def getchanges(self, rev):
   128     def getchanges(self, rev):
   128         #revision = self.mtncmd("get_revision %s" % rev).split("\n\n")
   129         #revision = self.mtncmd("get_revision %s" % rev).split("\n\n")
   129         revision = self.mtnrun("get_revision", rev).split("\n\n")
   130         revision = self.mtnrun("get_revision", rev).split("\n\n")
   130         files = {}
   131         files = {}
   131         addedfiles = {}
   132         ignoremove = {}
   132         renameddirs = []
   133         renameddirs = []
   133         copies = {}
   134         copies = {}
   134         for e in revision:
   135         for e in revision:
   135             m = self.add_file_re.match(e)
   136             m = self.add_file_re.match(e)
   136             if m:
   137             if m:
   137                 files[m.group(1)] = rev
   138                 files[m.group(1)] = rev
   138                 addedfiles[m.group(1)] = rev
   139                 ignoremove[m.group(1)] = rev
   139             m = self.patch_re.match(e)
   140             m = self.patch_re.match(e)
   140             if m:
   141             if m:
   141                 files[m.group(1)] = rev
   142                 files[m.group(1)] = rev
   142             # Delete/rename is handled later when the convert engine
   143             # Delete/rename is handled later when the convert engine
   143             # discovers an IOError exception from getfile,
   144             # discovers an IOError exception from getfile,
   148             m = self.rename_re.match(e)
   149             m = self.rename_re.match(e)
   149             if m:
   150             if m:
   150                 toname = m.group(2)
   151                 toname = m.group(2)
   151                 fromname = m.group(1)
   152                 fromname = m.group(1)
   152                 if self.mtnisfile(toname, rev):
   153                 if self.mtnisfile(toname, rev):
       
   154                     ignoremove[toname] = 1
   153                     copies[toname] = fromname
   155                     copies[toname] = fromname
   154                     files[toname] = rev
   156                     files[toname] = rev
   155                     files[fromname] = rev
   157                     files[fromname] = rev
   156                 elif self.mtnisdir(toname, rev):
   158                 elif self.mtnisdir(toname, rev):
   157                     renameddirs.append((fromname, toname))
   159                     renameddirs.append((fromname, toname))
   159         # Directory renames can be handled only once we have recorded
   161         # Directory renames can be handled only once we have recorded
   160         # all new files
   162         # all new files
   161         for fromdir, todir in renameddirs:
   163         for fromdir, todir in renameddirs:
   162             renamed = {}
   164             renamed = {}
   163             for tofile in self.files:
   165             for tofile in self.files:
   164                 if tofile in addedfiles:
   166                 if tofile in ignoremove:
   165                     continue
   167                     continue
   166                 if tofile.startswith(todir + '/'):
   168                 if tofile.startswith(todir + '/'):
   167                     renamed[tofile] = fromdir + tofile[len(todir):]
   169                     renamed[tofile] = fromdir + tofile[len(todir):]
       
   170                     # Avoid chained moves like:
       
   171                     # d1(/a) => d3/d1(/a)
       
   172                     # d2 => d3
       
   173                     ignoremove[tofile] = 1
   168             for tofile, fromfile in renamed.items():
   174             for tofile, fromfile in renamed.items():
   169                 self.ui.debug (_("copying file in renamed directory "
   175                 self.ui.debug (_("copying file in renamed directory "
   170                                  "from '%s' to '%s'")
   176                                  "from '%s' to '%s'")
   171                                % (fromfile, tofile), '\n')
   177                                % (fromfile, tofile), '\n')
   172                 files[tofile] = rev
   178                 files[tofile] = rev