contrib/mtn2git: Ignore unknown certs, try to be more robust against CTRL-C when...
authorHolger Freyther <zecke@selfish.org>
Mon, 7 Jan 2008 17:53:19 +0000 (17:53 +0000)
committerHolger Freyther <zecke@selfish.org>
Mon, 7 Jan 2008 17:53:19 +0000 (17:53 +0000)
contrib/mtn2git/mtn2git.py
contrib/mtn2git/status.py

index cda4f39..a23e757 100755 (executable)
@@ -519,7 +519,7 @@ def parse_revision(operations, revision):
                 revision_description["committer"] = cert[1]
         else:
             print >> sys.stderr, "Unknown Cert: Ignoring", cert[5], cert[7]
-            assert(False)
+            #assert(False)
 
     return revision_description
                 
@@ -565,24 +565,37 @@ def main(mtn_cli, db, rev):
     ops.automate.stop()
 
     all_revs = []
+    branch_heads = {}
     for branch in branches:
         heads = [head for head in ops.heads(branch)]
+        if len(heads) != 1:
+            print >> sys.stderr, "Skipping branch '%s' due multiple heads" % (branch)
+            continue
+
         if branch in status.former_heads:
             old_heads = status.former_heads[branch]
         else:
             old_heads = []
 
         for head in heads:
+            print >> sys.stderr, old_heads, head
             all_revs += ops.ancestry_difference(head, old_heads)
-        status.former_heads[branch] = heads
+            for rev in all_revs:
+                if not rev in branch_heads:
+                    branch_heads[rev] = []
+                branch_heads[rev].append(branch)
+
     
     sorted_revs = [rev for rev in ops.toposort(all_revs)]
     for rev in sorted_revs:
         if has_mark(rev):
-            print >> sys.stderr, "Already having commit '%s'" % rev
+            print >> sys.stderr, "B: Already having commit '%s'" % rev
         else:
             print >> sys.stderr, "Going to import revision ", rev
             fast_import(ops, parse_revision(ops, rev))
+        branches = branch_heads[rev]
+        for branch in branches:
+            status.former_heads[branch] = [rev]
         
 
 if __name__ == "__main__":
index 47d06b5..bd83f85 100644 (file)
@@ -20,7 +20,7 @@
   THE SOFTWARE.
 """
 
-import pickle
+import os, pickle
 
 marks = {}
 last_mark = 0
@@ -39,9 +39,16 @@ def load(status_name):
 
 def store(status_name):
     global marks, last_mark, mark_file, former_heads, same_revisions
-    file = open(status_name, "wb")
+    file = open("%s.tmp-foo" % status_name, "wb")
     pickle.dump(marks, file)
     pickle.dump(last_mark, file)
     pickle.dump(former_heads, file)
     pickle.dump(same_revisions, file)
     file.close()
+
+    # Almost atomic rename, without the risk to destroy something
+    try:
+        os.remove(status_name)
+    except:
+        pass
+    os.rename("%s.tmp-foo" % status_name, status_name)