--- monotone.py.orig	2011-11-28 21:13:58.000000000 +0800
+++ monotone.py	2011-11-28 21:14:55.000000000 +0800
@@ -224,62 +224,30 @@ class monotone_source(converter_source, 
         else:
             return [self.rev]
 
+    def manifest_files(self, rev):
+        manifest = self.mtnrun("get_manifest_of", rev).split("\n\n")
+
+        filenames = []
+        for l in manifest:
+            m = self.file_re.match(l)
+            if not m:
+                continue
+            name = m.group(1)
+            filenames.append(name)
+        return filenames
+
     def getchanges(self, rev):
-        #revision = self.mtncmd("get_revision %s" % rev).split("\n\n")
-        revision = self.mtnrun("get_revision", rev).split("\n\n")
-        files = {}
-        ignoremove = {}
-        renameddirs = []
-        copies = {}
-        for e in revision:
-            m = self.add_file_re.match(e)
-            if m:
-                files[m.group(1)] = rev
-                ignoremove[m.group(1)] = rev
-            m = self.patch_re.match(e)
-            if m:
-                files[m.group(1)] = rev
-            # Delete/rename is handled later when the convert engine
-            # discovers an IOError exception from getfile,
-            # but only if we add the "from" file to the list of changes.
-            m = self.delete_re.match(e)
-            if m:
-                files[m.group(1)] = rev
-            m = self.rename_re.match(e)
-            if m:
-                toname = m.group(2)
-                fromname = m.group(1)
-                if self.mtnisfile(toname, rev):
-                    ignoremove[toname] = 1
-                    copies[toname] = fromname
-                    files[toname] = rev
-                    files[fromname] = rev
-                elif self.mtnisdir(toname, rev):
-                    renameddirs.append((fromname, toname))
-
-        # Directory renames can be handled only once we have recorded
-        # all new files
-        for fromdir, todir in renameddirs:
-            renamed = {}
-            for tofile in self.files:
-                if tofile in ignoremove:
-                    continue
-                if tofile.startswith(todir + '/'):
-                    renamed[tofile] = fromdir + tofile[len(todir):]
-                    # Avoid chained moves like:
-                    # d1(/a) => d3/d1(/a)
-                    # d2 => d3
-                    ignoremove[tofile] = 1
-            for tofile, fromfile in renamed.items():
-                self.ui.debug (_("copying file in renamed directory "
-                                 "from '%s' to '%s'")
-                               % (fromfile, tofile), '\n')
-                files[tofile] = rev
-                copies[tofile] = fromfile
-            for fromfile in renamed.values():
-                files[fromfile] = rev
+        files = []
+
+        fns = self.manifest_files(rev)
+        files.extend((f, rev) for f in fns)
+
+        parents=self.mtnrun("parents", rev).splitlines()
+        for p in parents:
+            fns = self.manifest_files(p)
+            files.extend((f, rev) for f in fns)
 
-        return (files.items(), copies)
+        return files, {}
 
     def getfile(self, name, rev):
         if not self.mtnisfile(name, rev):
