Rev 3071: (Lukáš Lalinský) Add a global write lock for cmd_uncommit (related to #172649) in file:///home/pqm/archives/thelove/bzr/%2Btrunk/

Canonical.com Patch Queue Manager pqm at pqm.ubuntu.com
Mon Dec 3 21:43:16 GMT 2007


At file:///home/pqm/archives/thelove/bzr/%2Btrunk/

------------------------------------------------------------
revno: 3071
revision-id:pqm at pqm.ubuntu.com-20071203214310-467u6waddal0ucuw
parent: pqm at pqm.ubuntu.com-20071203210338-3w0ryakegm0xopp0
parent: john at arbash-meinel.com-20071203195541-zvk2kpnx4e0m9mlg
committer: Canonical.com Patch Queue Manager <pqm at pqm.ubuntu.com>
branch nick: +trunk
timestamp: Mon 2007-12-03 21:43:10 +0000
message:
  (Lukáš Lalinský) Add a global write lock for cmd_uncommit (related to #172649)
modified:
  bzrlib/builtins.py             builtins.py-20050830033751-fc01482b9ca23183
    ------------------------------------------------------------
    revno: 3065.2.2
    revision-id:john at arbash-meinel.com-20071203195541-zvk2kpnx4e0m9mlg
    parent: lalinsky at gmail.com-20071202191200-l0t8rhwq6lt4be67
    committer: John Arbash Meinel <john at arbash-meinel.com>
    branch nick: jam-integration
    timestamp: Mon 2007-12-03 13:55:41 -0600
    message:
      During bzr uncommit, lock the working tree if it is available.
    modified:
      bzrlib/builtins.py             builtins.py-20050830033751-fc01482b9ca23183
    ------------------------------------------------------------
    revno: 3065.2.1
    revision-id:lalinsky at gmail.com-20071202191200-l0t8rhwq6lt4be67
    parent: pqm at pqm.ubuntu.com-20071202151118-zcl7ezt2c7k5rkos
    committer: Lukáš Lalinský <lalinsky at gmail.com>
    branch nick: uncommit
    timestamp: Sun 2007-12-02 20:12:00 +0100
    message:
      Add a global branch write lock to cmd_uncommit and avoid unnecessary Branch.revno calls.
    modified:
      bzrlib/builtins.py             builtins.py-20050830033751-fc01482b9ca23183
=== modified file 'bzrlib/builtins.py'
--- a/bzrlib/builtins.py	2007-11-29 18:41:01 +0000
+++ b/bzrlib/builtins.py	2007-12-03 19:55:41 +0000
@@ -3574,9 +3574,6 @@
     def run(self, location=None,
             dry_run=False, verbose=False,
             revision=None, force=False):
-        from bzrlib.log import log_formatter, show_log
-        from bzrlib.uncommit import uncommit
-
         if location is None:
             location = u'.'
         control, relpath = bzrdir.BzrDir.open_containing(location)
@@ -3587,19 +3584,38 @@
             tree = None
             b = control.open_branch()
 
+        if tree is not None:
+            tree.lock_write()
+        else:
+            b.lock_write()
+        try:
+            return self._run(b, tree, dry_run, verbose, revision, force)
+        finally:
+            if tree is not None:
+                tree.unlock()
+            else:
+                b.unlock()
+
+    def _run(self, b, tree, dry_run, verbose, revision, force):
+        from bzrlib.log import log_formatter, show_log
+        from bzrlib.uncommit import uncommit
+
+        last_revno, last_rev_id = b.last_revision_info()
+
         rev_id = None
         if revision is None:
-            revno = b.revno()
+            revno = last_revno
+            rev_id = last_rev_id
         else:
             # 'bzr uncommit -r 10' actually means uncommit
             # so that the final tree is at revno 10.
             # but bzrlib.uncommit.uncommit() actually uncommits
             # the revisions that are supplied.
             # So we need to offset it by one
-            revno = revision[0].in_history(b).revno+1
+            revno = revision[0].in_history(b).revno + 1
+            if revno <= last_revno:
+                rev_id = b.get_rev_id(revno)
 
-        if revno <= b.revno():
-            rev_id = b.get_rev_id(revno)
         if rev_id is None or _mod_revision.is_null(rev_id):
             self.outf.write('No revisions to uncommit.\n')
             return 1
@@ -3613,7 +3629,7 @@
                  verbose=False,
                  direction='forward',
                  start_revision=revno,
-                 end_revision=b.revno())
+                 end_revision=last_revno)
 
         if dry_run:
             print 'Dry-run, pretending to remove the above revisions.'
@@ -3628,7 +3644,7 @@
                     return 0
 
         uncommit(b, tree=tree, dry_run=dry_run, verbose=verbose,
-                revno=revno)
+                 revno=revno)
 
 
 class cmd_break_lock(Command):




More information about the bazaar-commits mailing list