converbookmark: split target computation from actual update
authorPierre-Yves David <pierre-yves.david@octobus.net>
Fri, 01 Sep 2017 18:33:08 +0200
changeset 2907 d617128279f6
parent 2906 92566275be77
child 2908 95bb27b8918c
converbookmark: split target computation from actual update This will allow for further refactoring helping consistency.
hgext3rd/topic/__init__.py
--- a/hgext3rd/topic/__init__.py	Fri Sep 01 17:09:17 2017 +0200
+++ b/hgext3rd/topic/__init__.py	Fri Sep 01 18:33:08 2017 +0200
@@ -488,7 +488,8 @@
             wlock = repo.wlock()
             lock = repo.lock()
             tr = repo.transaction('debugconvertbookmark')
-            _convertbmarktopic(ui, repo, revnum, bookmark, tr)
+            targetrevs = _findconvertbmarktopic(repo, bookmark)
+            _applyconvertbmarktopic(ui, repo, targetrevs, revnum, bookmark, tr)
             tr.close()
         finally:
             lockmod.release(tr, lock, wlock)
@@ -512,7 +513,8 @@
                     continue
                 if bmark == '@':
                     continue
-                _convertbmarktopic(ui, repo, revnum, bmark, tr)
+                targetrevs = _findconvertbmarktopic(repo, bmark)
+                _applyconvertbmarktopic(ui, repo, targetrevs, revnum, bmark, tr)
             tr.close()
         finally:
             lockmod.release(tr, lock, wlock)
@@ -534,15 +536,23 @@
 )
 """
 
-def _convertbmarktopic(ui, repo, rev, bmark, tr):
-    """Sets a topic as same as bname to all the changesets under the bookmark
+def _findconvertbmarktopic(repo, bmark):
+    """find revisions unambigiously defined by a bookmark
+
+    find all changesets under the bookmark and under that bookmark only.
+    """
+    return repo.revs(CONVERTBOOKREVSET, bmark, bmark, bmark)
+
+def _applyconvertbmarktopic(ui, repo, revs, old, bmark, tr):
+    """apply bookmark convertion to topic
+
+    Sets a topic as same as bname to all the changesets under the bookmark
     and delete the bookmark, if topic is set to any changeset
 
-    rev is the revision on which bookmark bmark is and tr is transaction object.
+    old is the revision on which bookmark bmark is and tr is transaction object.
     """
 
-    touchedrevs = repo.revs(CONVERTBOOKREVSET, bmark, bmark, bmark)
-    rewrote = _changetopics(ui, repo, touchedrevs, bmark)
+    rewrote = _changetopics(ui, repo, revs, bmark)
     # We didn't changed topic to any changesets because the revset
     # returned an empty set of revisions, so let's skip deleting the
     # bookmark corresponding to which we didn't put a topic on any
@@ -551,7 +561,7 @@
         return
     ui.status(_('changed topic to "%s" on %d revisions\n') % (bmark,
               rewrote))
-    ui.debug('removing bookmark "%s" from "%d"' % (bmark, rev))
+    ui.debug('removing bookmark "%s" from "%d"' % (bmark, old))
     bookmarks.delete(repo, tr, [bmark])
 
 def _changecurrenttopic(repo, newtopic):