Merge lp:~mwhudson/launchpad/no-hosted-area-fix-directbranchcommit into lp:launchpad
- no-hosted-area-fix-directbranchcommit
- Merge into devel
Proposed by
Michael Hudson-Doyle
Status: | Merged |
---|---|
Approved by: | Tim Penhey |
Approved revision: | no longer in the source branch. |
Merged at revision: | 10828 |
Proposed branch: | lp:~mwhudson/launchpad/no-hosted-area-fix-directbranchcommit |
Merge into: | lp:launchpad |
Prerequisite: | lp:~mwhudson/launchpad/no-hosted-area-safe-getBzrBranch |
Diff against target: |
305 lines (+26/-82) 7 files modified
lib/lp/code/model/directbranchcommit.py (+2/-19) lib/lp/code/model/tests/test_diff.py (+1/-1) lib/lp/code/tests/test_directbranchcommit.py (+3/-21) lib/lp/testing/__init__.py (+12/-32) lib/lp/translations/scripts/tests/test_translations_to_branch.py (+5/-6) lib/lp/translations/scripts/translations_to_branch.py (+2/-2) lib/lp/translations/tests/test_translationtemplatesbuildjob.py (+1/-1) |
To merge this branch: | bzr merge lp:~mwhudson/launchpad/no-hosted-area-fix-directbranchcommit |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Tim Penhey (community) | Approve | ||
Review via email:
|
Commit message
Description of the change
Hi Tim,
This branch simplifies DirectBranchCommit and makes it work with in the new world.
It changes the behaviour of the useBzrBranches() test helper some, which will probably break lots of tests that I'll fix in the next few pipes...
Cheers,
mwh
To post a comment you must log in.
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'lib/lp/code/model/directbranchcommit.py' | |||
2 | --- lib/lp/code/model/directbranchcommit.py 2010-04-27 02:23:05 +0000 | |||
3 | +++ lib/lp/code/model/directbranchcommit.py 2010-04-27 02:23:25 +0000 | |||
4 | @@ -12,13 +12,11 @@ | |||
5 | 12 | 12 | ||
6 | 13 | import os.path | 13 | import os.path |
7 | 14 | 14 | ||
8 | 15 | from bzrlib.branch import Branch | ||
9 | 16 | from bzrlib.generate_ids import gen_file_id | 15 | from bzrlib.generate_ids import gen_file_id |
10 | 17 | from bzrlib.revision import NULL_REVISION | 16 | from bzrlib.revision import NULL_REVISION |
11 | 18 | from bzrlib.transform import TransformPreview, ROOT_PARENT | 17 | from bzrlib.transform import TransformPreview, ROOT_PARENT |
12 | 19 | 18 | ||
13 | 20 | from canonical.launchpad.interfaces import IMasterObject | 19 | from canonical.launchpad.interfaces import IMasterObject |
14 | 21 | from lp.codehosting.vfs import make_branch_mirrorer | ||
15 | 22 | 20 | ||
16 | 23 | 21 | ||
17 | 24 | class ConcurrentUpdateError(Exception): | 22 | class ConcurrentUpdateError(Exception): |
18 | @@ -49,7 +47,7 @@ | |||
19 | 49 | is_locked = False | 47 | is_locked = False |
20 | 50 | commit_builder = None | 48 | commit_builder = None |
21 | 51 | 49 | ||
23 | 52 | def __init__(self, db_branch, committer=None, to_mirror=False): | 50 | def __init__(self, db_branch, committer=None): |
24 | 53 | """Create context for direct commit to branch. | 51 | """Create context for direct commit to branch. |
25 | 54 | 52 | ||
26 | 55 | Before constructing a `DirectBranchCommit`, set up a server that | 53 | Before constructing a `DirectBranchCommit`, set up a server that |
27 | @@ -68,11 +66,8 @@ | |||
28 | 68 | 66 | ||
29 | 69 | :param db_branch: a Launchpad `Branch` object. | 67 | :param db_branch: a Launchpad `Branch` object. |
30 | 70 | :param committer: the `Person` writing to the branch. | 68 | :param committer: the `Person` writing to the branch. |
31 | 71 | :param to_mirror: If True, write to the mirrored copy of the branch | ||
32 | 72 | instead of the hosted copy. (Mainly useful for tests) | ||
33 | 73 | """ | 69 | """ |
34 | 74 | self.db_branch = db_branch | 70 | self.db_branch = db_branch |
35 | 75 | self.to_mirror = to_mirror | ||
36 | 76 | 71 | ||
37 | 77 | self.last_scanned_id = self.db_branch.last_scanned_id | 72 | self.last_scanned_id = self.db_branch.last_scanned_id |
38 | 78 | 73 | ||
39 | @@ -83,15 +78,7 @@ | |||
40 | 83 | # Directories we create on the branch, and their ids. | 78 | # Directories we create on the branch, and their ids. |
41 | 84 | self.path_ids = {} | 79 | self.path_ids = {} |
42 | 85 | 80 | ||
52 | 86 | if to_mirror: | 81 | self.bzrbranch = self.db_branch.getBzrBranch() |
44 | 87 | self.bzrbranch = Branch.open(self.db_branch.warehouse_url) | ||
45 | 88 | else: | ||
46 | 89 | # Have the opening done through a branch mirrorer. It will | ||
47 | 90 | # pick the right policy. In case we're writing to a hosted | ||
48 | 91 | # branch stacked on a mirrored branch, the mirrorer knows | ||
49 | 92 | # how to do the right thing. | ||
50 | 93 | mirrorer = make_branch_mirrorer(self.db_branch.branch_type) | ||
51 | 94 | self.bzrbranch = mirrorer.open(self.db_branch.getPullURL()) | ||
53 | 95 | 82 | ||
54 | 96 | self.bzrbranch.lock_write() | 83 | self.bzrbranch.lock_write() |
55 | 97 | self.is_locked = True | 84 | self.is_locked = True |
56 | @@ -167,10 +154,6 @@ | |||
57 | 167 | 154 | ||
58 | 168 | If it does, raise `ConcurrentUpdateError`. | 155 | If it does, raise `ConcurrentUpdateError`. |
59 | 169 | """ | 156 | """ |
60 | 170 | # A different last_scanned_id does not indicate a race for mirrored | ||
61 | 171 | # branches -- last_scanned_id is a proxy for the mirrored branch. | ||
62 | 172 | if self.to_mirror: | ||
63 | 173 | return | ||
64 | 174 | assert self.is_locked, "Getting revision on un-locked branch." | 157 | assert self.is_locked, "Getting revision on un-locked branch." |
65 | 175 | last_revision = self.bzrbranch.last_revision() | 158 | last_revision = self.bzrbranch.last_revision() |
66 | 176 | if last_revision != self.last_scanned_id: | 159 | if last_revision != self.last_scanned_id: |
67 | 177 | 160 | ||
68 | === modified file 'lib/lp/code/model/tests/test_diff.py' | |||
69 | --- lib/lp/code/model/tests/test_diff.py 2010-04-27 02:23:05 +0000 | |||
70 | +++ lib/lp/code/model/tests/test_diff.py 2010-04-27 02:23:25 +0000 | |||
71 | @@ -44,7 +44,7 @@ | |||
72 | 44 | 44 | ||
73 | 45 | This will create or modify the file, as needed. | 45 | This will create or modify the file, as needed. |
74 | 46 | """ | 46 | """ |
76 | 47 | committer = DirectBranchCommit(branch, to_mirror=True) | 47 | committer = DirectBranchCommit(branch) |
77 | 48 | committer.writeFile(path, contents) | 48 | committer.writeFile(path, contents) |
78 | 49 | try: | 49 | try: |
79 | 50 | return committer.commit('committing') | 50 | return committer.commit('committing') |
80 | 51 | 51 | ||
81 | === modified file 'lib/lp/code/tests/test_directbranchcommit.py' | |||
82 | --- lib/lp/code/tests/test_directbranchcommit.py 2009-11-18 14:34:45 +0000 | |||
83 | +++ lib/lp/code/tests/test_directbranchcommit.py 2010-04-27 02:23:25 +0000 | |||
84 | @@ -20,10 +20,10 @@ | |||
85 | 20 | 20 | ||
86 | 21 | def setUp(self): | 21 | def setUp(self): |
87 | 22 | super(DirectBranchCommitTestCase, self).setUp() | 22 | super(DirectBranchCommitTestCase, self).setUp() |
89 | 23 | self.useBzrBranches() | 23 | self.useBzrBranches(direct_database=True) |
90 | 24 | 24 | ||
91 | 25 | self.series = self.factory.makeProductSeries() | 25 | self.series = self.factory.makeProductSeries() |
93 | 26 | self.db_branch, self.tree = self.create_branch_and_tree(hosted=True) | 26 | self.db_branch, self.tree = self.create_branch_and_tree() |
94 | 27 | 27 | ||
95 | 28 | self.series.translations_branch = self.db_branch | 28 | self.series.translations_branch = self.db_branch |
96 | 29 | 29 | ||
97 | @@ -46,7 +46,7 @@ | |||
98 | 46 | 46 | ||
99 | 47 | def _getContents(self): | 47 | def _getContents(self): |
100 | 48 | """Return branch contents as dict mapping filenames to contents.""" | 48 | """Return branch contents as dict mapping filenames to contents.""" |
102 | 49 | return map_branch_contents(self.committer.db_branch.getPullURL()) | 49 | return map_branch_contents(self.committer.db_branch.getBzrBranch()) |
103 | 50 | 50 | ||
104 | 51 | 51 | ||
105 | 52 | class TestDirectBranchCommit(DirectBranchCommitTestCase): | 52 | class TestDirectBranchCommit(DirectBranchCommitTestCase): |
106 | @@ -229,23 +229,5 @@ | |||
107 | 229 | self.assertEqual(dir_id, self.committer._getDir('foo/bar')) | 229 | self.assertEqual(dir_id, self.committer._getDir('foo/bar')) |
108 | 230 | 230 | ||
109 | 231 | 231 | ||
110 | 232 | class TestDirectBranchCommitMirror(TestCaseWithFactory): | ||
111 | 233 | |||
112 | 234 | layer = ZopelessDatabaseLayer | ||
113 | 235 | |||
114 | 236 | def test_direct_branch_commit_respects_to_mirror(self): | ||
115 | 237 | # The "to_mirror" argument causes the commit to apply to the mirrored | ||
116 | 238 | # copy of the branch. | ||
117 | 239 | self.useBzrBranches() | ||
118 | 240 | branch = self.factory.makeBranch() | ||
119 | 241 | bzr_branch = self.createBzrBranch(branch) | ||
120 | 242 | dbc = DirectBranchCommit(branch, to_mirror=True) | ||
121 | 243 | try: | ||
122 | 244 | dbc.writeFile('path', 'contents') | ||
123 | 245 | dbc.commit('making commit to mirrored area.') | ||
124 | 246 | finally: | ||
125 | 247 | dbc.unlock() | ||
126 | 248 | |||
127 | 249 | |||
128 | 250 | def test_suite(): | 232 | def test_suite(): |
129 | 251 | return TestLoader().loadTestsFromName(__name__) | 233 | return TestLoader().loadTestsFromName(__name__) |
130 | 252 | 234 | ||
131 | === modified file 'lib/lp/testing/__init__.py' | |||
132 | --- lib/lp/testing/__init__.py 2010-04-27 02:23:05 +0000 | |||
133 | +++ lib/lp/testing/__init__.py 2010-04-27 02:23:25 +0000 | |||
134 | @@ -411,7 +411,7 @@ | |||
135 | 411 | self.addCleanup(logout) | 411 | self.addCleanup(logout) |
136 | 412 | from lp.testing.factory import LaunchpadObjectFactory | 412 | from lp.testing.factory import LaunchpadObjectFactory |
137 | 413 | self.factory = LaunchpadObjectFactory() | 413 | self.factory = LaunchpadObjectFactory() |
139 | 414 | self.real_bzr_server = False | 414 | self.direct_database_server = False |
140 | 415 | 415 | ||
141 | 416 | def getUserBrowser(self, url=None, user=None, password='test'): | 416 | def getUserBrowser(self, url=None, user=None, password='test'): |
142 | 417 | """Return a Browser logged in as a fresh user, maybe opened at `url`. | 417 | """Return a Browser logged in as a fresh user, maybe opened at `url`. |
143 | @@ -443,11 +443,6 @@ | |||
144 | 443 | """ | 443 | """ |
145 | 444 | if format is not None and isinstance(format, basestring): | 444 | if format is not None and isinstance(format, basestring): |
146 | 445 | format = format_registry.get(format)() | 445 | format = format_registry.get(format)() |
147 | 446 | transport = get_transport(branch_url) | ||
148 | 447 | if not self.real_bzr_server: | ||
149 | 448 | # for real bzr servers, the prefix always exists. | ||
150 | 449 | transport.create_prefix() | ||
151 | 450 | self.addCleanup(transport.delete_tree, '.') | ||
152 | 451 | return BzrDir.create_branch_convenience( | 446 | return BzrDir.create_branch_convenience( |
153 | 452 | branch_url, format=format) | 447 | branch_url, format=format) |
154 | 453 | 448 | ||
155 | @@ -468,7 +463,7 @@ | |||
156 | 468 | else: | 463 | else: |
157 | 469 | db_branch = self.factory.makeProductBranch(product, **kwargs) | 464 | db_branch = self.factory.makeProductBranch(product, **kwargs) |
158 | 470 | branch_url = 'lp-internal:///' + db_branch.unique_name | 465 | branch_url = 'lp-internal:///' + db_branch.unique_name |
160 | 471 | if self.real_bzr_server: | 466 | if not self.direct_database_server: |
161 | 472 | transaction.commit() | 467 | transaction.commit() |
162 | 473 | bzr_branch = self.createBranchAtURL(branch_url, format=format) | 468 | bzr_branch = self.createBranchAtURL(branch_url, format=format) |
163 | 474 | if tree_location is None: | 469 | if tree_location is None: |
164 | @@ -533,34 +528,20 @@ | |||
165 | 533 | os.environ['BZR_HOME'] = os.getcwd() | 528 | os.environ['BZR_HOME'] = os.getcwd() |
166 | 534 | self.addCleanup(restore_bzr_home) | 529 | self.addCleanup(restore_bzr_home) |
167 | 535 | 530 | ||
169 | 536 | def useBzrBranches(self, real_server=False, direct_database=False): | 531 | def useBzrBranches(self, direct_database=False): |
170 | 537 | """Prepare for using bzr branches. | 532 | """Prepare for using bzr branches. |
171 | 538 | 533 | ||
174 | 539 | This sets up support for lp-hosted and lp-mirrored URLs, | 534 | This sets up support for lp-internal URLs, changes to a temp |
175 | 540 | changes to a temp directory, and overrides the bzr home directory. | 535 | directory, and overrides the bzr home directory. |
176 | 541 | 536 | ||
179 | 542 | :param real_server: If true, use the "real" code hosting server, | 537 | :param direct_database: If true, translate branch locations by |
180 | 543 | using an xmlrpc server, etc. | 538 | directly querying the database, not the internal XML-RPC server. |
181 | 544 | """ | 539 | """ |
182 | 545 | from lp.codehosting.scanner.tests.test_bzrsync import ( | ||
183 | 546 | FakeTransportServer) | ||
184 | 547 | self.useTempBzrHome() | 540 | self.useTempBzrHome() |
201 | 548 | self.real_bzr_server = real_server | 541 | self.direct_database_server = direct_database |
202 | 549 | if real_server: | 542 | server = get_rw_server(direct_database=direct_database) |
203 | 550 | server = get_rw_server( | 543 | server.start_server() |
204 | 551 | direct_database=direct_database) | 544 | self.addCleanup(server.destroy) |
189 | 552 | server.start_server() | ||
190 | 553 | self.addCleanup(server.destroy) | ||
191 | 554 | else: | ||
192 | 555 | os.mkdir('lp-mirrored') | ||
193 | 556 | mirror_server = FakeTransportServer(get_transport('lp-mirrored')) | ||
194 | 557 | mirror_server.start_server() | ||
195 | 558 | self.addCleanup(mirror_server.stop_server) | ||
196 | 559 | os.mkdir('lp-hosted') | ||
197 | 560 | hosted_server = FakeTransportServer( | ||
198 | 561 | get_transport('lp-hosted'), url_prefix='lp-hosted:///') | ||
199 | 562 | hosted_server.start_server() | ||
200 | 563 | self.addCleanup(hosted_server.stop_server) | ||
205 | 564 | 545 | ||
206 | 565 | 546 | ||
207 | 566 | class BrowserTestCase(TestCaseWithFactory): | 547 | class BrowserTestCase(TestCaseWithFactory): |
208 | @@ -855,7 +836,7 @@ | |||
209 | 855 | 836 | ||
210 | 856 | # XXX: This doesn't seem to be a generically useful testing function. Perhaps | 837 | # XXX: This doesn't seem to be a generically useful testing function. Perhaps |
211 | 857 | # it should go into a sub-module? -- jml | 838 | # it should go into a sub-module? -- jml |
213 | 858 | def map_branch_contents(branch_url): | 839 | def map_branch_contents(branch): |
214 | 859 | """Return all files in branch at `branch_url`. | 840 | """Return all files in branch at `branch_url`. |
215 | 860 | 841 | ||
216 | 861 | :param branch_url: the URL for an accessible branch. | 842 | :param branch_url: the URL for an accessible branch. |
217 | @@ -863,7 +844,6 @@ | |||
218 | 863 | files are included. | 844 | files are included. |
219 | 864 | """ | 845 | """ |
220 | 865 | contents = {} | 846 | contents = {} |
221 | 866 | branch = BzrBranch.open(branch_url) | ||
222 | 867 | tree = branch.basis_tree() | 847 | tree = branch.basis_tree() |
223 | 868 | tree.lock_read() | 848 | tree.lock_read() |
224 | 869 | try: | 849 | try: |
225 | 870 | 850 | ||
226 | === modified file 'lib/lp/translations/scripts/tests/test_translations_to_branch.py' | |||
227 | --- lib/lp/translations/scripts/tests/test_translations_to_branch.py 2010-04-27 02:23:05 +0000 | |||
228 | +++ lib/lp/translations/scripts/tests/test_translations_to_branch.py 2010-04-27 02:23:25 +0000 | |||
229 | @@ -40,7 +40,7 @@ | |||
230 | 40 | # End-to-end test of the script doing its work. | 40 | # End-to-end test of the script doing its work. |
231 | 41 | 41 | ||
232 | 42 | # Set up a server for hosted branches. | 42 | # Set up a server for hosted branches. |
234 | 43 | self.useBzrBranches(real_server=True) | 43 | self.useBzrBranches(direct_database=False) |
235 | 44 | 44 | ||
236 | 45 | # Set up a product and translatable series. | 45 | # Set up a product and translatable series. |
237 | 46 | product = self.factory.makeProduct(name='committobranch') | 46 | product = self.factory.makeProduct(name='committobranch') |
238 | @@ -48,8 +48,7 @@ | |||
239 | 48 | series = product.getSeries('trunk') | 48 | series = product.getSeries('trunk') |
240 | 49 | 49 | ||
241 | 50 | # Set up a translations_branch for the series. | 50 | # Set up a translations_branch for the series. |
244 | 51 | db_branch, tree = self.create_branch_and_tree( | 51 | db_branch, tree = self.create_branch_and_tree(product=product) |
243 | 52 | hosted=True, product=product) | ||
245 | 53 | removeSecurityProxy(db_branch).last_scanned_id = 'null:' | 52 | removeSecurityProxy(db_branch).last_scanned_id = 'null:' |
246 | 54 | product.official_rosetta = True | 53 | product.official_rosetta = True |
247 | 55 | series.translations_branch = db_branch | 54 | series.translations_branch = db_branch |
248 | @@ -87,7 +86,7 @@ | |||
249 | 87 | 86 | ||
250 | 88 | # The branch now contains a snapshot of the translation. (Only | 87 | # The branch now contains a snapshot of the translation. (Only |
251 | 89 | # one file: the Dutch translation we set up earlier). | 88 | # one file: the Dutch translation we set up earlier). |
253 | 90 | branch_contents = map_branch_contents(db_branch.getPullURL()) | 89 | branch_contents = map_branch_contents(db_branch.getBzrBranch()) |
254 | 91 | expected_contents = { | 90 | expected_contents = { |
255 | 92 | 'po/nl.po': """ | 91 | 'po/nl.po': """ |
256 | 93 | # Dutch translation for .* | 92 | # Dutch translation for .* |
257 | @@ -163,11 +162,11 @@ | |||
258 | 163 | self.useBzrBranches() | 162 | self.useBzrBranches() |
259 | 164 | 163 | ||
260 | 165 | base_branch, base_tree = self.create_branch_and_tree( | 164 | base_branch, base_tree = self.create_branch_and_tree( |
262 | 166 | 'base', name='base', hosted=True) | 165 | 'base', name='base') |
263 | 167 | self._setUpBranch(base_branch, base_tree, "Base branch.") | 166 | self._setUpBranch(base_branch, base_tree, "Base branch.") |
264 | 168 | 167 | ||
265 | 169 | stacked_branch, stacked_tree = self.create_branch_and_tree( | 168 | stacked_branch, stacked_tree = self.create_branch_and_tree( |
267 | 170 | 'stacked', name='stacked', hosted=True) | 169 | 'stacked', name='stacked') |
268 | 171 | stacked_tree.branch.set_stacked_on_url('/' + base_branch.unique_name) | 170 | stacked_tree.branch.set_stacked_on_url('/' + base_branch.unique_name) |
269 | 172 | stacked_branch.stacked_on = base_branch | 171 | stacked_branch.stacked_on = base_branch |
270 | 173 | self._setUpBranch(stacked_branch, stacked_tree, "Stacked branch.") | 172 | self._setUpBranch(stacked_branch, stacked_tree, "Stacked branch.") |
271 | 174 | 173 | ||
272 | === modified file 'lib/lp/translations/scripts/translations_to_branch.py' | |||
273 | --- lib/lp/translations/scripts/translations_to_branch.py 2010-03-08 19:46:02 +0000 | |||
274 | +++ lib/lp/translations/scripts/translations_to_branch.py 2010-04-27 02:23:25 +0000 | |||
275 | @@ -17,7 +17,7 @@ | |||
276 | 17 | from storm.expr import Join, SQL | 17 | from storm.expr import Join, SQL |
277 | 18 | 18 | ||
278 | 19 | from canonical.launchpad.helpers import shortlist | 19 | from canonical.launchpad.helpers import shortlist |
280 | 20 | from lp.codehosting.vfs import get_multi_server | 20 | from lp.codehosting.vfs import get_rw_server |
281 | 21 | from lp.translations.interfaces.potemplate import IPOTemplateSet | 21 | from lp.translations.interfaces.potemplate import IPOTemplateSet |
282 | 22 | from canonical.launchpad.webapp.interfaces import ( | 22 | from canonical.launchpad.webapp.interfaces import ( |
283 | 23 | IStoreSelector, MAIN_STORE, SLAVE_FLAVOR) | 23 | IStoreSelector, MAIN_STORE, SLAVE_FLAVOR) |
284 | @@ -270,7 +270,7 @@ | |||
285 | 270 | # testing. | 270 | # testing. |
286 | 271 | productseries = productseries.order_by(ProductSeries.id) | 271 | productseries = productseries.order_by(ProductSeries.id) |
287 | 272 | 272 | ||
289 | 273 | bzrserver = get_multi_server(write_hosted=True) | 273 | bzrserver = get_rw_server() |
290 | 274 | bzrserver.start_server() | 274 | bzrserver.start_server() |
291 | 275 | try: | 275 | try: |
292 | 276 | self._exportToBranches(productseries) | 276 | self._exportToBranches(productseries) |
293 | 277 | 277 | ||
294 | === modified file 'lib/lp/translations/tests/test_translationtemplatesbuildjob.py' | |||
295 | --- lib/lp/translations/tests/test_translationtemplatesbuildjob.py 2010-04-16 13:31:48 +0000 | |||
296 | +++ lib/lp/translations/tests/test_translationtemplatesbuildjob.py 2010-04-27 02:23:25 +0000 | |||
297 | @@ -219,7 +219,7 @@ | |||
298 | 219 | # If the feature is enabled, a TipChanged event for a branch that | 219 | # If the feature is enabled, a TipChanged event for a branch that |
299 | 220 | # generates templates will schedule a templates build. | 220 | # generates templates will schedule a templates build. |
300 | 221 | branch = self._makeTranslationBranch() | 221 | branch = self._makeTranslationBranch() |
302 | 222 | commit = DirectBranchCommit(branch, to_mirror=True) | 222 | commit = DirectBranchCommit(branch) |
303 | 223 | commit.writeFile('POTFILES.in', 'foo') | 223 | commit.writeFile('POTFILES.in', 'foo') |
304 | 224 | commit.commit('message') | 224 | commit.commit('message') |
305 | 225 | notify(events.TipChanged(branch, None, False)) | 225 | notify(events.TipChanged(branch, None, False)) |
Looks like a great change.