Merge lp:~jelmer/brz/write-group-context into lp:brz

Proposed by Jelmer Vernooij
Status: Merged
Approved by: Jelmer Vernooij
Approved revision: no longer in the source branch.
Merge reported by: The Breezy Bot
Merged at revision: not available
Proposed branch: lp:~jelmer/brz/write-group-context
Merge into: lp:brz
Diff against target: 857 lines (+116/-282)
20 files modified
breezy/builtins.py (+4/-21)
breezy/bundle/serializer/v4.py (+3/-8)
breezy/bzr/vf_repository.py (+2/-7)
breezy/commit_signature_commands.py (+2/-7)
breezy/plugins/repodebug/missing_keys_for_stacking_fixer.py (+2/-7)
breezy/repository.py (+22/-0)
breezy/tests/blackbox/test_reconcile.py (+3/-4)
breezy/tests/per_controldir/test_controldir.py (+3/-5)
breezy/tests/per_interrepository/test_fetch.py (+3/-13)
breezy/tests/per_interrepository/test_interrepository.py (+9/-13)
breezy/tests/per_pack_repository.py (+4/-19)
breezy/tests/per_repository/test_signatures.py (+2/-12)
breezy/tests/per_repository_chk/test_supported.py (+15/-51)
breezy/tests/per_repository_reference/test_add_inventory.py (+3/-12)
breezy/tests/per_repository_reference/test_add_revision.py (+5/-14)
breezy/tests/per_repository_reference/test_add_signature_text.py (+6/-14)
breezy/tests/per_repository_vf/helpers.py (+5/-13)
breezy/tests/per_repository_vf/test_check_reconcile.py (+4/-9)
breezy/tests/per_repository_vf/test_repository.py (+6/-21)
breezy/tests/test_inv.py (+13/-32)
To merge this branch: bzr merge lp:~jelmer/brz/write-group-context
Reviewer Review Type Date Requested Status
Martin Packman Approve
Review via email: mp+358465@code.launchpad.net

Commit message

Add a WriteGroup() context manager.

Description of the change

Add a WriteGroup() context manager.

To post a comment you must log in.
Revision history for this message
Martin Packman (gz) wrote :

Looks reasonable, thanks!

