diff hgext3rd/topic/__init__.py @ 2900:1928e9c802dd

convertbookmark: add logic to skip revisions with multiple bookmarks When a user tries to converts a bookmark to topic which is on a changeset with more bookmarks we skip that.
author Pulkit Goyal <7895pulkit@gmail.com>
date Mon, 14 Aug 2017 14:36:11 +0530
parents 32306ee32806
children 610d06bcd714
line wrap: on
line diff
--- a/hgext3rd/topic/__init__.py	Fri Sep 01 18:02:50 2017 +0200
+++ b/hgext3rd/topic/__init__.py	Mon Aug 14 14:36:11 2017 +0530
@@ -460,12 +460,29 @@
     bmstore = repo._bookmarks
     lock = wlock = tr = None
 
+    nodetobook = {}
+    for book, revnode in bmstore.iteritems():
+        if nodetobook.get(revnode):
+            nodetobook[revnode].append(book)
+        else:
+            nodetobook[revnode] = [book]
+
+    # a list of nodes which we have skipped so that we don't print the skip
+    # warning repeatedly
+    skipped = []
+
     if bookmark:
         try:
             node = bmstore[bookmark]
         except KeyError:
             raise error.Abort(_("no such bookmark exists: '%s'") % bookmark)
 
+        if len(nodetobook[node]) > 1:
+            revnum = repo[node].rev()
+            ui.status(_("skipping revision '%d' as it has multiple bookmarks "
+                      "on it\n") % revnum)
+            return
+
         revnum = repo[node].rev()
         try:
             wlock = repo.wlock()
@@ -485,9 +502,17 @@
             lock = repo.lock()
             tr = repo.transaction('debugconvertbookmark')
             for bmark, revnode in sorted(storecopy.iteritems()):
+                revnum = repo[revnode].rev()
+                if revnum in skipped:
+                    continue
+                if len(nodetobook[revnode]) > 1:
+                    ui.status(_("skipping '%d' as it has multiple bookmarks on"
+                              " it\n") % revnum)
+                    skipped.append(revnum)
+                    continue
                 if bmark == '@':
                     continue
-                _convertbmarktopic(ui, repo, repo[revnode].rev(), bmark, tr)
+                _convertbmarktopic(ui, repo, revnum, bmark, tr)
             tr.close()
         finally:
             lockmod.release(tr, lock, wlock)