[MERGE] Remove Branch.get_transaction
Andrew Bennetts
andrew at canonical.com
Mon Mar 26 06:19:58 BST 2007
Hi all,
This bundle removes Branch.get_transaction, which is currently only used to
cache the revision_history. I've written tests for this caching behaviour
(which pass with both the old code and the new), and replaced the caching with a
simple '_revision_history_cache' attribute on Branch.
The transaction infrastructure is fairly complicated, and it's overkill for what
the Branch does with it. Removing it from the Branch API means implementing the
RemoteBranch class in the smart server is easier :)
-Andrew.
-------------- next part --------------
# Bazaar revision bundle v0.9
#
# message:
# Remote Branch.get_transaction and friends.
# committer: Andrew Bennetts <andrew.bennetts at canonical.com>
# date: Mon 2007-03-26 15:11:52.203999996 +1000
=== modified file NEWS
--- NEWS
+++ NEWS
@@ -12,6 +12,12 @@
trees. (We were reading the working inventory too many times).
(John Arbash Meinel)
+ * Remove ``Branch.get_transaction()`` in favour of a simple cache of
+ ``revision_history``. Branch subclasses should override
+ ``_gen_revision_history`` rather than ``revision_history`` to make use of
+ this cache, and call ``_clear_revision_history_cache`` and
+ ``_cache_revision_history`` at appropriate times.
+
BUGFIXES:
* Take smtp_server from user config into account.
=== modified file bzrlib/branch.py
--- bzrlib/branch.py
+++ bzrlib/branch.py
@@ -98,6 +98,7 @@
def __init__(self, *ignored, **ignored_too):
self.tags = self._make_tags()
+ self._revision_history_cache = None
def break_lock(self):
"""Break a lock if one is present from another instance.
@@ -310,9 +311,56 @@
def set_revision_history(self, rev_history):
raise NotImplementedError(self.set_revision_history)
+ def _cache_revision_history(self, rev_history):
+ """Set the cached revision history to rev_history.
+
+ The revision_history method will use this cache to avoid regenerating
+ the revision history.
+
+ This API is semi-public; it only for use by subclasses, all other code
+ should consider it to be private.
+ """
+ self._revision_history_cache = rev_history
+
+ def _clear_revision_history_cache(self):
+ """Clear the cached revision history to rev_history.
+
+ This means the next call to revision_history will need to call
+ _gen_revision_history.
+
+ This API is semi-public; it only for use by subclasses, all other code
+ should consider it to be private.
+ """
+ self._revision_history_cache = None
+
+ def _gen_revision_history(self):
+ """Return sequence of revision hashes on to this branch.
+
+ Unlike revision_history, this method always regenerates or rereads the
+ revision history, i.e. it does not cache the result, so repeated calls
+ may be expensive.
+
+ This is intended to be overridden by concrete subclasses, rather than
+ overriding revision_history, so that subclasses do not need to deal with
+ caching logic.
+
+ This API is semi-public; it only for use by subclasses, all other code
+ should consider it to be private.
+ """
+ raise NotImplementedError(self._gen_revision_history)
+
+ @needs_read_lock
def revision_history(self):
- """Return sequence of revision hashes on to this branch."""
- raise NotImplementedError(self.revision_history)
+ """Return sequence of revision hashes on to this branch.
+
+ This method will cache the revision history for as long as it is safe to
+ do so.
+ """
+ if self._revision_history_cache is not None:
+ return self._revision_history_cache
+ history = self._gen_revision_history()
+ self._cache_revision_history(history)
+ return list(history)
def revno(self):
"""Return current revision number for this branch.
@@ -1252,29 +1300,6 @@
base = property(_get_base, doc="The URL for the root of this branch.")
- def _finish_transaction(self):
- """Exit the current transaction."""
- return self.control_files._finish_transaction()
-
- def get_transaction(self):
- """Return the current active transaction.
-
- If no transaction is active, this returns a passthrough object
- for which all data is immediately flushed and no caching happens.
- """
- # this is an explicit function so that we can do tricky stuff
- # when the storage in rev_storage is elsewhere.
- # we probably need to hook the two 'lock a location' and
- # 'have a transaction' together more delicately, so that
- # we can have two locks (branch and storage) and one transaction
- # ... and finishing the transaction unlocks both, but unlocking
- # does not. - RBC 20051121
- return self.control_files.get_transaction()
-
- def _set_transaction(self, transaction):
- """Set a new active transaction."""
- return self.control_files._set_transaction(transaction)
-
def abspath(self, name):
"""See Branch.abspath."""
return self.control_files._transport.abspath(name)
@@ -1326,6 +1351,9 @@
self.control_files.unlock()
finally:
self.repository.unlock()
+ if not self.control_files.is_locked():
+ # we just released the lock
+ self._clear_revision_history_cache()
def peek_lock_mode(self):
if self.control_files._lock_count == 0:
@@ -1365,19 +1393,7 @@
"""See Branch.set_revision_history."""
rev_history = [osutils.safe_revision_id(r) for r in rev_history]
self._write_revision_history(rev_history)
- transaction = self.get_transaction()
- history = transaction.map.find_revision_history()
- if history is not None:
- # update the revision history in the identity map.
- history[:] = list(rev_history)
- # this call is disabled because revision_history is
- # not really an object yet, and the transaction is for objects.
- # transaction.register_dirty(history)
- else:
- transaction.map.add_revision_history(rev_history)
- # this call is disabled because revision_history is
- # not really an object yet, and the transaction is for objects.
- # transaction.register_clean(history)
+ self._cache_revision_history(rev_history)
for hook in Branch.hooks['set_rh']:
hook(self, rev_history)
@@ -1395,21 +1411,6 @@
history.pop()
return history
- @needs_read_lock
- def revision_history(self):
- """See Branch.revision_history."""
- transaction = self.get_transaction()
- history = transaction.map.find_revision_history()
- if history is not None:
- # mutter("cache hit for revision-history in %s", self)
- return list(history)
- history = self._gen_revision_history()
- transaction.map.add_revision_history(history)
- # this call is disabled because revision_history is
- # not really an object yet, and the transaction is for objects.
- # transaction.register_clean(history, precious=True)
- return list(history)
-
def _lefthand_history(self, revision_id, last_rev=None,
other_branch=None):
# stop_revision must be a descendant of last_revision
@@ -1928,10 +1929,7 @@
if self._get_append_revisions_only():
self._check_history_violation(revision_id)
self._write_last_revision_info(revno, revision_id)
- transaction = self.get_transaction()
- cached_history = transaction.map.find_revision_history()
- if cached_history is not None:
- transaction.map.remove_object(cached_history)
+ self._clear_revision_history_cache()
def _check_history_violation(self, revision_id):
last_revision = self.last_revision()
=== modified file bzrlib/tests/branch_implementations/test_branch.py
--- bzrlib/tests/branch_implementations/test_branch.py
+++ bzrlib/tests/branch_implementations/test_branch.py
@@ -566,53 +566,124 @@
self.assertEqual(['lw', 'ul'], branch._calls)
-class TestBranchTransaction(TestCaseWithBranch):
-
- def setUp(self):
- super(TestBranchTransaction, self).setUp()
- self.branch = None
-
- def test_default_get_transaction(self):
- """branch.get_transaction on a new branch should give a PassThrough."""
- self.failUnless(isinstance(self.get_branch().get_transaction(),
- transactions.PassThroughTransaction))
-
- def test__set_new_transaction(self):
- self.get_branch()._set_transaction(transactions.ReadOnlyTransaction())
-
- def test__set_over_existing_transaction_raises(self):
- self.get_branch()._set_transaction(transactions.ReadOnlyTransaction())
- self.assertRaises(errors.LockError,
- self.get_branch()._set_transaction,
- transactions.ReadOnlyTransaction())
-
- def test_finish_no_transaction_raises(self):
- self.assertRaises(errors.LockError, self.get_branch()._finish_transaction)
-
- def test_finish_readonly_transaction_works(self):
- self.get_branch()._set_transaction(transactions.ReadOnlyTransaction())
- self.get_branch()._finish_transaction()
- self.assertEqual(None, self.get_branch().control_files._transaction)
-
- def test_unlock_calls_finish(self):
- self.get_branch().lock_read()
- transaction = InstrumentedTransaction()
- self.get_branch().control_files._transaction = transaction
- self.get_branch().unlock()
- self.assertEqual(['finish'], transaction.calls)
-
- def test_lock_read_acquires_ro_transaction(self):
- self.get_branch().lock_read()
- self.failUnless(isinstance(self.get_branch().get_transaction(),
- transactions.ReadOnlyTransaction))
- self.get_branch().unlock()
-
- def test_lock_write_acquires_write_transaction(self):
- self.get_branch().lock_write()
- # cannot use get_transaction as its magic
- self.failUnless(isinstance(self.get_branch().control_files._transaction,
- transactions.WriteTransaction))
- self.get_branch().unlock()
+class TestRevisionHistoryCaching(TestCaseWithBranch):
+ """Tests for the caching of branch revision_history.
+
+ When locked, branches should avoid regenerating or rereading
+ revision_history by caching the last value of it. This is safe because
+ the branch is locked, so nothing can change the revision_history
+ unexpectedly.
+
+ When not locked, obviously the revision_history will need to be regenerated
+ or reread each time.
+
+ We test if revision_history is using the cache by instrumenting the branch's
+ _gen_revision_history method, which is called by Branch.revision_history if
+ the branch does not have a cache of the revision history.
+ """
+
+ def get_instrumented_branch(self):
+ """Get a branch and monkey patch it to log calls to
+ _gen_revision_history.
+
+ :returns: a tuple of (the branch, list that calls will be logged to)
+ """
+ branch = self.get_branch()
+ calls = []
+ real_gen_revision_history = branch._gen_revision_history
+ def fake_gen_revision_history():
+ calls.append('_gen_revision_history')
+ return real_gen_revision_history()
+ branch._gen_revision_history = fake_gen_revision_history
+ return branch, calls
+
+ def test_revision_history_when_unlocked(self):
+ """Repeated calls to revision history will call _gen_revision_history
+ each time when the branch is not locked.
+ """
+ branch, calls = self.get_instrumented_branch()
+ # Repeatedly call revision_history.
+ branch.revision_history()
+ branch.revision_history()
+ self.assertEqual(
+ ['_gen_revision_history', '_gen_revision_history'], calls)
+
+ def test_revision_history_when_locked(self):
+ """Repeated calls to revision history will only call
+ _gen_revision_history once while the branch is locked.
+ """
+ branch, calls = self.get_instrumented_branch()
+ # Lock the branch, then repeatedly call revision_history.
+ branch.lock_read()
+ try:
+ branch.revision_history()
+ branch.revision_history()
+ self.assertEqual(['_gen_revision_history'], calls)
+ finally:
+ branch.unlock()
+
+ def test_set_revision_history_when_locked(self):
+ """When the branch is locked, calling set_revision_history should cache
+ the revision history so that a later call to revision_history will not
+ need to call _gen_revision_history.
+ """
+ branch, calls = self.get_instrumented_branch()
+ # Lock the branch, set the revision history, then repeatedly call
+ # revision_history.
+ branch.lock_write()
+ branch.set_revision_history([])
+ try:
+ branch.revision_history()
+ self.assertEqual([], calls)
+ finally:
+ branch.unlock()
+
+ def test_set_revision_history_when_unlocked(self):
+ """When the branch is not locked, calling set_revision_history will not
+ cause the revision history to be cached.
+ """
+ branch, calls = self.get_instrumented_branch()
+ # Lock the branch, set the revision history, then repeatedly call
+ # revision_history.
+ branch.set_revision_history([])
+ branch.revision_history()
+ self.assertEqual(['_gen_revision_history'], calls)
+
+ def test_set_last_revision_info_when_locked(self):
+ """When the branch is locked, calling set_last_revision_info should
+ cache the last revision info so that a later call to last_revision_info
+ will not need the revision_history. Thus the branch will not to call
+ _gen_revision_history in this situation.
+ """
+ a_branch, calls = self.get_instrumented_branch()
+ # Lock the branch, set the last revision info, then call
+ # last_revision_info.
+ a_branch.lock_write()
+ a_branch.set_last_revision_info(0, None)
+ del calls[:]
+ try:
+ a_branch.last_revision_info()
+ self.assertEqual([], calls)
+ finally:
+ a_branch.unlock()
+
+ def test_set_last_revision_info_uncaches_revision_history_for_format6(self):
+ if not isinstance(self.branch_format, branch.BzrBranchFormat6):
+ return
+ a_branch, calls = self.get_instrumented_branch()
+ # Lock the branch, cache the revision history.
+ a_branch.lock_write()
+ a_branch.revision_history()
+ # Set the last revision info, clearing the cache.
+ a_branch.set_last_revision_info(0, None)
+ del calls[:]
+ try:
+ a_branch.revision_history()
+ self.assertEqual(['_gen_revision_history'], calls)
+ finally:
+ a_branch.unlock()
+
+
class TestBranchPushLocations(TestCaseWithBranch):
=== modified directory // last-changed:andrew.bennetts at canonical.com-200703260
... 51152-1q3ntmsj2b4dv9k5
# revision id: andrew.bennetts at canonical.com-20070326051152-1q3ntmsj2b4dv9k5
# sha1: 8b9df0ac1d6a2a831a179cf846817fc098473473
# inventory sha1: d46f7d3d2f4033924887d09ed50677fd3e5d48ed
# parent ids:
# andrew.bennetts at canonical.com-20070326045509-mdnlny5ge3sevuns
# base id: pqm at pqm.ubuntu.com-20070324001115-e8868e5d82612556
# properties:
# branch-nick: remove-branch-transaction
# message:
# Don't use Branch.get_transaction to cache revision history.
# committer: Andrew Bennetts <andrew.bennetts at canonical.com>
# date: Mon 2007-03-26 14:55:09.631000042 +1000
=== modified file bzrlib/branch.py // encoding:base64
LS0tIGJ6cmxpYi9icmFuY2gucHkKKysrIGJ6cmxpYi9icmFuY2gucHkKQEAgLTk4LDYgKzk4LDcg
QEAKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqaWdub3JlZCwgKippZ25vcmVkX3Rvbyk6CiAg
ICAgICAgIHNlbGYudGFncyA9IHNlbGYuX21ha2VfdGFncygpCisgICAgICAgIHNlbGYuX3Jldmlz
aW9uX2hpc3RvcnlfY2FjaGUgPSBOb25lCiAKICAgICBkZWYgYnJlYWtfbG9jayhzZWxmKToKICAg
ICAgICAgIiIiQnJlYWsgYSBsb2NrIGlmIG9uZSBpcyBwcmVzZW50IGZyb20gYW5vdGhlciBpbnN0
YW5jZS4KQEAgLTMxMCw5ICszMTEsNTYgQEAKICAgICBkZWYgc2V0X3JldmlzaW9uX2hpc3Rvcnko
c2VsZiwgcmV2X2hpc3RvcnkpOgogICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKHNl
bGYuc2V0X3JldmlzaW9uX2hpc3RvcnkpCiAKKyAgICBkZWYgX2NhY2hlX3JldmlzaW9uX2hpc3Rv
cnkoc2VsZiwgcmV2X2hpc3RvcnkpOgorICAgICAgICAiIiJTZXQgdGhlIGNhY2hlZCByZXZpc2lv
biBoaXN0b3J5IHRvIHJldl9oaXN0b3J5LgorCisgICAgICAgIFRoZSByZXZpc2lvbl9oaXN0b3J5
IG1ldGhvZCB3aWxsIHVzZSB0aGlzIGNhY2hlIHRvIGF2b2lkIHJlZ2VuZXJhdGluZworICAgICAg
ICB0aGUgcmV2aXNpb24gaGlzdG9yeS4KKworICAgICAgICBUaGlzIEFQSSBpcyBzZW1pLXB1Ymxp
YzsgaXQgb25seSBmb3IgdXNlIGJ5IHN1YmNsYXNzZXMsIGFsbCBvdGhlciBjb2RlCisgICAgICAg
IHNob3VsZCBjb25zaWRlciBpdCB0byBiZSBwcml2YXRlLgorICAgICAgICAiIiIKKyAgICAgICAg
c2VsZi5fcmV2aXNpb25faGlzdG9yeV9jYWNoZSA9IHJldl9oaXN0b3J5CisKKyAgICBkZWYgX2Ns
ZWFyX3JldmlzaW9uX2hpc3RvcnlfY2FjaGUoc2VsZik6CisgICAgICAgICIiIkNsZWFyIHRoZSBj
YWNoZWQgcmV2aXNpb24gaGlzdG9yeSB0byByZXZfaGlzdG9yeS4KKworICAgICAgICBUaGlzIG1l
YW5zIHRoZSBuZXh0IGNhbGwgdG8gcmV2aXNpb25faGlzdG9yeSB3aWxsIG5lZWQgdG8gY2FsbAor
ICAgICAgICBfZ2VuX3JldmlzaW9uX2hpc3RvcnkuCisKKyAgICAgICAgVGhpcyBBUEkgaXMgc2Vt
aS1wdWJsaWM7IGl0IG9ubHkgZm9yIHVzZSBieSBzdWJjbGFzc2VzLCBhbGwgb3RoZXIgY29kZQor
ICAgICAgICBzaG91bGQgY29uc2lkZXIgaXQgdG8gYmUgcHJpdmF0ZS4KKyAgICAgICAgIiIiCisg
ICAgICAgIHNlbGYuX3JldmlzaW9uX2hpc3RvcnlfY2FjaGUgPSBOb25lCisKKyAgICBkZWYgX2dl
bl9yZXZpc2lvbl9oaXN0b3J5KHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gc2VxdWVuY2Ugb2Yg
cmV2aXNpb24gaGFzaGVzIG9uIHRvIHRoaXMgYnJhbmNoLgorICAgICAgICAKKyAgICAgICAgVW5s
aWtlIHJldmlzaW9uX2hpc3RvcnksIHRoaXMgbWV0aG9kIGFsd2F5cyByZWdlbmVyYXRlcyBvciBy
ZXJlYWRzIHRoZQorICAgICAgICByZXZpc2lvbiBoaXN0b3J5LCBpLmUuIGl0IGRvZXMgbm90IGNh
Y2hlIHRoZSByZXN1bHQsIHNvIHJlcGVhdGVkIGNhbGxzCisgICAgICAgIG1heSBiZSBleHBlbnNp
dmUuCisKKyAgICAgICAgVGhpcyBpcyBpbnRlbmRlZCB0byBiZSBvdmVycmlkZGVuIGJ5IGNvbmNy
ZXRlIHN1YmNsYXNzZXMsIHJhdGhlciB0aGFuCisgICAgICAgIG92ZXJyaWRpbmcgcmV2aXNpb25f
aGlzdG9yeSwgc28gdGhhdCBzdWJjbGFzc2VzIGRvIG5vdCBuZWVkIHRvIGRlYWwgd2l0aAorICAg
ICAgICBjYWNoaW5nIGxvZ2ljLgorICAgICAgICAKKyAgICAgICAgVGhpcyBBUEkgaXMgc2VtaS1w
dWJsaWM7IGl0IG9ubHkgZm9yIHVzZSBieSBzdWJjbGFzc2VzLCBhbGwgb3RoZXIgY29kZQorICAg
ICAgICBzaG91bGQgY29uc2lkZXIgaXQgdG8gYmUgcHJpdmF0ZS4KKyAgICAgICAgIiIiCisgICAg
ICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3Ioc2VsZi5fZ2VuX3JldmlzaW9uX2hpc3Rvcnkp
CisKKyAgICBAbmVlZHNfcmVhZF9sb2NrCiAgICAgZGVmIHJldmlzaW9uX2hpc3Rvcnkoc2VsZik6
Ci0gICAgICAgICIiIlJldHVybiBzZXF1ZW5jZSBvZiByZXZpc2lvbiBoYXNoZXMgb24gdG8gdGhp
cyBicmFuY2guIiIiCi0gICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3Ioc2VsZi5yZXZp
c2lvbl9oaXN0b3J5KQorICAgICAgICAiIiJSZXR1cm4gc2VxdWVuY2Ugb2YgcmV2aXNpb24gaGFz
aGVzIG9uIHRvIHRoaXMgYnJhbmNoLgorICAgICAgICAKKyAgICAgICAgVGhpcyBtZXRob2Qgd2ls
bCBjYWNoZSB0aGUgcmV2aXNpb24gaGlzdG9yeSBmb3IgYXMgbG9uZyBhcyBpdCBpcyBzYWZlIHRv
CisgICAgICAgIGRvIHNvLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgc2VsZi5fcmV2aXNpb25f
aGlzdG9yeV9jYWNoZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9yZXZp
c2lvbl9oaXN0b3J5X2NhY2hlCisgICAgICAgIGhpc3RvcnkgPSBzZWxmLl9nZW5fcmV2aXNpb25f
aGlzdG9yeSgpCisgICAgICAgIHNlbGYuX2NhY2hlX3JldmlzaW9uX2hpc3RvcnkoaGlzdG9yeSkK
KyAgICAgICAgcmV0dXJuIGxpc3QoaGlzdG9yeSkKIAogICAgIGRlZiByZXZubyhzZWxmKToKICAg
ICAgICAgIiIiUmV0dXJuIGN1cnJlbnQgcmV2aXNpb24gbnVtYmVyIGZvciB0aGlzIGJyYW5jaC4K
QEAgLTEzMjYsNiArMTM3NCw5IEBACiAgICAgICAgICAgICBzZWxmLmNvbnRyb2xfZmlsZXMudW5s
b2NrKCkKICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgIHNlbGYucmVwb3NpdG9yeS51bmxv
Y2soKQorICAgICAgICBpZiBub3Qgc2VsZi5jb250cm9sX2ZpbGVzLmlzX2xvY2tlZCgpOgorICAg
ICAgICAgICAgIyB3ZSBqdXN0IHJlbGVhc2VkIHRoZSBsb2NrCisgICAgICAgICAgICBzZWxmLl9j
bGVhcl9yZXZpc2lvbl9oaXN0b3J5X2NhY2hlKCkKICAgICAgICAgCiAgICAgZGVmIHBlZWtfbG9j
a19tb2RlKHNlbGYpOgogICAgICAgICBpZiBzZWxmLmNvbnRyb2xfZmlsZXMuX2xvY2tfY291bnQg
PT0gMDoKQEAgLTEzNjUsMTkgKzE0MTYsNyBAQAogICAgICAgICAiIiJTZWUgQnJhbmNoLnNldF9y
ZXZpc2lvbl9oaXN0b3J5LiIiIgogICAgICAgICByZXZfaGlzdG9yeSA9IFtvc3V0aWxzLnNhZmVf
cmV2aXNpb25faWQocikgZm9yIHIgaW4gcmV2X2hpc3RvcnldCiAgICAgICAgIHNlbGYuX3dyaXRl
X3JldmlzaW9uX2hpc3RvcnkocmV2X2hpc3RvcnkpCi0gICAgICAgIHRyYW5zYWN0aW9uID0gc2Vs
Zi5nZXRfdHJhbnNhY3Rpb24oKQotICAgICAgICBoaXN0b3J5ID0gdHJhbnNhY3Rpb24ubWFwLmZp
bmRfcmV2aXNpb25faGlzdG9yeSgpCi0gICAgICAgIGlmIGhpc3RvcnkgaXMgbm90IE5vbmU6Ci0g
ICAgICAgICAgICAjIHVwZGF0ZSB0aGUgcmV2aXNpb24gaGlzdG9yeSBpbiB0aGUgaWRlbnRpdHkg
bWFwLgotICAgICAgICAgICAgaGlzdG9yeVs6XSA9IGxpc3QocmV2X2hpc3RvcnkpCi0gICAgICAg
ICAgICAjIHRoaXMgY2FsbCBpcyBkaXNhYmxlZCBiZWNhdXNlIHJldmlzaW9uX2hpc3RvcnkgaXMg
Ci0gICAgICAgICAgICAjIG5vdCByZWFsbHkgYW4gb2JqZWN0IHlldCwgYW5kIHRoZSB0cmFuc2Fj
dGlvbiBpcyBmb3Igb2JqZWN0cy4KLSAgICAgICAgICAgICMgdHJhbnNhY3Rpb24ucmVnaXN0ZXJf
ZGlydHkoaGlzdG9yeSkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHRyYW5zYWN0aW9uLm1h
cC5hZGRfcmV2aXNpb25faGlzdG9yeShyZXZfaGlzdG9yeSkKLSAgICAgICAgICAgICMgdGhpcyBj
YWxsIGlzIGRpc2FibGVkIGJlY2F1c2UgcmV2aXNpb25faGlzdG9yeSBpcyAKLSAgICAgICAgICAg
ICMgbm90IHJlYWxseSBhbiBvYmplY3QgeWV0LCBhbmQgdGhlIHRyYW5zYWN0aW9uIGlzIGZvciBv
YmplY3RzLgotICAgICAgICAgICAgIyB0cmFuc2FjdGlvbi5yZWdpc3Rlcl9jbGVhbihoaXN0b3J5
KQorICAgICAgICBzZWxmLl9jYWNoZV9yZXZpc2lvbl9oaXN0b3J5KHJldl9oaXN0b3J5KQogICAg
ICAgICBmb3IgaG9vayBpbiBCcmFuY2guaG9va3NbJ3NldF9yaCddOgogICAgICAgICAgICAgaG9v
ayhzZWxmLCByZXZfaGlzdG9yeSkKIApAQCAtMTM5NSwyMSArMTQzNCw2IEBACiAgICAgICAgICAg
ICBoaXN0b3J5LnBvcCgpCiAgICAgICAgIHJldHVybiBoaXN0b3J5CiAKLSAgICBAbmVlZHNfcmVh
ZF9sb2NrCi0gICAgZGVmIHJldmlzaW9uX2hpc3Rvcnkoc2VsZik6Ci0gICAgICAgICIiIlNlZSBC
cmFuY2gucmV2aXNpb25faGlzdG9yeS4iIiIKLSAgICAgICAgdHJhbnNhY3Rpb24gPSBzZWxmLmdl
dF90cmFuc2FjdGlvbigpCi0gICAgICAgIGhpc3RvcnkgPSB0cmFuc2FjdGlvbi5tYXAuZmluZF9y
ZXZpc2lvbl9oaXN0b3J5KCkKLSAgICAgICAgaWYgaGlzdG9yeSBpcyBub3QgTm9uZToKLSAgICAg
ICAgICAgICMgbXV0dGVyKCJjYWNoZSBoaXQgZm9yIHJldmlzaW9uLWhpc3RvcnkgaW4gJXMiLCBz
ZWxmKQotICAgICAgICAgICAgcmV0dXJuIGxpc3QoaGlzdG9yeSkKLSAgICAgICAgaGlzdG9yeSA9
IHNlbGYuX2dlbl9yZXZpc2lvbl9oaXN0b3J5KCkKLSAgICAgICAgdHJhbnNhY3Rpb24ubWFwLmFk
ZF9yZXZpc2lvbl9oaXN0b3J5KGhpc3RvcnkpCi0gICAgICAgICMgdGhpcyBjYWxsIGlzIGRpc2Fi
bGVkIGJlY2F1c2UgcmV2aXNpb25faGlzdG9yeSBpcyAKLSAgICAgICAgIyBub3QgcmVhbGx5IGFu
IG9iamVjdCB5ZXQsIGFuZCB0aGUgdHJhbnNhY3Rpb24gaXMgZm9yIG9iamVjdHMuCi0gICAgICAg
ICMgdHJhbnNhY3Rpb24ucmVnaXN0ZXJfY2xlYW4oaGlzdG9yeSwgcHJlY2lvdXM9VHJ1ZSkKLSAg
ICAgICAgcmV0dXJuIGxpc3QoaGlzdG9yeSkKLQogICAgIGRlZiBfbGVmdGhhbmRfaGlzdG9yeShz
ZWxmLCByZXZpc2lvbl9pZCwgbGFzdF9yZXY9Tm9uZSwKICAgICAgICAgICAgICAgICAgICAgICAg
ICAgb3RoZXJfYnJhbmNoPU5vbmUpOgogICAgICAgICAjIHN0b3BfcmV2aXNpb24gbXVzdCBiZSBh
IGRlc2NlbmRhbnQgb2YgbGFzdF9yZXZpc2lvbgpAQCAtMTkyOCwxMCArMTk1Miw3IEBACiAgICAg
ICAgIGlmIHNlbGYuX2dldF9hcHBlbmRfcmV2aXNpb25zX29ubHkoKToKICAgICAgICAgICAgIHNl
bGYuX2NoZWNrX2hpc3RvcnlfdmlvbGF0aW9uKHJldmlzaW9uX2lkKQogICAgICAgICBzZWxmLl93
cml0ZV9sYXN0X3JldmlzaW9uX2luZm8ocmV2bm8sIHJldmlzaW9uX2lkKQotICAgICAgICB0cmFu
c2FjdGlvbiA9IHNlbGYuZ2V0X3RyYW5zYWN0aW9uKCkKLSAgICAgICAgY2FjaGVkX2hpc3Rvcnkg
PSB0cmFuc2FjdGlvbi5tYXAuZmluZF9yZXZpc2lvbl9oaXN0b3J5KCkKLSAgICAgICAgaWYgY2Fj
aGVkX2hpc3RvcnkgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICB0cmFuc2FjdGlvbi5tYXAucmVt
b3ZlX29iamVjdChjYWNoZWRfaGlzdG9yeSkKKyAgICAgICAgc2VsZi5fY2xlYXJfcmV2aXNpb25f
aGlzdG9yeV9jYWNoZSgpCiAKICAgICBkZWYgX2NoZWNrX2hpc3RvcnlfdmlvbGF0aW9uKHNlbGYs
IHJldmlzaW9uX2lkKToKICAgICAgICAgbGFzdF9yZXZpc2lvbiA9IHNlbGYubGFzdF9yZXZpc2lv
bigpCgo=
=== modified file bzrlib/tests/branch_implementations/test_branch.py // encodin
... g:base64
LS0tIGJ6cmxpYi90ZXN0cy9icmFuY2hfaW1wbGVtZW50YXRpb25zL3Rlc3RfYnJhbmNoLnB5Cisr
KyBienJsaWIvdGVzdHMvYnJhbmNoX2ltcGxlbWVudGF0aW9ucy90ZXN0X2JyYW5jaC5weQpAQCAt
NzA0LDE3ICs3MDQsMzUgQEAKICAgICAgICAgd2lsbCBub3QgbmVlZCB0aGUgcmV2aXNpb25faGlz
dG9yeS4gIFRodXMgdGhlIGJyYW5jaCB3aWxsIG5vdCB0byBjYWxsCiAgICAgICAgIF9nZW5fcmV2
aXNpb25faGlzdG9yeSBpbiB0aGlzIHNpdHVhdGlvbi4KICAgICAgICAgIiIiCi0gICAgICAgIGJy
YW5jaCwgY2FsbHMgPSBzZWxmLmdldF9pbnN0cnVtZW50ZWRfYnJhbmNoKCkKLSAgICAgICAgIyBM
b2NrIHRoZSBicmFuY2gsIHNldCB0aGUgcmV2aXNpb24gaGlzdG9yeSwgdGhlbiByZXBlYXRlZGx5
IGNhbGwKLSAgICAgICAgIyByZXZpc2lvbl9oaXN0b3J5LgotICAgICAgICBicmFuY2gubG9ja193
cml0ZSgpCi0gICAgICAgIGJyYW5jaC5zZXRfbGFzdF9yZXZpc2lvbl9pbmZvKDAsIE5vbmUpCisg
ICAgICAgIGFfYnJhbmNoLCBjYWxscyA9IHNlbGYuZ2V0X2luc3RydW1lbnRlZF9icmFuY2goKQor
ICAgICAgICAjIExvY2sgdGhlIGJyYW5jaCwgc2V0IHRoZSBsYXN0IHJldmlzaW9uIGluZm8sIHRo
ZW4gY2FsbAorICAgICAgICAjIGxhc3RfcmV2aXNpb25faW5mby4KKyAgICAgICAgYV9icmFuY2gu
bG9ja193cml0ZSgpCisgICAgICAgIGFfYnJhbmNoLnNldF9sYXN0X3JldmlzaW9uX2luZm8oMCwg
Tm9uZSkKICAgICAgICAgZGVsIGNhbGxzWzpdCiAgICAgICAgIHRyeToKLSAgICAgICAgICAgIGJy
YW5jaC5sYXN0X3JldmlzaW9uX2luZm8oKQorICAgICAgICAgICAgYV9icmFuY2gubGFzdF9yZXZp
c2lvbl9pbmZvKCkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoW10sIGNhbGxzKQogICAg
ICAgICBmaW5hbGx5OgotICAgICAgICAgICAgYnJhbmNoLnVubG9jaygpCisgICAgICAgICAgICBh
X2JyYW5jaC51bmxvY2soKQorCisgICAgZGVmIHRlc3Rfc2V0X2xhc3RfcmV2aXNpb25faW5mb191
bmNhY2hlc19yZXZpc2lvbl9oaXN0b3J5X2Zvcl9mb3JtYXQ2KHNlbGYpOgorICAgICAgICBpZiBu
b3QgaXNpbnN0YW5jZShzZWxmLmJyYW5jaF9mb3JtYXQsIGJyYW5jaC5CenJCcmFuY2hGb3JtYXQ2
KToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBhX2JyYW5jaCwgY2FsbHMgPSBzZWxmLmdl
dF9pbnN0cnVtZW50ZWRfYnJhbmNoKCkKKyAgICAgICAgIyBMb2NrIHRoZSBicmFuY2gsIGNhY2hl
IHRoZSByZXZpc2lvbiBoaXN0b3J5LgorICAgICAgICBhX2JyYW5jaC5sb2NrX3dyaXRlKCkKKyAg
ICAgICAgYV9icmFuY2gucmV2aXNpb25faGlzdG9yeSgpCisgICAgICAgICMgU2V0IHRoZSBsYXN0
IHJldmlzaW9uIGluZm8sIGNsZWFyaW5nIHRoZSBjYWNoZS4KKyAgICAgICAgYV9icmFuY2guc2V0
X2xhc3RfcmV2aXNpb25faW5mbygwLCBOb25lKQorICAgICAgICBkZWwgY2FsbHNbOl0KKyAgICAg
ICAgdHJ5OgorICAgICAgICAgICAgYV9icmFuY2gucmV2aXNpb25faGlzdG9yeSgpCisgICAgICAg
ICAgICBzZWxmLmFzc2VydEVxdWFsKFsnX2dlbl9yZXZpc2lvbl9oaXN0b3J5J10sIGNhbGxzKQor
ICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgYV9icmFuY2gudW5sb2NrKCkKKworICAgICAg
ICAKIAogCiBjbGFzcyBUZXN0QnJhbmNoUHVzaExvY2F0aW9ucyhUZXN0Q2FzZVdpdGhCcmFuY2gp
OgoK
=== modified directory // last-changed:andrew.bennetts at canonical.com-200703260
... 45509-mdnlny5ge3sevuns
# revision id: andrew.bennetts at canonical.com-20070326045509-mdnlny5ge3sevuns
# sha1: 8431bb2b310b658f731fa493fa500ff9ff7acd19
# inventory sha1: 9fcf6c2706788f09daed439e47ba902f8cb40b3f
# parent ids:
# andrew.bennetts at canonical.com-20070326014152-yym3dec6270pxjc3
# properties:
# branch-nick: remove-branch-transaction
# message:
# More tests for Branch revision history caching.
# committer: Andrew Bennetts <andrew.bennetts at canonical.com>
# date: Mon 2007-03-26 11:41:52.084000111 +1000
=== modified file bzrlib/tests/branch_implementations/test_branch.py // encodin
... g:base64
LS0tIGJ6cmxpYi90ZXN0cy9icmFuY2hfaW1wbGVtZW50YXRpb25zL3Rlc3RfYnJhbmNoLnB5Cisr
KyBienJsaWIvdGVzdHMvYnJhbmNoX2ltcGxlbWVudGF0aW9ucy90ZXN0X2JyYW5jaC5weQpAQCAt
NjE2LDkgKzYxNiwyNyBAQAogCiAKIGNsYXNzIFRlc3RSZXZpc2lvbkhpc3RvcnlDYWNoaW5nKFRl
c3RDYXNlV2l0aEJyYW5jaCk6CisgICAgIiIiVGVzdHMgZm9yIHRoZSBjYWNoaW5nIG9mIGJyYW5j
aCByZXZpc2lvbl9oaXN0b3J5LgorCisgICAgV2hlbiBsb2NrZWQsIGJyYW5jaGVzIHNob3VsZCBh
dm9pZCByZWdlbmVyYXRpbmcgb3IgcmVyZWFkaW5nCisgICAgcmV2aXNpb25faGlzdG9yeSBieSBj
YWNoaW5nIHRoZSBsYXN0IHZhbHVlIG9mIGl0LiAgVGhpcyBpcyBzYWZlIGJlY2F1c2UKKyAgICB0
aGUgYnJhbmNoIGlzIGxvY2tlZCwgc28gbm90aGluZyBjYW4gY2hhbmdlIHRoZSByZXZpc2lvbl9o
aXN0b3J5CisgICAgdW5leHBlY3RlZGx5LgorCisgICAgV2hlbiBub3QgbG9ja2VkLCBvYnZpb3Vz
bHkgdGhlIHJldmlzaW9uX2hpc3Rvcnkgd2lsbCBuZWVkIHRvIGJlIHJlZ2VuZXJhdGVkCisgICAg
b3IgcmVyZWFkIGVhY2ggdGltZS4KKworICAgIFdlIHRlc3QgaWYgcmV2aXNpb25faGlzdG9yeSBp
cyB1c2luZyB0aGUgY2FjaGUgYnkgaW5zdHJ1bWVudGluZyB0aGUgYnJhbmNoJ3MKKyAgICBfZ2Vu
X3JldmlzaW9uX2hpc3RvcnkgbWV0aG9kLCB3aGljaCBpcyBjYWxsZWQgYnkgQnJhbmNoLnJldmlz
aW9uX2hpc3RvcnkgaWYKKyAgICB0aGUgYnJhbmNoIGRvZXMgbm90IGhhdmUgYSBjYWNoZSBvZiB0
aGUgcmV2aXNpb24gaGlzdG9yeS4KKyAgICAiIiIKIAogICAgIGRlZiBnZXRfaW5zdHJ1bWVudGVk
X2JyYW5jaChzZWxmKToKLSAgICAgICAgIyBHZXQgYSBicmFuY2ggYW5kIG1vbmtleSBwYXRjaCBp
dCB0byBsb2cgY2FsbHMgdG8gX2dlbl9yZXZpc2lvbl9oaXN0b3J5CisgICAgICAgICIiIkdldCBh
IGJyYW5jaCBhbmQgbW9ua2V5IHBhdGNoIGl0IHRvIGxvZyBjYWxscyB0bworICAgICAgICBfZ2Vu
X3JldmlzaW9uX2hpc3RvcnkuCisKKyAgICAgICAgOnJldHVybnM6IGEgdHVwbGUgb2YgKHRoZSBi
cmFuY2gsIGxpc3QgdGhhdCBjYWxscyB3aWxsIGJlIGxvZ2dlZCB0bykKKyAgICAgICAgIiIiCiAg
ICAgICAgIGJyYW5jaCA9IHNlbGYuZ2V0X2JyYW5jaCgpCiAgICAgICAgIGNhbGxzID0gW10KICAg
ICAgICAgcmVhbF9nZW5fcmV2aXNpb25faGlzdG9yeSA9IGJyYW5jaC5fZ2VuX3JldmlzaW9uX2hp
c3RvcnkKQEAgLTYzNCw4ICs2NTIsNiBAQAogICAgICAgICAiIiIKICAgICAgICAgYnJhbmNoLCBj
YWxscyA9IHNlbGYuZ2V0X2luc3RydW1lbnRlZF9icmFuY2goKQogICAgICAgICAjIFJlcGVhdGVk
bHkgY2FsbCByZXZpc2lvbl9oaXN0b3J5LgotICAgICAgICAjIF9nZW5fcmV2aXNpb25faGlzdG9y
eSB3aWxsIGNhbGxlZCBlYWNoIHRpbWUsIGJlY2F1c2UgdGhlIGJyYW5jaCBpcyBub3QKLSAgICAg
ICAgIyBsb2NrZWQsIHNvIHRoZSBoaXN0b3J5IG1pZ2h0IGhhdmUgY2hhbmdlZCBiZXR3ZWVuIGNh
bGxzLgogICAgICAgICBicmFuY2gucmV2aXNpb25faGlzdG9yeSgpCiAgICAgICAgIGJyYW5jaC5y
ZXZpc2lvbl9oaXN0b3J5KCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKQEAgLTY0Nyw3ICs2
NjMsNiBAQAogICAgICAgICAiIiIKICAgICAgICAgYnJhbmNoLCBjYWxscyA9IHNlbGYuZ2V0X2lu
c3RydW1lbnRlZF9icmFuY2goKQogICAgICAgICAjIExvY2sgdGhlIGJyYW5jaCwgdGhlbiByZXBl
YXRlZGx5IGNhbGwgcmV2aXNpb25faGlzdG9yeS4KLSAgICAgICAgIyBfZ2VuX3JldmlzaW9uX2hp
c3Rvcnkgd2lsbCBvbmx5IGJlIGNhbGxlZCBvbmNlLgogICAgICAgICBicmFuY2gubG9ja19yZWFk
KCkKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgYnJhbmNoLnJldmlzaW9uX2hpc3RvcnkoKQpA
QCAtNjU2LDYgKzY3MSw1MSBAQAogICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgYnJhbmNo
LnVubG9jaygpCiAKKyAgICBkZWYgdGVzdF9zZXRfcmV2aXNpb25faGlzdG9yeV93aGVuX2xvY2tl
ZChzZWxmKToKKyAgICAgICAgIiIiV2hlbiB0aGUgYnJhbmNoIGlzIGxvY2tlZCwgY2FsbGluZyBz
ZXRfcmV2aXNpb25faGlzdG9yeSBzaG91bGQgY2FjaGUKKyAgICAgICAgdGhlIHJldmlzaW9uIGhp
c3Rvcnkgc28gdGhhdCBhIGxhdGVyIGNhbGwgdG8gcmV2aXNpb25faGlzdG9yeSB3aWxsIG5vdAor
ICAgICAgICBuZWVkIHRvIGNhbGwgX2dlbl9yZXZpc2lvbl9oaXN0b3J5LgorICAgICAgICAiIiIK
KyAgICAgICAgYnJhbmNoLCBjYWxscyA9IHNlbGYuZ2V0X2luc3RydW1lbnRlZF9icmFuY2goKQor
ICAgICAgICAjIExvY2sgdGhlIGJyYW5jaCwgc2V0IHRoZSByZXZpc2lvbiBoaXN0b3J5LCB0aGVu
IHJlcGVhdGVkbHkgY2FsbAorICAgICAgICAjIHJldmlzaW9uX2hpc3RvcnkuCisgICAgICAgIGJy
YW5jaC5sb2NrX3dyaXRlKCkKKyAgICAgICAgYnJhbmNoLnNldF9yZXZpc2lvbl9oaXN0b3J5KFtd
KQorICAgICAgICB0cnk6CisgICAgICAgICAgICBicmFuY2gucmV2aXNpb25faGlzdG9yeSgpCisg
ICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFtdLCBjYWxscykKKyAgICAgICAgZmluYWxseToK
KyAgICAgICAgICAgIGJyYW5jaC51bmxvY2soKQorCisgICAgZGVmIHRlc3Rfc2V0X3JldmlzaW9u
X2hpc3Rvcnlfd2hlbl91bmxvY2tlZChzZWxmKToKKyAgICAgICAgIiIiV2hlbiB0aGUgYnJhbmNo
IGlzIG5vdCBsb2NrZWQsIGNhbGxpbmcgc2V0X3JldmlzaW9uX2hpc3Rvcnkgd2lsbCBub3QKKyAg
ICAgICAgY2F1c2UgdGhlIHJldmlzaW9uIGhpc3RvcnkgdG8gYmUgY2FjaGVkLgorICAgICAgICAi
IiIKKyAgICAgICAgYnJhbmNoLCBjYWxscyA9IHNlbGYuZ2V0X2luc3RydW1lbnRlZF9icmFuY2go
KQorICAgICAgICAjIExvY2sgdGhlIGJyYW5jaCwgc2V0IHRoZSByZXZpc2lvbiBoaXN0b3J5LCB0
aGVuIHJlcGVhdGVkbHkgY2FsbAorICAgICAgICAjIHJldmlzaW9uX2hpc3RvcnkuCisgICAgICAg
IGJyYW5jaC5zZXRfcmV2aXNpb25faGlzdG9yeShbXSkKKyAgICAgICAgYnJhbmNoLnJldmlzaW9u
X2hpc3RvcnkoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFsnX2dlbl9yZXZpc2lvbl9oaXN0
b3J5J10sIGNhbGxzKQorCisgICAgZGVmIHRlc3Rfc2V0X2xhc3RfcmV2aXNpb25faW5mb193aGVu
X2xvY2tlZChzZWxmKToKKyAgICAgICAgIiIiV2hlbiB0aGUgYnJhbmNoIGlzIGxvY2tlZCwgY2Fs
bGluZyBzZXRfbGFzdF9yZXZpc2lvbl9pbmZvIHNob3VsZAorICAgICAgICBjYWNoZSB0aGUgbGFz
dCByZXZpc2lvbiBpbmZvIHNvIHRoYXQgYSBsYXRlciBjYWxsIHRvIGxhc3RfcmV2aXNpb25faW5m
bworICAgICAgICB3aWxsIG5vdCBuZWVkIHRoZSByZXZpc2lvbl9oaXN0b3J5LiAgVGh1cyB0aGUg
YnJhbmNoIHdpbGwgbm90IHRvIGNhbGwKKyAgICAgICAgX2dlbl9yZXZpc2lvbl9oaXN0b3J5IGlu
IHRoaXMgc2l0dWF0aW9uLgorICAgICAgICAiIiIKKyAgICAgICAgYnJhbmNoLCBjYWxscyA9IHNl
bGYuZ2V0X2luc3RydW1lbnRlZF9icmFuY2goKQorICAgICAgICAjIExvY2sgdGhlIGJyYW5jaCwg
c2V0IHRoZSByZXZpc2lvbiBoaXN0b3J5LCB0aGVuIHJlcGVhdGVkbHkgY2FsbAorICAgICAgICAj
IHJldmlzaW9uX2hpc3RvcnkuCisgICAgICAgIGJyYW5jaC5sb2NrX3dyaXRlKCkKKyAgICAgICAg
YnJhbmNoLnNldF9sYXN0X3JldmlzaW9uX2luZm8oMCwgTm9uZSkKKyAgICAgICAgZGVsIGNhbGxz
WzpdCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGJyYW5jaC5sYXN0X3JldmlzaW9uX2luZm8o
KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbXSwgY2FsbHMpCisgICAgICAgIGZpbmFs
bHk6CisgICAgICAgICAgICBicmFuY2gudW5sb2NrKCkKKwogCiBjbGFzcyBUZXN0QnJhbmNoUHVz
aExvY2F0aW9ucyhUZXN0Q2FzZVdpdGhCcmFuY2gpOgogCgo=
=== modified directory // last-changed:andrew.bennetts at canonical.com-200703260
... 14152-yym3dec6270pxjc3
# revision id: andrew.bennetts at canonical.com-20070326014152-yym3dec6270pxjc3
# sha1: 106191165f7308f84d28172386b6ac965ddbf7b8
# inventory sha1: 9589513fe81aad4c7999e64c9135ebf90063068c
# parent ids:
# andrew.bennetts at canonical.com-20070326010253-7w19g5fpc4os7pkf
# properties:
# branch-nick: remove-branch-transaction
# message:
# Start some tests for the caching of branch revision_history.
# committer: Andrew Bennetts <andrew.bennetts at canonical.com>
# date: Mon 2007-03-26 11:02:53.328000069 +1000
=== modified file bzrlib/tests/branch_implementations/test_branch.py // encodin
... g:base64
LS0tIGJ6cmxpYi90ZXN0cy9icmFuY2hfaW1wbGVtZW50YXRpb25zL3Rlc3RfYnJhbmNoLnB5Cisr
KyBienJsaWIvdGVzdHMvYnJhbmNoX2ltcGxlbWVudGF0aW9ucy90ZXN0X2JyYW5jaC5weQpAQCAt
NjE1LDYgKzYxNSw0OCBAQAogICAgICAgICBzZWxmLmdldF9icmFuY2goKS51bmxvY2soKQogCiAK
K2NsYXNzIFRlc3RSZXZpc2lvbkhpc3RvcnlDYWNoaW5nKFRlc3RDYXNlV2l0aEJyYW5jaCk6CisK
KyAgICBkZWYgZ2V0X2luc3RydW1lbnRlZF9icmFuY2goc2VsZik6CisgICAgICAgICMgR2V0IGEg
YnJhbmNoIGFuZCBtb25rZXkgcGF0Y2ggaXQgdG8gbG9nIGNhbGxzIHRvIF9nZW5fcmV2aXNpb25f
aGlzdG9yeQorICAgICAgICBicmFuY2ggPSBzZWxmLmdldF9icmFuY2goKQorICAgICAgICBjYWxs
cyA9IFtdCisgICAgICAgIHJlYWxfZ2VuX3JldmlzaW9uX2hpc3RvcnkgPSBicmFuY2guX2dlbl9y
ZXZpc2lvbl9oaXN0b3J5CisgICAgICAgIGRlZiBmYWtlX2dlbl9yZXZpc2lvbl9oaXN0b3J5KCk6
CisgICAgICAgICAgICBjYWxscy5hcHBlbmQoJ19nZW5fcmV2aXNpb25faGlzdG9yeScpCisgICAg
ICAgICAgICByZXR1cm4gcmVhbF9nZW5fcmV2aXNpb25faGlzdG9yeSgpCisgICAgICAgIGJyYW5j
aC5fZ2VuX3JldmlzaW9uX2hpc3RvcnkgPSBmYWtlX2dlbl9yZXZpc2lvbl9oaXN0b3J5CisgICAg
ICAgIHJldHVybiBicmFuY2gsIGNhbGxzCisKKyAgICBkZWYgdGVzdF9yZXZpc2lvbl9oaXN0b3J5
X3doZW5fdW5sb2NrZWQoc2VsZik6CisgICAgICAgICIiIlJlcGVhdGVkIGNhbGxzIHRvIHJldmlz
aW9uIGhpc3Rvcnkgd2lsbCBjYWxsIF9nZW5fcmV2aXNpb25faGlzdG9yeQorICAgICAgICBlYWNo
IHRpbWUgd2hlbiB0aGUgYnJhbmNoIGlzIG5vdCBsb2NrZWQuCisgICAgICAgICIiIgorICAgICAg
ICBicmFuY2gsIGNhbGxzID0gc2VsZi5nZXRfaW5zdHJ1bWVudGVkX2JyYW5jaCgpCisgICAgICAg
ICMgUmVwZWF0ZWRseSBjYWxsIHJldmlzaW9uX2hpc3RvcnkuCisgICAgICAgICMgX2dlbl9yZXZp
c2lvbl9oaXN0b3J5IHdpbGwgY2FsbGVkIGVhY2ggdGltZSwgYmVjYXVzZSB0aGUgYnJhbmNoIGlz
IG5vdAorICAgICAgICAjIGxvY2tlZCwgc28gdGhlIGhpc3RvcnkgbWlnaHQgaGF2ZSBjaGFuZ2Vk
IGJldHdlZW4gY2FsbHMuCisgICAgICAgIGJyYW5jaC5yZXZpc2lvbl9oaXN0b3J5KCkKKyAgICAg
ICAgYnJhbmNoLnJldmlzaW9uX2hpc3RvcnkoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAor
ICAgICAgICAgICAgWydfZ2VuX3JldmlzaW9uX2hpc3RvcnknLCAnX2dlbl9yZXZpc2lvbl9oaXN0
b3J5J10sIGNhbGxzKQorCisgICAgZGVmIHRlc3RfcmV2aXNpb25faGlzdG9yeV93aGVuX2xvY2tl
ZChzZWxmKToKKyAgICAgICAgIiIiUmVwZWF0ZWQgY2FsbHMgdG8gcmV2aXNpb24gaGlzdG9yeSB3
aWxsIG9ubHkgY2FsbAorICAgICAgICBfZ2VuX3JldmlzaW9uX2hpc3Rvcnkgb25jZSB3aGlsZSB0
aGUgYnJhbmNoIGlzIGxvY2tlZC4KKyAgICAgICAgIiIiCisgICAgICAgIGJyYW5jaCwgY2FsbHMg
PSBzZWxmLmdldF9pbnN0cnVtZW50ZWRfYnJhbmNoKCkKKyAgICAgICAgIyBMb2NrIHRoZSBicmFu
Y2gsIHRoZW4gcmVwZWF0ZWRseSBjYWxsIHJldmlzaW9uX2hpc3RvcnkuCisgICAgICAgICMgX2dl
bl9yZXZpc2lvbl9oaXN0b3J5IHdpbGwgb25seSBiZSBjYWxsZWQgb25jZS4KKyAgICAgICAgYnJh
bmNoLmxvY2tfcmVhZCgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGJyYW5jaC5yZXZpc2lv
bl9oaXN0b3J5KCkKKyAgICAgICAgICAgIGJyYW5jaC5yZXZpc2lvbl9oaXN0b3J5KCkKKyAgICAg
ICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWydfZ2VuX3JldmlzaW9uX2hpc3RvcnknXSwgY2FsbHMp
CisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBicmFuY2gudW5sb2NrKCkKKworCiBjbGFz
cyBUZXN0QnJhbmNoUHVzaExvY2F0aW9ucyhUZXN0Q2FzZVdpdGhCcmFuY2gpOgogCiAgICAgZGVm
IHRlc3RfZ2V0X3B1c2hfbG9jYXRpb25fdW5zZXQoc2VsZik6Cgo=
=== modified directory // last-changed:andrew.bennetts at canonical.com-200703260
... 10253-7w19g5fpc4os7pkf
# revision id: andrew.bennetts at canonical.com-20070326010253-7w19g5fpc4os7pkf
# sha1: 0dc0b66493e00616dae77458051a9b074608d79a
# inventory sha1: 173be8e08372e88fdf49c2fa5f712aa142117e32
# parent ids:
# pqm at pqm.ubuntu.com-20070324001115-e8868e5d82612556
# properties:
# branch-nick: remove-branch-transaction
More information about the bazaar
mailing list