review: Approve
Revision history for this message
The Breezy Bot (the-breezy-bot) wrote :
Revision history for this message
The Breezy Bot (the-breezy-bot) wrote :
Revision history for this message
The Breezy Bot (the-breezy-bot) wrote :
Revision history for this message
The Breezy Bot (the-breezy-bot) wrote :

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'breezy/builtins.py'
--- breezy/builtins.py 2019-05-28 21:53:23 +0000
+++ breezy/builtins.py 2019-05-29 03:45:01 +0000
@@ -5260,29 +5260,18 @@
5260 return self._run(b, revision_id_list, revision)5260 return self._run(b, revision_id_list, revision)
52615261
5262 def _run(self, b, revision_id_list, revision):5262 def _run(self, b, revision_id_list, revision):
5263 from .repository import WriteGroup
5263 gpg_strategy = gpg.GPGStrategy(b.get_config_stack())5264 gpg_strategy = gpg.GPGStrategy(b.get_config_stack())
5264 if revision_id_list is not None:5265 if revision_id_list is not None:
5265 b.repository.start_write_group()5266 with WriteGroup(b.repository):
5266 try:
5267 for revision_id in revision_id_list:5267 for revision_id in revision_id_list:
5268 revision_id = cache_utf8.encode(revision_id)5268 revision_id = cache_utf8.encode(revision_id)
5269 b.repository.sign_revision(revision_id, gpg_strategy)5269 b.repository.sign_revision(revision_id, gpg_strategy)
5270 except BaseException:
5271 b.repository.abort_write_group()
5272 raise
5273 else:
5274 b.repository.commit_write_group()
5275 elif revision is not None:5270 elif revision is not None:
5276 if len(revision) == 1:5271 if len(revision) == 1:
5277 revno, rev_id = revision[0].in_history(b)5272 revno, rev_id = revision[0].in_history(b)
5278 b.repository.start_write_group()5273 with WriteGroup(b.repository):
5279 try:
5280 b.repository.sign_revision(rev_id, gpg_strategy)5274 b.repository.sign_revision(rev_id, gpg_strategy)
5281 except BaseException:
5282 b.repository.abort_write_group()
5283 raise
5284 else:
5285 b.repository.commit_write_group()
5286 elif len(revision) == 2:5275 elif len(revision) == 2:
5287 # are they both on rh- if so we can walk between them5276 # are they both on rh- if so we can walk between them
5288 # might be nice to have a range helper for arbitrary5277 # might be nice to have a range helper for arbitrary
@@ -5294,16 +5283,10 @@
5294 if from_revno is None or to_revno is None:5283 if from_revno is None or to_revno is None:
5295 raise errors.BzrCommandError(5284 raise errors.BzrCommandError(
5296 gettext('Cannot sign a range of non-revision-history revisions'))5285 gettext('Cannot sign a range of non-revision-history revisions'))
5297 b.repository.start_write_group()5286 with WriteGroup(b.repository):
5298 try:
5299 for revno in range(from_revno, to_revno + 1):5287 for revno in range(from_revno, to_revno + 1):
5300 b.repository.sign_revision(b.get_rev_id(revno),5288 b.repository.sign_revision(b.get_rev_id(revno),
5301 gpg_strategy)5289 gpg_strategy)
5302 except BaseException:
5303 b.repository.abort_write_group()
5304 raise
5305 else:
5306 b.repository.commit_write_group()
5307 else:5290 else:
5308 raise errors.BzrCommandError(5291 raise errors.BzrCommandError(
5309 gettext('Please supply either one revision, or a range.'))5292 gettext('Please supply either one revision, or a range.'))
53105293
=== modified file 'breezy/bundle/serializer/v4.py'
--- breezy/bundle/serializer/v4.py 2018-11-11 04:08:32 +0000
+++ breezy/bundle/serializer/v4.py 2019-05-29 03:45:01 +0000
@@ -26,6 +26,7 @@
26 lru_cache,26 lru_cache,
27 multiparent,27 multiparent,
28 osutils,28 osutils,
29 repository as _mod_repository,
29 revision as _mod_revision,30 revision as _mod_revision,
30 trace,31 trace,
31 ui,32 ui,
@@ -519,14 +520,8 @@
519520
520 Must be called with the Repository locked.521 Must be called with the Repository locked.
521 """522 """
522 self._repository.start_write_group()523 with _mod_repository.WriteGroup(self._repository):
523 try:524 return self._install_in_write_group()
524 result = self._install_in_write_group()
525 except:
526 self._repository.abort_write_group()
527 raise
528 self._repository.commit_write_group()
529 return result
530525
531 def _install_in_write_group(self):526 def _install_in_write_group(self):
532 current_file = None527 current_file = None
533528
=== modified file 'breezy/bzr/vf_repository.py'
--- breezy/bzr/vf_repository.py 2019-02-04 19:39:30 +0000
+++ breezy/bzr/vf_repository.py 2019-05-29 03:45:01 +0000
@@ -68,6 +68,7 @@
68 InterRepository,68 InterRepository,
69 Repository,69 Repository,
70 RepositoryFormat,70 RepositoryFormat,
71 WriteGroup,
71 )72 )
72from .repository import (73from .repository import (
73 MetaDirRepository,74 MetaDirRepository,
@@ -2863,8 +2864,7 @@
2863 Accepts an iterable of revision, tree, signature tuples. The signature2864 Accepts an iterable of revision, tree, signature tuples. The signature
2864 may be None.2865 may be None.
2865 """2866 """
2866 repository.start_write_group()2867 with WriteGroup(repository):
2867 try:
2868 inventory_cache = lru_cache.LRUCache(10)2868 inventory_cache = lru_cache.LRUCache(10)
2869 for n, (revision, revision_tree, signature) in enumerate(iterable):2869 for n, (revision, revision_tree, signature) in enumerate(iterable):
2870 _install_revision(repository, revision, revision_tree, signature,2870 _install_revision(repository, revision, revision_tree, signature,
@@ -2872,11 +2872,6 @@
2872 if pb is not None:2872 if pb is not None:
2873 pb.update(gettext('Transferring revisions'),2873 pb.update(gettext('Transferring revisions'),
2874 n + 1, num_revisions)2874 n + 1, num_revisions)
2875 except:
2876 repository.abort_write_group()
2877 raise
2878 else:
2879 repository.commit_write_group()
28802875
28812876
2882def _install_revision(repository, rev, revision_tree, signature,2877def _install_revision(repository, rev, revision_tree, signature,
28832878
=== modified file 'breezy/commit_signature_commands.py'
--- breezy/commit_signature_commands.py 2018-11-12 01:41:38 +0000
+++ breezy/commit_signature_commands.py 2019-05-29 03:45:01 +0000
@@ -22,6 +22,7 @@
22 controldir,22 controldir,
23 errors,23 errors,
24 gpg,24 gpg,
25 repository as _mod_repository,
25 revision as _mod_revision,26 revision as _mod_revision,
26 )27 )
27from .commands import Command28from .commands import Command
@@ -66,8 +67,7 @@
66 count = 067 count = 0
67 with repo.lock_write():68 with repo.lock_write():
68 graph = repo.get_graph()69 graph = repo.get_graph()
69 repo.start_write_group()70 with _mod_repository.WriteGroup(repo):
70 try:
71 for rev_id, parents in graph.iter_ancestry(71 for rev_id, parents in graph.iter_ancestry(
72 [branch.last_revision()]):72 [branch.last_revision()]):
73 if _mod_revision.is_null(rev_id):73 if _mod_revision.is_null(rev_id):
@@ -86,11 +86,6 @@
86 count += 186 count += 1
87 if not dry_run:87 if not dry_run:
88 repo.sign_revision(rev_id, gpg_strategy)88 repo.sign_revision(rev_id, gpg_strategy)
89 except BaseException:
90 repo.abort_write_group()
91 raise
92 else:
93 repo.commit_write_group()
94 self.outf.write(89 self.outf.write(
95 ngettext('Signed %d revision.\n', 'Signed %d revisions.\n',90 ngettext('Signed %d revision.\n', 'Signed %d revisions.\n',
96 count) % count)91 count) % count)
9792
=== modified file 'breezy/plugins/repodebug/missing_keys_for_stacking_fixer.py'
--- breezy/plugins/repodebug/missing_keys_for_stacking_fixer.py 2018-11-11 04:08:32 +0000
+++ breezy/plugins/repodebug/missing_keys_for_stacking_fixer.py 2019-05-29 03:45:01 +0000
@@ -21,6 +21,7 @@
21from ... import errors21from ... import errors
22from ...sixish import viewvalues22from ...sixish import viewvalues
23from ...bzr.vf_search import PendingAncestryResult23from ...bzr.vf_search import PendingAncestryResult
24from ...repository import WriteGroup
24from ...revision import NULL_REVISION25from ...revision import NULL_REVISION
2526
2627
@@ -77,14 +78,8 @@
77 assert raw_r._format.network_name() == b.repository._format.network_name()78 assert raw_r._format.network_name() == b.repository._format.network_name()
78 stream = b.repository.inventories.get_record_stream(79 stream = b.repository.inventories.get_record_stream(
79 needed, 'topological', True)80 needed, 'topological', True)
80 raw_r.start_write_group()81 with WriteGroup(raw_r):
81 try:
82 raw_r.inventories.insert_record_stream(stream)82 raw_r.inventories.insert_record_stream(stream)
83 except:
84 raw_r.abort_write_group()
85 raise
86 else:
87 raw_r.commit_write_group()
88 finally:83 finally:
89 raw_r.unlock()84 raw_r.unlock()
90 b.unlock()85 b.unlock()
9186
=== modified file 'breezy/repository.py'
--- breezy/repository.py 2019-02-04 19:39:30 +0000
+++ breezy/repository.py 2019-05-29 03:45:01 +0000
@@ -236,6 +236,28 @@
236 self.unlock)236 self.unlock)
237237
238238
239class WriteGroup(object):
240 """Context manager that manages a write group.
241
242 Raising an exception will result in the write group being aborted.
243 """
244
245 def __init__(self, repository, suppress_errors=False):
246 self.repository = repository
247 self._suppress_errors = suppress_errors
248
249 def __enter__(self):
250 self.repository.start_write_group()
251 return self
252
253 def __exit__(self, exc_type, exc_val, exc_tb):
254 if exc_type:
255 self.repository.abort_write_group(self._suppress_errors)
256 return False
257 else:
258 self.repository.commit_write_group()
259
260
239######################################################################261######################################################################
240# Repositories262# Repositories
241263
242264
=== modified file 'breezy/tests/blackbox/test_reconcile.py'
--- breezy/tests/blackbox/test_reconcile.py 2018-11-11 04:08:32 +0000
+++ breezy/tests/blackbox/test_reconcile.py 2019-05-29 03:45:01 +0000
@@ -21,6 +21,7 @@
21 controldir,21 controldir,
22 tests,22 tests,
23 )23 )
24from breezy.repository import WriteGroup
24from breezy.bzr import (25from breezy.bzr import (
25 inventory,26 inventory,
26 )27 )
@@ -53,10 +54,8 @@
53 inv = inventory.Inventory(revision_id=b'missing')54 inv = inventory.Inventory(revision_id=b'missing')
54 inv.root.revision = b'missing'55 inv.root.revision = b'missing'
55 repo.lock_write()56 repo.lock_write()
56 repo.start_write_group()57 with repo.lock_write(), WriteGroup(repo):
57 repo.add_inventory(b'missing', inv, [])58 repo.add_inventory(b'missing', inv, [])
58 repo.commit_write_group()
59 repo.unlock()
60 (out, err) = self.run_bzr('reconcile')59 (out, err) = self.run_bzr('reconcile')
61 if repo._reconcile_backsup_inventory:60 if repo._reconcile_backsup_inventory:
62 does_backup_text = (61 does_backup_text = (
6362
=== modified file 'breezy/tests/per_controldir/test_controldir.py'
--- breezy/tests/per_controldir/test_controldir.py 2018-11-11 04:08:32 +0000
+++ breezy/tests/per_controldir/test_controldir.py 2019-05-29 03:45:01 +0000
@@ -24,6 +24,7 @@
24 errors,24 errors,
25 gpg,25 gpg,
26 osutils,26 osutils,
27 repository as _mod_repository,
27 revision as _mod_revision,28 revision as _mod_revision,
28 transport,29 transport,
29 ui,30 ui,
@@ -319,11 +320,8 @@
319 tree_repo = tree.branch.repository320 tree_repo = tree.branch.repository
320 if not tree_repo._format.supports_revision_signatures:321 if not tree_repo._format.supports_revision_signatures:
321 self.skipTest('repository format does not support signing')322 self.skipTest('repository format does not support signing')
322 tree_repo.lock_write()323 with tree_repo.lock_write(), _mod_repository.WriteGroup(tree_repo):
323 tree_repo.start_write_group()324 tree_repo.sign_revision(rev1, gpg.LoopbackGPGStrategy(None))
324 tree_repo.sign_revision(rev1, gpg.LoopbackGPGStrategy(None))
325 tree_repo.commit_write_group()
326 tree_repo.unlock()
327 target = self.make_branch('target')325 target = self.make_branch('target')
328 tree.branch.repository.copy_content_into(target.repository)326 tree.branch.repository.copy_content_into(target.repository)
329 tree.branch.copy_content_into(target)327 tree.branch.copy_content_into(target)
330328
=== modified file 'breezy/tests/per_interrepository/test_fetch.py'
--- breezy/tests/per_interrepository/test_fetch.py 2018-11-11 04:08:32 +0000
+++ breezy/tests/per_interrepository/test_fetch.py 2019-05-29 03:45:01 +0000
@@ -32,6 +32,7 @@
32from breezy.bzr.vf_search import (32from breezy.bzr.vf_search import (
33 SearchResult,33 SearchResult,
34 )34 )
35from breezy.repository import WriteGroup
35from breezy.revision import (36from breezy.revision import (
36 NULL_REVISION,37 NULL_REVISION,
37 Revision,38 Revision,
@@ -110,8 +111,7 @@
110 source = tree.branch.repository111 source = tree.branch.repository
111 source.lock_write()112 source.lock_write()
112 self.addCleanup(source.unlock)113 self.addCleanup(source.unlock)
113 source.start_write_group()114 with WriteGroup(source):
114 try:
115 # We need two revisions: OLD and NEW. NEW will claim to need a file115 # We need two revisions: OLD and NEW. NEW will claim to need a file
116 # 'FOO' changed in 'OLD'. OLD will not have that file at all.116 # 'FOO' changed in 'OLD'. OLD will not have that file at all.
117 source.texts.insert_record_stream([117 source.texts.insert_record_stream([
@@ -133,11 +133,6 @@
133 revision_id=b'new',133 revision_id=b'new',
134 parent_ids=[revid])134 parent_ids=[revid])
135 source.add_revision(rev.revision_id, rev)135 source.add_revision(rev.revision_id, rev)
136 except:
137 source.abort_write_group()
138 raise
139 else:
140 source.commit_write_group()
141 to_repo.fetch(source, b'new')136 to_repo.fetch(source, b'new')
142 to_repo.lock_read()137 to_repo.lock_read()
143 self.addCleanup(to_repo.unlock)138 self.addCleanup(to_repo.unlock)
@@ -448,17 +443,12 @@
448 # We build a broken revision so that we can test the fetch code dies443 # We build a broken revision so that we can test the fetch code dies
449 # properly. So copy the inventory and revision, but not the text.444 # properly. So copy the inventory and revision, but not the text.
450 with to_repo.lock_write():445 with to_repo.lock_write():
451 to_repo.start_write_group()446 with WriteGroup(to_repo, suppress_errors=True):
452 try:
453 inv = tree.branch.repository.get_inventory(rev1)447 inv = tree.branch.repository.get_inventory(rev1)
454 to_repo.add_inventory(rev1, inv, [])448 to_repo.add_inventory(rev1, inv, [])
455 rev = tree.branch.repository.get_revision(rev1)449 rev = tree.branch.repository.get_revision(rev1)
456 to_repo.add_revision(rev1, rev, inv=inv)450 to_repo.add_revision(rev1, rev, inv=inv)
457 self.disable_commit_write_group_paranoia(to_repo)451 self.disable_commit_write_group_paranoia(to_repo)
458 to_repo.commit_write_group()
459 except:
460 to_repo.abort_write_group(suppress_errors=True)
461 raise
462452
463 # Implementations can either ensure that the target of the delta is453 # Implementations can either ensure that the target of the delta is
464 # reconstructable, or raise an exception (which stream based copies454 # reconstructable, or raise an exception (which stream based copies
465455
=== modified file 'breezy/tests/per_interrepository/test_interrepository.py'
--- breezy/tests/per_interrepository/test_interrepository.py 2018-11-11 04:08:32 +0000
+++ breezy/tests/per_interrepository/test_interrepository.py 2019-05-29 03:45:01 +0000
@@ -22,6 +22,7 @@
22import breezy.errors as errors22import breezy.errors as errors
23import breezy.gpg23import breezy.gpg
24from breezy.bzr.inventory import Inventory24from breezy.bzr.inventory import Inventory
25from breezy.repository import WriteGroup
25from breezy.revision import NULL_REVISION26from breezy.revision import NULL_REVISION
26from breezy.tests import (27from breezy.tests import (
27 TestNotApplicable,28 TestNotApplicable,
@@ -65,13 +66,10 @@
65 tree_a = self.make_branch_and_tree('a')66 tree_a = self.make_branch_and_tree('a')
66 self.controldir = tree_a.branch.controldir67 self.controldir = tree_a.branch.controldir
67 # add a corrupt inventory 'orphan'68 # add a corrupt inventory 'orphan'
68 tree_a.branch.repository.lock_write()69 with tree_a.branch.repository.lock_write(), WriteGroup(tree_a.branch.repository):
69 tree_a.branch.repository.start_write_group()70 if tree_a.branch.repository._format.supports_ghosts:
70 if tree_a.branch.repository._format.supports_ghosts:71 inv_file = tree_a.branch.repository.inventories
71 inv_file = tree_a.branch.repository.inventories72 inv_file.add_lines((b'orphan',), [], [])
72 inv_file.add_lines((b'orphan',), [], [])
73 tree_a.branch.repository.commit_write_group()
74 tree_a.branch.repository.unlock()
75 # add a real revision 'rev1'73 # add a real revision 'rev1'
76 self.rev1 = tree_a.commit('rev1', allow_pointless=True)74 self.rev1 = tree_a.commit('rev1', allow_pointless=True)
77 # add a real revision 'rev2' based on rev175 # add a real revision 'rev2' based on rev1
@@ -149,12 +147,10 @@
149 'to repository does not support signatures')147 'to repository does not support signatures')
150 # and sign 'rev2'148 # and sign 'rev2'
151 tree_a = WorkingTree.open('a')149 tree_a = WorkingTree.open('a')
152 tree_a.branch.repository.lock_write()150 with tree_a.branch.repository.lock_write(), \
153 tree_a.branch.repository.start_write_group()151 WriteGroup(tree_a.branch.repository):
154 tree_a.branch.repository.sign_revision(self.rev2,152 tree_a.branch.repository.sign_revision(
155 breezy.gpg.LoopbackGPGStrategy(None))153 self.rev2, breezy.gpg.LoopbackGPGStrategy(None))
156 tree_a.branch.repository.commit_write_group()
157 tree_a.branch.repository.unlock()
158154
159 from_repo = self.controldir.open_repository()155 from_repo = self.controldir.open_repository()
160 from_signature = from_repo.get_signature_text(self.rev2)156 from_signature = from_repo.get_signature_text(self.rev2)
161157
=== modified file 'breezy/tests/per_pack_repository.py'
--- breezy/tests/per_pack_repository.py 2019-01-09 00:04:02 +0000
+++ breezy/tests/per_pack_repository.py 2019-05-29 03:45:01 +0000
@@ -473,26 +473,15 @@
473 r1 = repository.Repository.open('.')473 r1 = repository.Repository.open('.')
474 r2 = repository.Repository.open('.')474 r2 = repository.Repository.open('.')
475 # add a pack to drop475 # add a pack to drop
476 r1.lock_write()476 with r1.lock_write():
477 try:477 with repository.WriteGroup(r1):
478 r1.start_write_group()
479 try:
480 self._add_text(r1, b'fileidr1')478 self._add_text(r1, b'fileidr1')
481 except:
482 r1.abort_write_group()
483 raise
484 else:
485 r1.commit_write_group()
486 r1._pack_collection.ensure_loaded()479 r1._pack_collection.ensure_loaded()
487 name_to_drop = r1._pack_collection.all_packs()[0].name480 name_to_drop = r1._pack_collection.all_packs()[0].name
488 finally:481 with r1.lock_write():
489 r1.unlock()
490 r1.lock_write()
491 try:
492 # access enough data to load the names list482 # access enough data to load the names list
493 list(r1.all_revision_ids())483 list(r1.all_revision_ids())
494 r2.lock_write()484 with r2.lock_write():
495 try:
496 # access enough data to load the names list485 # access enough data to load the names list
497 list(r2.all_revision_ids())486 list(r2.all_revision_ids())
498 r1._pack_collection.ensure_loaded()487 r1._pack_collection.ensure_loaded()
@@ -533,10 +522,6 @@
533 r2._pack_collection.names())522 r2._pack_collection.names())
534 self.assertEqual(1, len(r1._pack_collection.names()))523 self.assertEqual(1, len(r1._pack_collection.names()))
535 self.assertFalse(name_to_drop in r1._pack_collection.names())524 self.assertFalse(name_to_drop in r1._pack_collection.names())
536 finally:
537 r2.unlock()
538 finally:
539 r1.unlock()
540525
541 def test_concurrent_pack_triggers_reload(self):526 def test_concurrent_pack_triggers_reload(self):
542 # create 2 packs, which we will then collapse527 # create 2 packs, which we will then collapse
543528
=== modified file 'breezy/tests/per_repository/test_signatures.py'
--- breezy/tests/per_repository/test_signatures.py 2018-11-29 23:42:41 +0000
+++ breezy/tests/per_repository/test_signatures.py 2019-05-29 03:45:01 +0000
@@ -22,7 +22,7 @@
22 tests,22 tests,
23 urlutils,23 urlutils,
24 )24 )
2525from breezy.repository import WriteGroup
26from breezy.bzr.testament import Testament26from breezy.bzr.testament import Testament
27from breezy.tests import per_repository27from breezy.tests import per_repository
2828
@@ -58,24 +58,14 @@
58 def test_store_signature(self):58 def test_store_signature(self):
59 wt = self.make_branch_and_tree('.')59 wt = self.make_branch_and_tree('.')
60 branch = wt.branch60 branch = wt.branch
61 branch.lock_write()61 with branch.lock_write(), WriteGroup(branch.repository):
62 try:
63 branch.repository.start_write_group()
64 try:62 try:
65 branch.repository.store_revision_signature(63 branch.repository.store_revision_signature(
66 gpg.LoopbackGPGStrategy(None), b'FOO', b'A')64 gpg.LoopbackGPGStrategy(None), b'FOO', b'A')
67 except errors.NoSuchRevision:65 except errors.NoSuchRevision:
68 branch.repository.abort_write_group()
69 raise tests.TestNotApplicable(66 raise tests.TestNotApplicable(
70 "repository does not support signing non-present"67 "repository does not support signing non-present"
71 "revisions")68 "revisions")
72 except:
73 branch.repository.abort_write_group()
74 raise
75 else:
76 branch.repository.commit_write_group()
77 finally:
78 branch.unlock()
79 # A signature without a revision should not be accessible.69 # A signature without a revision should not be accessible.
80 self.assertRaises(errors.NoSuchRevision,70 self.assertRaises(errors.NoSuchRevision,
81 branch.repository.has_signature_for_revision_id,71 branch.repository.has_signature_for_revision_id,
8272
=== modified file 'breezy/tests/per_repository_chk/test_supported.py'
--- breezy/tests/per_repository_chk/test_supported.py 2018-11-16 11:37:47 +0000
+++ breezy/tests/per_repository_chk/test_supported.py 2019-05-29 03:45:01 +0000
@@ -38,24 +38,14 @@
3838
39 def test_add_bytes_to_chk_bytes_store(self):39 def test_add_bytes_to_chk_bytes_store(self):
40 repo = self.make_repository('.')40 repo = self.make_repository('.')
41 repo.lock_write()41 with repo.lock_write(), repository.WriteGroup(repo):
42 try:42 sha1, len, _ = repo.chk_bytes.add_lines(
43 repo.start_write_group()43 (None,), None, [b"foo\n", b"bar\n"], random_id=True)
44 try:44 self.assertEqual(
45 sha1, len, _ = repo.chk_bytes.add_lines((None,),45 b'4e48e2c9a3d2ca8a708cb0cc545700544efb5021', sha1)
46 None, [b"foo\n", b"bar\n"], random_id=True)46 self.assertEqual(
47 self.assertEqual(b'4e48e2c9a3d2ca8a708cb0cc545700544efb5021',47 {(b'sha1:4e48e2c9a3d2ca8a708cb0cc545700544efb5021',)},
48 sha1)48 repo.chk_bytes.keys())
49 self.assertEqual(
50 {(b'sha1:4e48e2c9a3d2ca8a708cb0cc545700544efb5021',)},
51 repo.chk_bytes.keys())
52 except:
53 repo.abort_write_group()
54 raise
55 else:
56 repo.commit_write_group()
57 finally:
58 repo.unlock()
59 # And after an unlock/lock pair49 # And after an unlock/lock pair
60 with repo.lock_read():50 with repo.lock_read():
61 self.assertEqual(51 self.assertEqual(
@@ -76,46 +66,25 @@
76 node_sha1 = osutils.sha_strings(node_lines)66 node_sha1 = osutils.sha_strings(node_lines)
77 expected_set = {(b'sha1:' + leaf_sha1,), (b'sha1:' + node_sha1,)}67 expected_set = {(b'sha1:' + leaf_sha1,), (b'sha1:' + node_sha1,)}
78 repo = self.make_repository('.')68 repo = self.make_repository('.')
79 repo.lock_write()69 with repo.lock_write():
80 try:70 with repository.WriteGroup(repo):
81 repo.start_write_group()
82 try:
83 # Internal node pointing at a leaf.71 # Internal node pointing at a leaf.
84 repo.chk_bytes.add_lines(72 repo.chk_bytes.add_lines((None,), None, node_lines, random_id=True)
85 (None,), None, node_lines, random_id=True)73 with repository.WriteGroup(repo):
86 except:
87 repo.abort_write_group()
88 raise
89 else:
90 repo.commit_write_group()
91 repo.start_write_group()
92 try:
93 # Leaf in a separate pack.74 # Leaf in a separate pack.
94 repo.chk_bytes.add_lines(75 repo.chk_bytes.add_lines((None,), None, leaf_lines, random_id=True)
95 (None,), None, leaf_lines, random_id=True)
96 except:
97 repo.abort_write_group()
98 raise
99 else:
100 repo.commit_write_group()
101 repo.pack()76 repo.pack()
102 self.assertEqual(expected_set, repo.chk_bytes.keys())77 self.assertEqual(expected_set, repo.chk_bytes.keys())
103 finally:
104 repo.unlock()
105 # and reopening78 # and reopening
106 repo = repo.controldir.open_repository()79 repo = repo.controldir.open_repository()
107 repo.lock_read()80 with repo.lock_read():
108 try:
109 self.assertEqual(expected_set, repo.chk_bytes.keys())81 self.assertEqual(expected_set, repo.chk_bytes.keys())
110 finally:
111 repo.unlock()
11282
113 def test_chk_bytes_are_fully_buffered(self):83 def test_chk_bytes_are_fully_buffered(self):
114 repo = self.make_repository('.')84 repo = self.make_repository('.')
115 repo.lock_write()85 repo.lock_write()
116 self.addCleanup(repo.unlock)86 self.addCleanup(repo.unlock)
117 repo.start_write_group()87 with repository.WriteGroup(repo):
118 try:
119 sha1, len, _ = repo.chk_bytes.add_lines((None,),88 sha1, len, _ = repo.chk_bytes.add_lines((None,),
120 None, [b"foo\n", b"bar\n"], random_id=True)89 None, [b"foo\n", b"bar\n"], random_id=True)
121 self.assertEqual(b'4e48e2c9a3d2ca8a708cb0cc545700544efb5021',90 self.assertEqual(b'4e48e2c9a3d2ca8a708cb0cc545700544efb5021',
@@ -123,11 +92,6 @@
123 self.assertEqual(92 self.assertEqual(
124 {(b'sha1:4e48e2c9a3d2ca8a708cb0cc545700544efb5021',)},93 {(b'sha1:4e48e2c9a3d2ca8a708cb0cc545700544efb5021',)},
125 repo.chk_bytes.keys())94 repo.chk_bytes.keys())
126 except:
127 repo.abort_write_group()
128 raise
129 else:
130 repo.commit_write_group()
131 # This may not always be correct if we change away from BTreeGraphIndex95 # This may not always be correct if we change away from BTreeGraphIndex
132 # in the future. But for now, lets check that chk_bytes are fully96 # in the future. But for now, lets check that chk_bytes are fully
133 # buffered97 # buffered
13498
=== modified file 'breezy/tests/per_repository_reference/test_add_inventory.py'
--- breezy/tests/per_repository_reference/test_add_inventory.py 2018-11-11 04:08:32 +0000
+++ breezy/tests/per_repository_reference/test_add_inventory.py 2019-05-29 03:45:01 +0000
@@ -17,6 +17,7 @@
17"""Tests for add_inventory on a repository with external references."""17"""Tests for add_inventory on a repository with external references."""
1818
19from breezy import errors19from breezy import errors
20from breezy.repository import WriteGroup
20from breezy.tests.per_repository_reference import (21from breezy.tests.per_repository_reference import (
21 TestCaseWithExternalReferenceRepository,22 TestCaseWithExternalReferenceRepository,
22 )23 )
@@ -34,18 +35,8 @@
34 self.addCleanup(tree.unlock)35 self.addCleanup(tree.unlock)
35 base = self.make_repository('base')36 base = self.make_repository('base')
36 repo = self.make_referring('referring', base)37 repo = self.make_referring('referring', base)
37 repo.lock_write()38 with repo.lock_write(), WriteGroup(repo):
38 try:39 repo.add_inventory(revid, inv, [])
39 repo.start_write_group()
40 try:
41 repo.add_inventory(revid, inv, [])
42 except:
43 repo.abort_write_group()
44 raise
45 else:
46 repo.commit_write_group()
47 finally:
48 repo.unlock()
49 repo.lock_read()40 repo.lock_read()
50 self.addCleanup(repo.unlock)41 self.addCleanup(repo.unlock)
51 inv2 = repo.get_inventory(revid)42 inv2 = repo.get_inventory(revid)
5243
=== modified file 'breezy/tests/per_repository_reference/test_add_revision.py'
--- breezy/tests/per_repository_reference/test_add_revision.py 2017-05-21 18:10:28 +0000
+++ breezy/tests/per_repository_reference/test_add_revision.py 2019-05-29 03:45:01 +0000
@@ -17,6 +17,7 @@
17"""Tests for add_revision on a repository with external references."""17"""Tests for add_revision on a repository with external references."""
1818
19from breezy import errors19from breezy import errors
20from breezy.repository import WriteGroup
20from breezy.tests.per_repository_reference import (21from breezy.tests.per_repository_reference import (
21 TestCaseWithExternalReferenceRepository,22 TestCaseWithExternalReferenceRepository,
22 )23 )
@@ -35,20 +36,10 @@
35 rev = tree.branch.repository.get_revision(revid)36 rev = tree.branch.repository.get_revision(revid)
36 base = self.make_repository('base')37 base = self.make_repository('base')
37 repo = self.make_referring('referring', base)38 repo = self.make_referring('referring', base)
38 repo.lock_write()39 with repo.lock_write(), WriteGroup(repo):
39 try:40 rev = tree.branch.repository.get_revision(revid)
40 repo.start_write_group()41 repo.texts.add_lines((inv.root.file_id, revid), [], [])
41 try:42 repo.add_revision(revid, rev, inv=inv)
42 rev = tree.branch.repository.get_revision(revid)
43 repo.texts.add_lines((inv.root.file_id, revid), [], [])
44 repo.add_revision(revid, rev, inv=inv)
45 except:
46 repo.abort_write_group()
47 raise
48 else:
49 repo.commit_write_group()
50 finally:
51 repo.unlock()
52 rev2 = repo.get_revision(revid)43 rev2 = repo.get_revision(revid)
53 self.assertEqual(rev, rev2)44 self.assertEqual(rev, rev2)
54 self.assertRaises(errors.NoSuchRevision, base.get_revision, revid)45 self.assertRaises(errors.NoSuchRevision, base.get_revision, revid)
5546
=== modified file 'breezy/tests/per_repository_reference/test_add_signature_text.py'
--- breezy/tests/per_repository_reference/test_add_signature_text.py 2018-11-11 04:08:32 +0000
+++ breezy/tests/per_repository_reference/test_add_signature_text.py 2019-05-29 03:45:01 +0000
@@ -17,6 +17,7 @@
17"""Tests for add_signature_text on a repository with external references."""17"""Tests for add_signature_text on a repository with external references."""
1818
19from breezy import errors19from breezy import errors
20from breezy.repository import WriteGroup
20from breezy.tests.per_repository_reference import (21from breezy.tests.per_repository_reference import (
21 TestCaseWithExternalReferenceRepository,22 TestCaseWithExternalReferenceRepository,
22 )23 )
@@ -34,20 +35,11 @@
34 self.addCleanup(tree.unlock)35 self.addCleanup(tree.unlock)
35 base = self.make_repository('base')36 base = self.make_repository('base')
36 repo = self.make_referring('referring', base)37 repo = self.make_referring('referring', base)
37 repo.lock_write()38 with repo.lock_write(), WriteGroup(repo):
38 try:39 rev = tree.branch.repository.get_revision(revid)
39 repo.start_write_group()40 repo.texts.add_lines((inv.root.file_id, revid), [], [])
40 try:41 repo.add_revision(revid, rev, inv=inv)
41 rev = tree.branch.repository.get_revision(revid)42 repo.add_signature_text(revid, b"text")
42 repo.texts.add_lines((inv.root.file_id, revid), [], [])
43 repo.add_revision(revid, rev, inv=inv)
44 repo.add_signature_text(revid, b"text")
45 repo.commit_write_group()
46 except:
47 repo.abort_write_group()
48 raise
49 finally:
50 repo.unlock()
51 repo.get_signature_text(revid)43 repo.get_signature_text(revid)
52 self.assertRaises(errors.NoSuchRevision, base.get_signature_text,44 self.assertRaises(errors.NoSuchRevision, base.get_signature_text,
53 revid)45 revid)
5446
=== modified file 'breezy/tests/per_repository_vf/helpers.py'
--- breezy/tests/per_repository_vf/helpers.py 2018-11-11 04:08:32 +0000
+++ breezy/tests/per_repository_vf/helpers.py 2019-05-29 03:45:01 +0000
@@ -20,6 +20,7 @@
20 osutils,20 osutils,
21 revision as _mod_revision,21 revision as _mod_revision,
22 )22 )
23from ...repository import WriteGroup
23from ...bzr import (24from ...bzr import (
24 inventory,25 inventory,
25 )26 )
@@ -50,9 +51,7 @@
50 "%s isn't a knit format" % self.repository_format)51 "%s isn't a knit format" % self.repository_format)
5152
52 repo = self.make_repository('broken')53 repo = self.make_repository('broken')
53 repo.lock_write()54 with repo.lock_write(), WriteGroup(repo):
54 repo.start_write_group()
55 try:
56 inv = inventory.Inventory(revision_id=b'revision-id')55 inv = inventory.Inventory(revision_id=b'revision-id')
57 inv.root.revision = b'revision-id'56 inv.root.revision = b'revision-id'
58 inv_sha1 = repo.add_inventory(b'revision-id', inv, [])57 inv_sha1 = repo.add_inventory(b'revision-id', inv, [])
@@ -66,16 +65,9 @@
66 # Manually add the revision text using the RevisionStore API, with65 # Manually add the revision text using the RevisionStore API, with
67 # bad parents.66 # bad parents.
68 rev_text = repo._serializer.write_revision_to_string(revision)67 rev_text = repo._serializer.write_revision_to_string(revision)
69 repo.revisions.add_lines((revision.revision_id,),68 repo.revisions.add_lines(
70 [(b'incorrect-parent',)],69 (revision.revision_id,), [(b'incorrect-parent',)],
71 osutils.split_lines(rev_text))70 osutils.split_lines(rev_text))
72 except:
73 repo.abort_write_group()
74 repo.unlock()
75 raise
76 else:
77 repo.commit_write_group()
78 repo.unlock()
7971
80 repo.lock_write()72 repo.lock_write()
81 self.addCleanup(repo.unlock)73 self.addCleanup(repo.unlock)
8274
=== modified file 'breezy/tests/per_repository_vf/test_check_reconcile.py'
--- breezy/tests/per_repository_vf/test_check_reconcile.py 2018-11-11 04:08:32 +0000
+++ breezy/tests/per_repository_vf/test_check_reconcile.py 2019-05-29 03:45:01 +0000
@@ -25,6 +25,7 @@
25 Inventory,25 Inventory,
26 InventoryFile,26 InventoryFile,
27 )27 )
28from breezy.repository import WriteGroup
28from breezy.revision import (29from breezy.revision import (
29 NULL_REVISION,30 NULL_REVISION,
30 Revision,31 Revision,
@@ -793,15 +794,9 @@
793 def make_populated_repository(self, factory):794 def make_populated_repository(self, factory):
794 """Create a new repository populated by the given factory."""795 """Create a new repository populated by the given factory."""
795 repo = self.make_repository('broken-repo')796 repo = self.make_repository('broken-repo')
796 with repo.lock_write():797 with repo.lock_write(), WriteGroup(repo):
797 repo.start_write_group()798 factory(repo)
798 try:799 return repo
799 factory(repo)
800 repo.commit_write_group()
801 return repo
802 except:
803 repo.abort_write_group()
804 raise
805800
806 def add_revision(self, repo, revision_id, inv, parent_ids):801 def add_revision(self, repo, revision_id, inv, parent_ids):
807 """Add a revision with a given inventory and parents to a repository.802 """Add a revision with a given inventory and parents to a repository.
808803
=== modified file 'breezy/tests/per_repository_vf/test_repository.py'
--- breezy/tests/per_repository_vf/test_repository.py 2019-01-01 21:08:01 +0000
+++ breezy/tests/per_repository_vf/test_repository.py 2019-05-29 03:45:01 +0000
@@ -327,19 +327,9 @@
327 self.controldir = tree_a.branch.controldir327 self.controldir = tree_a.branch.controldir
328 # add a corrupt inventory 'orphan'328 # add a corrupt inventory 'orphan'
329 # this may need some generalising for knits.329 # this may need some generalising for knits.
330 tree_a.lock_write()330 with tree_a.lock_write(), _mod_repository.WriteGroup(tree_a.branch.repository):
331 try:331 inv_file = tree_a.branch.repository.inventories
332 tree_a.branch.repository.start_write_group()332 inv_file.add_lines((b'orphan',), [], [])
333 try:
334 inv_file = tree_a.branch.repository.inventories
335 inv_file.add_lines((b'orphan',), [], [])
336 except:
337 tree_a.branch.repository.commit_write_group()
338 raise
339 else:
340 tree_a.branch.repository.abort_write_group()
341 finally:
342 tree_a.unlock()
343 # add a real revision 'rev1'333 # add a real revision 'rev1'
344 tree_a.commit('rev1', rev_id=b'rev1', allow_pointless=True)334 tree_a.commit('rev1', rev_id=b'rev1', allow_pointless=True)
345 # add a real revision 'rev2' based on rev1335 # add a real revision 'rev2' based on rev1
@@ -385,18 +375,13 @@
385375
386 def test_reserved_id(self):376 def test_reserved_id(self):
387 repo = self.make_repository('repository')377 repo = self.make_repository('repository')
388 repo.lock_write()378 with repo.lock_write(), _mod_repository.WriteGroup(repo):
389 repo.start_write_group()
390 try:
391 self.assertRaises(errors.ReservedId, repo.add_inventory,379 self.assertRaises(errors.ReservedId, repo.add_inventory,
392 b'reserved:', None, None)380 b'reserved:', None, None)
393 self.assertRaises(errors.ReservedId, repo.add_inventory_by_delta,381 self.assertRaises(errors.ReservedId, repo.add_inventory_by_delta,
394 "foo", [], b'reserved:', None)382 "foo", [], b'reserved:', None)
395 self.assertRaises(errors.ReservedId, repo.add_revision,383 self.assertRaises(
396 b'reserved:', None)384 errors.ReservedId, repo.add_revision, b'reserved:', None)
397 finally:
398 repo.abort_write_group()
399 repo.unlock()
400385
401386
402class TestCaseWithCorruptRepository(TestCaseWithRepository):387class TestCaseWithCorruptRepository(TestCaseWithRepository):
403388
=== modified file 'breezy/tests/test_inv.py'
--- breezy/tests/test_inv.py 2018-11-16 11:37:47 +0000
+++ breezy/tests/test_inv.py 2019-05-29 03:45:01 +0000
@@ -141,8 +141,7 @@
141141
142142
143def _create_repo_revisions(repo, basis, delta, invalid_delta):143def _create_repo_revisions(repo, basis, delta, invalid_delta):
144 repo.start_write_group()144 with repository.WriteGroup(repo):
145 try:
146 rev = revision.Revision(b'basis', timestamp=0, timezone=None,145 rev = revision.Revision(b'basis', timestamp=0, timezone=None,
147 message="", committer="foo@example.com")146 message="", committer="foo@example.com")
148 basis.revision_id = b'basis'147 basis.revision_id = b'basis'
@@ -161,19 +160,13 @@
161 rev = revision.Revision(b'result', timestamp=0, timezone=None,160 rev = revision.Revision(b'result', timestamp=0, timezone=None,
162 message="", committer="foo@example.com")161 message="", committer="foo@example.com")
163 repo.add_revision(b'result', rev, result_inv)162 repo.add_revision(b'result', rev, result_inv)
164 repo.commit_write_group()
165 except:
166 repo.abort_write_group()
167 raise
168 return target_entries163 return target_entries
169164
170165
171def _get_basis_entries(tree):166def _get_basis_entries(tree):
172 basis_tree = tree.basis_tree()167 basis_tree = tree.basis_tree()
173 basis_tree.lock_read()168 with basis_tree.lock_read():
174 basis_tree_entries = list(basis_tree.inventory.iter_entries_by_dir())169 return list(basis_tree.inventory.iter_entries_by_dir())
175 basis_tree.unlock()
176 return basis_tree_entries
177170
178171
179def _populate_different_tree(tree, basis, delta):172def _populate_different_tree(tree, basis, delta):
@@ -253,28 +246,16 @@
253 format = self.format()246 format = self.format()
254 control = self.make_controldir('tree', format=format._matchingcontroldir)247 control = self.make_controldir('tree', format=format._matchingcontroldir)
255 repo = format.initialize(control)248 repo = format.initialize(control)
256 with repo.lock_write():249 with repo.lock_write(), repository.WriteGroup(repo):
257 repo.start_write_group()250 rev = revision.Revision(
258 try:251 b'basis', timestamp=0, timezone=None, message="",
259 rev = revision.Revision(b'basis', timestamp=0, timezone=None,252 committer="foo@example.com")
260 message="", committer="foo@example.com")253 basis.revision_id = b'basis'
261 basis.revision_id = b'basis'254 create_texts_for_inv(repo, basis)
262 create_texts_for_inv(repo, basis)255 repo.add_revision(b'basis', rev, basis)
263 repo.add_revision(b'basis', rev, basis)256 with repo.lock_write(), repository.WriteGroup(repo):
264 repo.commit_write_group()257 inv_sha1 = repo.add_inventory_by_delta(
265 except:258 b'basis', delta, b'result', [b'basis'])
266 repo.abort_write_group()
267 raise
268 with repo.lock_write():
269 repo.start_write_group()
270 try:
271 inv_sha1 = repo.add_inventory_by_delta(b'basis', delta,
272 b'result', [b'basis'])
273 except:
274 repo.abort_write_group()
275 raise
276 else:
277 repo.commit_write_group()
278 # Fresh lock, reads disk again.259 # Fresh lock, reads disk again.
279 repo = repo.controldir.open_repository()260 repo = repo.controldir.open_repository()
280 repo.lock_read()261 repo.lock_read()

Subscribers

People subscribed via source and target branches