1
# Copyright (C) 2005 Canonical Limited
2
# Authors: Robert Collins <robert.collins@canonical.com>
4
# This program is free software; you can redistribute it and/or modify
5
# it under the terms of the GNU General Public License as published by
6
# the Free Software Foundation; either version 2 of the License, or
7
# (at your option) any later version.
9
# This program is distributed in the hope that it will be useful,
10
# but WITHOUT ANY WARRANTY; without even the implied warranty of
11
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
# GNU General Public License for more details.
14
# You should have received a copy of the GNU General Public License
15
# along with this program; if not, write to the Free Software
16
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18
from bzrlib.tests import TestCaseInTempDir, TestCase
19
from bzrlib import repository
20
from bzrlib.osutils import has_symlinks
27
from bzrtools import cmd_baz_import
28
from bzrtools.baz_import import (import_version, revision_id,
29
make_archive, map_file_id)
31
from bzrlib.plugins.bzrtools import cmd_baz_import
32
from bzrlib.plugins.bzrtools.baz_import import (import_version,
37
from StringIO import StringIO
39
from testresources import (TestResource, TestLoader, OptimisingTestSuite,
43
from bzrlib.errors import NoSuchRevision
45
from bzrtools.fai import namespace_previous
47
from bzrlib.plugins.bzrtools.fai import namespace_previous
48
from bzrlib.branch import Branch
52
from unittest import TestSuite
54
return TestLoader().loadTestsFromName(__name__)
57
class BazTreeResource(TestResource):
60
os.environ['HOME'] = self._oldhome
61
shutil.rmtree(self._tmpdir)
64
self._tmpdir = tempfile.mkdtemp()
65
self._homedir = os.path.join(self._tmpdir, 'home')
66
self._oldhome = os.environ['HOME']
67
os.mkdir(self._homedir)
68
os.environ['HOME'] = self._homedir
70
self._archiveroot = os.path.join(self._tmpdir, 'archive')
71
self._archive = make_archive('demo@DONOTUSE', str(self._archiveroot))
72
pybaz.set_my_id("Test User<test@example.org>")
74
self.make_empty_import()
77
self._empty_tag = 'demo@DONOTUSE/c--empty-tag--0'
78
self._empty_tag_bzr = revision_id(self._empty_tag + '--base-0', None)
79
pybaz.Revision('demo@DONOTUSE/c--import--0--base-0').make_continuation(
80
pybaz.Version(self._empty_tag))
82
self._empty_merged_tag = 'demo@DONOTUSE/c--empty-merged-tag--0'
83
self._empty_merged_tag_bzr_base = revision_id(self._empty_merged_tag
85
self._empty_merged_tag_bzr = revision_id(self._empty_merged_tag
87
pybaz.Revision('demo@DONOTUSE/c--import--0--base-0').make_continuation(
88
pybaz.Version(self._empty_merged_tag))
89
tree = pybaz.Revision(self._empty_merged_tag + '--base-0').get(
90
os.path.join(self._tmpdir, 'tree'))
91
tree.star_merge(self._empty_tag,
92
pybaz.Version('demo@DONOTUSE/c--import--0'))
93
msg = tree.log_message()
94
msg["summary"]="did a merge, yarh"
96
shutil.rmtree(os.path.join(self._tmpdir, 'tree'))
98
# tree, two commits, includes merge of other branch
99
self._empty_merged_tag_2 = 'demo@DONOTUSE/c--empty-tag-2--0'
100
self._empty_merged_tag_2_bzr_base = revision_id(
101
self._empty_merged_tag_2 + '--base-0', None)
102
self._empty_merged_tag_2_bzr = revision_id(
103
self._empty_merged_tag_2 + '--patch-1', None)
104
pybaz.Revision('demo@DONOTUSE/c--import--0--base-0').make_continuation(
105
pybaz.Version(self._empty_merged_tag_2))
106
tree = pybaz.Revision(self._empty_merged_tag_2 + '--base-0').get (
107
os.path.join(self._tmpdir, 'tree'))
108
tree.star_merge(self._empty_merged_tag,
109
pybaz.Version('demo@DONOTUSE/c--import--0'))
110
msg = tree.log_message()
111
msg["summary"] = "merge in a merged tree."
113
shutil.rmtree(os.path.join(self._tmpdir, 'tree'))
115
self._bad_id_tag = 'demo@DONOTUSE/c--bad-id--0'
116
self._bad_id_tag_bzr_base = revision_id(self._bad_id_tag + '--base-0',
118
self._bad_id_tag_bzr = revision_id(self._bad_id_tag + '--patch-1',
120
pybaz.Revision('demo@DONOTUSE/c--import--0--base-0').make_continuation(
121
pybaz.Version(self._bad_id_tag))
122
tree = pybaz.Revision(self._bad_id_tag + '--base-0').get(
123
os.path.join(self._tmpdir, 'tree'))
124
from bzrlib.plugins.bzrtools.baz_import import add_file
125
add_file(os.path.join(self._tmpdir,'tree/path'), 'text',
126
'this_id/needs%escaping')
127
msg = tree.log_message()
128
msg["summary"] = "commit something which needs escaping."
130
shutil.rmtree(os.path.join(self._tmpdir, 'tree'))
132
self.make_import_symlink()
133
self.make_missing_ancestor()
134
self.make_inbranch_continuation()
136
def make_import_symlink(self):
137
self._import_symlink = 'demo@DONOTUSE/c--import-symlink--0'
138
self._import_symlink_bzr = revision_id(
139
self._import_symlink + '--base-0', None)
140
os.mkdir(os.path.join(self._tmpdir, 'tree'))
141
tree = pybaz.init_tree(os.path.join(self._tmpdir, 'tree'),
142
self._import_symlink)
143
link_path = os.path.join(self._tmpdir, 'tree', 'alink')
144
os.symlink('missing-file-name', link_path)
145
tree.add_tag('alink')
146
id_file = open(os.path.join(tree, '.arch-ids', 'alink.id'), 'w')
147
id_file.write('symlink_tag\n')
149
msg = tree.log_message()
150
msg["summary"] = "Import with a symlink"
153
f = file(link_path, 'w')
154
f.write('Not a symlink no more!')
156
msg = tree.log_message()
157
msg["summary"] = "Turn a symlink into a file"
159
shutil.rmtree(os.path.join(self._tmpdir, 'tree'))
161
def make_empty_import(self):
162
self._import = 'demo@DONOTUSE/c--import--0'
163
os.mkdir(os.path.join(self._tmpdir, 'tree'))
164
tree = pybaz.init_tree(os.path.join(self._tmpdir, 'tree'),
166
msg = tree.log_message()
167
msg["summary"] = "I am importing now"
169
shutil.rmtree(os.path.join(self._tmpdir, 'tree'))
171
def make_utf8_log(self):
172
self._utf8 = 'demo@DONOTUSE/c--utf8--0'
173
os.mkdir(os.path.join(self._tmpdir, 'tree'))
174
tree = pybaz.init_tree(os.path.join(self._tmpdir, 'tree'),
176
msg = tree.log_message()
177
msg["summary"] = u"I am importing now\u1234".encode('utf-8')
179
shutil.rmtree(os.path.join(self._tmpdir, 'tree'))
181
def make_missing_ancestor(self):
182
self._archivegoneroot = os.path.join(self._tmpdir, 'archivegone')
183
self._archive = make_archive('demo-gone@DONOTUSE',
184
str(self._archivegoneroot))
185
self._missing_import = 'demo-gone@DONOTUSE/c--import--0'
186
self._missing_import_bzr = revision_id(self._missing_import
188
self._missing_ancestor = 'demo@DONOTUSE/c--gone--0'
189
self._missing_ancestor_bzr = revision_id(self._missing_ancestor
191
os.mkdir(os.path.join(self._tmpdir, 'tree'))
192
tree = pybaz.init_tree(os.path.join(self._tmpdir, 'tree'),
193
self._missing_import)
194
msg = tree.log_message()
195
msg["summary"] = "I am importing now"
197
shutil.rmtree(os.path.join(self._tmpdir, 'tree'))
198
# tag into the kept archive
199
pybaz.Revision(self._missing_import + '--base-0').make_continuation(
200
pybaz.Version(self._missing_ancestor))
202
# make an import for testing history-reuse logic.
203
# note the use of a namespace layout here.
204
self._missing_import_imported = os.path.join(self._tmpdir,
206
os.mkdir(os.path.join(self._tmpdir, 'archivegone-bzr'))
207
os.mkdir(os.path.join(self._tmpdir, 'archivegone-bzr', 'c'))
208
import_version(os.path.join(self._tmpdir, 'archivegone-bzr',
210
pybaz.Version(self._missing_import), None)
211
# and make it inaccessible
212
pybaz.Archive('demo-gone@DONOTUSE').unregister()
214
def make_inbranch_continuation(self):
215
self._inbranch_tag = 'demo@DONOTUSE/c--inbranch-tag--0'
216
self._inbranch_tag_base = self._inbranch_tag + '--base-0'
217
self._inbranch_tag_base_bzr = revision_id(self._inbranch_tag_base,
219
pybaz.Revision('demo@DONOTUSE/c--import--0--base-0').make_continuation(
220
pybaz.Version(self._inbranch_tag))
221
self._inbranch_tag_head = self._inbranch_tag + '--patch-1'
222
self._inbranch_tag_head_bzr = revision_id(self._inbranch_tag_head,
224
pybaz.Revision(self._inbranch_tag_base).make_continuation(
225
pybaz.Version(self._inbranch_tag))
228
def _makeResource(self):
229
return BazTreeResource()
232
def _cleanResource(self, resource):
236
class TestImportBranch(TestCaseInTempDir):
238
_resources = [("_baz", BazTreeResource)]
241
TestCaseInTempDir.setUp(self)
242
ResourcedTestCase.setUpResources(self)
243
os.environ['HOME'] = self._baz._homedir
246
ResourcedTestCase.tearDownResources(self)
247
TestCaseInTempDir.tearDown(self)
249
def test_import_utf8(self):
250
import_version('output', pybaz.Version(self._baz._utf8), None)
251
branch = Branch.open('output')
252
plain_revid = 'Arch-1:demo@DONOTUSE%c--utf8--0--base-0'
253
self.assertEqual([plain_revid], branch.revision_history())
254
self.assertEqual(u'I am importing now\ufffd\ufffd\ufffd',
255
branch.repository.get_revision(plain_revid).message)
256
import_version('output2', pybaz.Version(self._baz._utf8), 'utf-8')
257
branch2 = Branch.open('output2')
258
utf8_revid = 'Arch-1-utf-8:demo@DONOTUSE%c--utf8--0--base-0'
259
self.assertEqual([utf8_revid], branch2.revision_history())
260
self.assertEqual(u'I am importing now\u1234',
261
branch2.repository.get_revision(utf8_revid).message)
263
def test_import_empty(self):
264
import_version('output', pybaz.Version(self._baz._import), None)
266
# one commit, no files, revision identifier of
267
# 'demo@DONOTUSE_c--import--0--base-0'
268
branch = Branch.open('output')
269
repo = branch.repository
270
self.assertEqual(branch.revision_history(),
271
['Arch-1:demo@DONOTUSE%c--import--0--base-0'])
272
rev = repo.get_revision('Arch-1:demo@DONOTUSE%c--import--0--base-0')
274
import_version('output2', pybaz.Version('demo@DONOTUSE/c--import--0'),
276
branch2 = Branch.open('output2')
277
repo2 = branch2.repository
278
self.assertEqual(branch.revision_history(), branch2.revision_history())
279
rev2 = repo2.get_revision('Arch-1:demo@DONOTUSE%c--import--0--base-0')
280
# they must be the same
281
self.assertEqual(rev, rev2)
283
# and we should get some expected values:
284
self.assertEqual(rev.committer, "Test User<test@example.org>")
285
self.assertEqual(rev.message, "I am importing now")
286
self.assertEqual(rev.revision_id,
287
"Arch-1:demo@DONOTUSE%c--import--0--base-0")
289
def test_empty_tagged(self):
290
import_version('output', pybaz.Version(self._baz._empty_tag), None)
292
# two commits, no files, revision identifiers of
293
# 'demo@DONOTUSE_c--import--0--base-0' and
294
# self._baz._empty_tag_bzr
295
branch = Branch.open('output')
296
self.assertEqual(branch.revision_history(),
297
['Arch-1:demo@DONOTUSE%c--import--0--base-0',
298
self._baz._empty_tag_bzr])
299
rev = branch.repository.get_revision(self._baz._empty_tag_bzr)
301
import_version('output2', pybaz.Version(self._baz._empty_tag), None)
302
branch2 = Branch.open('output2')
303
self.assertEqual(branch.revision_history(), branch2.revision_history())
304
rev2 = branch2.repository.get_revision(self._baz._empty_tag_bzr)
305
# they must be the same
306
self.assertEqual(rev, rev2)
308
# and we should get some expected values:
309
self.assertEqual(rev.committer, "Test User<test@example.org>")
310
self.assertEqual(rev.message,
311
"tag of demo@DONOTUSE/c--import--0--base-0")
312
self.assertEqual(rev.revision_id, self._baz._empty_tag_bzr)
314
def test_empty_merged_tagged(self):
315
import_version('output', pybaz.Version(self._baz._empty_merged_tag),
318
# two commits, no files, revision identifiers of
319
# 'demo@DONOTUSE_c--import--0--base-0' and
320
# self._baz._empty_merged_tag_bzr_base
321
# self._baz._empty_merged_tag_bzr
322
# and a merged revision from the latter of
323
# self._baz._empty_tag_bzr
324
branch = Branch.open('output')
325
repo = branch.repository
326
self.assertEqual(branch.revision_history(),
327
['Arch-1:demo@DONOTUSE%c--import--0--base-0',
328
self._baz._empty_merged_tag_bzr_base,
329
self._baz._empty_merged_tag_bzr])
331
import_version('output2', pybaz.Version(self._baz._empty_merged_tag),
333
branch2 = Branch.open('output2')
334
repo2 = branch2.repository
335
# and import what we should be merged up against for checking with.
336
import_version('output3', pybaz.Version(self._baz._empty_tag), None)
337
branch3 = Branch.open('output3')
339
self.assertEqual(branch.revision_history(), branch2.revision_history())
340
self.assertNotEqual(branch.revision_history(),
341
branch3.revision_history())
342
# check revisions in the history.
343
rev = repo.get_revision(self._baz._empty_merged_tag_bzr_base)
344
rev2 = repo2.get_revision(self._baz._empty_merged_tag_bzr_base)
345
# they must be the same
346
self.assertEqual(rev, rev2)
347
# and we should get some expected values:
348
self.assertEqual(rev.committer, "Test User<test@example.org>")
349
self.assertEqual(rev.message,
350
"tag of demo@DONOTUSE/c--import--0--base-0")
351
self.assertEqual(rev.revision_id, self._baz._empty_merged_tag_bzr_base)
352
self.assertEqual(['Arch-1:demo@DONOTUSE%c--import--0--base-0'],
355
# check next revisions in the history.
356
rev = repo.get_revision(self._baz._empty_merged_tag_bzr)
357
rev2 = repo2.get_revision(self._baz._empty_merged_tag_bzr)
358
# they must be the same
359
self.assertEqual(rev, rev2)
360
# and we should get some expected values:
361
self.assertEqual(rev.committer, "Test User<test@example.org>")
362
self.assertEqual(rev.message, "did a merge, yarh")
363
self.assertEqual(rev.revision_id, self._baz._empty_merged_tag_bzr)
364
self.assertEqual(rev.parent_ids[0],
365
self._baz._empty_merged_tag_bzr_base)
366
self.assertEqual(rev.parent_ids[1], self._baz._empty_tag_bzr)
368
# this tree should have nothing missing from that tree.
369
# FIXME there is no code for this right now.
370
# self.assertEqual(branch.missing_revisions(branch3), [])
372
def test_merge_branch_with_merges(self):
373
import_version('output', pybaz.Version(self._baz._empty_merged_tag_2),
376
# two commits, no files, revision identifiers of
377
# 'demo@DONOTUSE_c--import--0--base-0' and
378
# self._baz._empty_merged_tag_2_bzr_base
379
# self._baz._empty_merged_tag_2_bzr
380
# and a merged revision from the latter of
381
# self._baz._empty_merged_tag_bzr
382
branch = Branch.open('output')
383
repo = branch.repository
384
self.assertEqual(branch.revision_history(),
385
['Arch-1:demo@DONOTUSE%c--import--0--base-0',
386
self._baz._empty_merged_tag_2_bzr_base,
387
self._baz._empty_merged_tag_2_bzr])
389
import_version('output2', pybaz.Version(self._baz._empty_merged_tag_2),
391
branch2 = Branch.open('output2')
392
repo2 = branch2.repository
393
# and import what we should be merged up against for checking with.
394
import_version('output3', pybaz.Version(self._baz._empty_merged_tag),
396
branch3 = Branch.open('output3')
398
self.assertEqual(branch.revision_history(), branch2.revision_history())
399
self.assertNotEqual(branch.revision_history(),
400
branch3.revision_history())
401
# check revisions in the history.
402
rev = repo.get_revision(self._baz._empty_merged_tag_2_bzr_base)
403
rev2 = repo2.get_revision(self._baz._empty_merged_tag_2_bzr_base)
404
# they must be the same
405
self.assertEqual(rev, rev2)
406
# and we should get some expected values:
407
self.assertEqual(rev.committer, "Test User<test@example.org>")
408
self.assertEqual(rev.message,
409
"tag of demo@DONOTUSE/c--import--0--base-0")
410
self.assertEqual(rev.revision_id,
411
self._baz._empty_merged_tag_2_bzr_base)
413
# check next revisions in the history.
414
rev = repo.get_revision(self._baz._empty_merged_tag_2_bzr)
415
rev2 = repo2.get_revision(self._baz._empty_merged_tag_2_bzr)
416
# they must be the same
417
self.assertEqual(rev, rev2)
418
# and we should get some expected values:
419
self.assertEqual(rev.committer, "Test User<test@example.org>")
420
self.assertEqual(rev.message, "merge in a merged tree.")
421
self.assertEqual(rev.revision_id, self._baz._empty_merged_tag_2_bzr)
422
self.assertEqual(rev.parent_ids[0],
423
self._baz._empty_merged_tag_2_bzr_base)
424
self.assertEqual(rev.parent_ids[1],
425
self._baz._empty_merged_tag_bzr)
427
# this tree should have nothing missing from that tree.
428
# FIXME there is no code for this right now.
429
# self.assertEqual(branch.missing_revisions(branch3), [])
431
def test_import_symlink(self):
432
import_version('output', pybaz.Version(self._baz._import_symlink),
435
# two commits, no files, revision identifier of
436
# 'demo@DONOTUSE_c--import--0--base-0'
437
branch = Branch.open('output')
438
self.assertEqual(branch.revision_history(),
439
[self._baz._import_symlink_bzr])
440
rev = branch.repository.get_revision(self._baz._import_symlink_bzr)
442
import_version('output2', pybaz.Version(self._baz._import_symlink),
444
branch2 = Branch.open('output2')
445
self.assertEqual(branch.revision_history(), branch2.revision_history())
446
rev2 = branch2.repository.get_revision(self._baz._import_symlink_bzr)
447
# they must be the same
448
self.assertEqual(rev, rev2)
450
# and we should get some expected values:
451
self.assertEqual(rev.committer, "Test User<test@example.org>")
452
self.assertEqual(rev.message, "Import with a symlink")
453
self.assertEqual(rev.revision_id, self._baz._import_symlink_bzr)
455
# and we want the symlink alink with target 'missing-file-name'
456
inv = branch.repository.get_inventory(rev.revision_id)
457
self.assertEqual(inv.path2id('alink'), 'x_symlink_tag')
458
entry = inv['x_symlink_tag']
459
self.assertEqual(entry.kind, 'symlink')
460
self.assertEqual(entry.symlink_target, 'missing-file-name')
462
# current bzr doesn't handle type changes
463
self.assertRaises(AssertionError, import_version, 'output3',
464
pybaz.Version(self._baz._import_symlink), None)
466
def test_missing_ancestor(self):
467
import_version('output', pybaz.Version(self._baz._missing_ancestor),
470
# one commits, no files, revision identifiers of
471
# 'demo@DONOTUSE_c--gone--0--base-0' and
472
# a merge of demo-gone@DONOTUSE%c--import--0
473
branch = Branch.open('output')
474
self.assertEqual(branch.revision_history(),
475
[self._baz._missing_ancestor_bzr])
476
rev = branch.repository.get_revision(self._baz._missing_ancestor_bzr)
478
import_version('output2', pybaz.Version(self._baz._missing_ancestor),
480
branch2 = Branch.open('output2')
481
self.assertEqual(branch.revision_history(), branch2.revision_history())
482
rev2 = branch2.repository.get_revision(self._baz._missing_ancestor_bzr)
483
# they must be the same
484
self.assertEqual(rev, rev2)
486
# and we should get some expected values:
487
self.assertEqual(rev.committer, "Test User<test@example.org>")
488
self.assertEqual(rev.message,
489
"tag of demo-gone@DONOTUSE/c--import--0--base-0")
490
self.assertEqual(rev.revision_id, self._baz._missing_ancestor_bzr)
491
self.assertEqual(rev.parent_ids[0], self._baz._missing_import_bzr)
492
self.assertEqual(1, len(rev.parent_ids))
494
# must NOT be able to get the merged evision
495
self.assertRaises(NoSuchRevision, branch.repository.get_revision,
496
self._baz._missing_import_bzr)
498
def test_missing_ancestor_reusing_history(self):
499
import_version('output', pybaz.Version(self._baz._missing_ancestor),
501
reuse_history_from=[self._baz._missing_import_imported])
503
# one commits, no files, revision identifiers of
504
# 'demo-gone@DONOTUSE%c--import--0--base-0' and
505
# 'demo@DONOTUSE%c--gone--0--base-0'
506
branch = Branch.open('output')
507
self.assertEqual(branch.revision_history(),
508
[self._baz._missing_import_bzr,
509
self._baz._missing_ancestor_bzr])
510
rev = branch.repository.get_revision(self._baz._missing_ancestor_bzr)
512
import_version('output2', pybaz.Version(self._baz._missing_ancestor),
514
reuse_history_from=[self._baz._missing_import_imported])
515
branch2 = Branch.open('output2')
516
self.assertEqual(branch.revision_history(), branch2.revision_history())
517
rev2 = branch2.repository.get_revision(self._baz._missing_ancestor_bzr)
518
# they must be the same
519
self.assertEqual(rev, rev2)
521
# must be able to get the missing base revision
522
branch.repository.get_revision(self._baz._missing_import_bzr)
524
# and we should get some expected values:
525
self.assertEqual(rev.committer, "Test User<test@example.org>")
526
self.assertEqual(rev.message,
527
"tag of demo-gone@DONOTUSE/c--import--0--base-0")
528
self.assertEqual(rev.revision_id, self._baz._missing_ancestor_bzr)
529
self.assertEqual(rev.parent_ids[0], self._baz._missing_import_bzr)
530
self.assertEqual(1, len(rev.parent_ids))
532
def test_bad_file_id(self):
533
import_version('output', pybaz.Version(self._baz._bad_id_tag), None)
535
# three commits, one files, revision identifiers of
536
# 'demo@DONOTUSE_c--import--0--base-0' ,
537
# 'demo@DONOTUSE/c--bad-id--0--base-0' ,
538
# ''demo@DONOTUSE/c--bad-id--0--patch-1'
539
branch = Branch.open('output')
540
self.assertEqual(branch.revision_history(),
541
['Arch-1:demo@DONOTUSE%c--import--0--base-0',
542
self._baz._bad_id_tag_bzr_base,
543
self._baz._bad_id_tag_bzr])
544
rev = branch.repository.get_revision(self._baz._bad_id_tag_bzr)
545
inv = branch.repository.get_inventory(self._baz._bad_id_tag_bzr)
546
self.assertEqual(inv.path2id('path'), 'x_this_id%2fneeds%25escaping')
547
self.assertEqual('path', inv.id2path('x_this_id%2fneeds%25escaping'))
549
def test_appending_revisions_already_present(self):
550
import_version('output', pybaz.Version(self._baz._bad_id_tag), None,
553
# three commits, one files, revision identifiers of
554
# 'demo@DONOTUSE_c--import--0--base-0' ,
555
# 'demo@DONOTUSE/c--bad-id--0--base-0' ,
556
# ''demo@DONOTUSE/c--bad-id--0--patch-1'
557
branch = Branch.open('output')
558
self.assertEqual(branch.revision_history(),
559
['Arch-1:demo@DONOTUSE%c--import--0--base-0',
560
self._baz._bad_id_tag_bzr_base])
561
branch.set_revision_history(
562
['Arch-1:demo@DONOTUSE%c--import--0--base-0'])
564
branch = Branch.open('output')
565
self.assertEqual(branch.revision_history(),
566
['Arch-1:demo@DONOTUSE%c--import--0--base-0'])
568
import_version('output', pybaz.Version(self._baz._bad_id_tag), None)
569
branch = Branch.open('output')
570
self.assertEqual(branch.revision_history(),
571
['Arch-1:demo@DONOTUSE%c--import--0--base-0',
572
self._baz._bad_id_tag_bzr_base,
573
self._baz._bad_id_tag_bzr])
574
rev = branch.repository.get_revision(self._baz._bad_id_tag_bzr)
575
inv = branch.repository.get_inventory(self._baz._bad_id_tag_bzr)
576
self.assertEqual(inv.path2id('path'), 'x_this_id%2fneeds%25escaping')
577
self.assertEqual('path', inv.id2path('x_this_id%2fneeds%25escaping'))
579
def test_appending_revisions_all_already_present(self):
580
import_version('output', pybaz.Version(self._baz._bad_id_tag), None)
582
# three commits, one files, revision identifiers of
583
# 'demo@DONOTUSE_c--import--0--base-0' ,
584
# 'demo@DONOTUSE/c--bad-id--0--base-0' ,
585
# ''demo@DONOTUSE/c--bad-id--0--patch-1'
586
branch = Branch.open('output')
587
self.assertEqual(branch.revision_history(),
588
['Arch-1:demo@DONOTUSE%c--import--0--base-0',
589
self._baz._bad_id_tag_bzr_base,
590
self._baz._bad_id_tag_bzr])
591
branch.set_revision_history(
592
['Arch-1:demo@DONOTUSE%c--import--0--base-0'])
594
branch = Branch.open('output')
595
self.assertEqual(branch.revision_history(),
596
['Arch-1:demo@DONOTUSE%c--import--0--base-0'])
598
import_version('output', pybaz.Version(self._baz._bad_id_tag), None)
599
branch = Branch.open('output')
600
self.assertEqual(branch.revision_history(),
601
['Arch-1:demo@DONOTUSE%c--import--0--base-0',
602
self._baz._bad_id_tag_bzr_base,
603
self._baz._bad_id_tag_bzr])
604
rev = branch.repository.get_revision(self._baz._bad_id_tag_bzr)
605
inv = branch.repository.get_inventory(self._baz._bad_id_tag_bzr)
606
self.assertEqual(inv.path2id('path'), 'x_this_id%2fneeds%25escaping')
607
self.assertEqual('path', inv.id2path('x_this_id%2fneeds%25escaping'))
609
def test_inbranch_conversion(self):
610
import_version('output', pybaz.Version(self._baz._inbranch_tag), None)
612
# three commits, no files, revision identifiers of
613
# 'demo@DONOTUSE_c--import--0--base-0' and
614
# self._baz._inbranch_tag_base_bzr
615
# self._baz._inbranch_tag_head_bzr
617
branch = Branch.open('output')
618
self.assertEqual(branch.revision_history(),
619
['Arch-1:demo@DONOTUSE%c--import--0--base-0',
620
self._baz._inbranch_tag_base_bzr,
621
self._baz._inbranch_tag_head_bzr])
623
import_version('output2', pybaz.Version(self._baz._inbranch_tag), None)
624
branch2 = Branch.open('output2')
626
self.assertEqual(branch.revision_history(), branch2.revision_history())
627
# check revisions in the history.
628
rev = branch.repository.get_revision(self._baz._inbranch_tag_base_bzr)
629
rev2 = branch2.repository.get_revision(self._baz._inbranch_tag_base_bzr)
630
# they must be the same
631
self.assertEqual(rev, rev2)
632
# and we should get some expected values:
633
self.assertEqual(rev.committer, "Test User<test@example.org>")
634
self.assertEqual(rev.message, "tag of demo@DONOTUSE/c--import--0--base-0")
635
self.assertEqual(rev.revision_id, self._baz._inbranch_tag_base_bzr)
637
# check next revisions in the history.
638
rev = branch.repository.get_revision(self._baz._inbranch_tag_head_bzr)
639
rev2 = branch2.repository.get_revision(self._baz._inbranch_tag_head_bzr)
640
# they must be the same
641
self.assertEqual(rev, rev2)
642
# and we should get some expected values:
643
self.assertEqual(rev.committer, "Test User<test@example.org>")
644
self.assertEqual(rev.message, "tag of demo@DONOTUSE/c--inbranch-tag--0--base-0")
645
self.assertEqual(rev.revision_id, self._baz._inbranch_tag_head_bzr)
646
self.assertEqual(rev.parent_ids,
647
[self._baz._inbranch_tag_base_bzr])
649
def test_no_commits_same_as_missing(self):
652
branch = bzrlib.bzrdir.BzrDir.create_branch_convenience(path)
653
import_version(path, pybaz.Version(self._baz._import), None)
655
# one commit, revision identifier of
656
# 'demo@DONOTUSE_c--import--0--base-0'
657
self.assertEqual(branch.revision_history(),
658
['Arch-1:demo@DONOTUSE%c--import--0--base-0'])
661
class TestNamespacePrevious(TestCase):
665
self.version = pybaz.Version('foo@example.com/c--b--0')
667
def test_base0_none(self):
668
self.assertEqual(namespace_previous(self.version['base-0']), None)
670
def test_patch1_base0(self):
671
self.assertEqual(namespace_previous(self.version['patch-1']),
672
self.version['base-0'])
674
def test_patch3000_patch2999(self):
675
self.assertEqual(namespace_previous(self.version['patch-3000']),
676
self.version['patch-2999'])
678
def test_version0_raises(self):
679
self.assertRaises(RuntimeError, namespace_previous,
680
self.version['version-0'])
682
def test_version1_version0(self):
683
self.assertEqual(namespace_previous(self.version['versionfix-1']),
684
self.version['version-0'])
686
def test_version3000_patch2999(self):
687
self.assertEqual(namespace_previous(self.version['versionfix-3000']),
688
self.version['versionfix-2999'])
691
class TestNamespaceMapping(TestCase):
693
def test_namespace_mapping_branch(self):
694
from bzrlib.plugins.bzrtools.baz_import import map_namespace
695
branch = pybaz.Branch('foo@example.com/c--b')
696
self.assertRaises(pybaz.errors.NamespaceError, map_namespace, branch)
697
self.assertEqual('c/b', map_namespace(branch['0']))
698
self.assertEqual('c/0.1/b', map_namespace(branch['0.1']))
700
def test_namespace_mapping_no_branch(self):
701
from bzrlib.plugins.bzrtools.baz_import import map_namespace
702
category = pybaz.Category('foo@example.com/c')
703
self.assertRaises(pybaz.errors.NamespaceError, map_namespace, category)
704
self.assertEqual('c/+trunk',
705
map_namespace(pybaz.Version("%s--0" % category)))
706
self.assertEqual('c/0.1/+trunk',
707
map_namespace(pybaz.Version('%s--0.1' % category)))
710
class TestFileIdMapping(TestCase):
712
def test_slash(self):
713
self.assertEqual('c%2fc', map_file_id('c/c'))
714
self.assertEqual('c%25c', map_file_id('c%c'))
717
class TestImport(TestCaseInTempDir):
720
TestCaseInTempDir.setUp(self)
721
self._oldhome = os.environ['HOME']
722
self._tmpdir = tempfile.mkdtemp()
723
self._homedir = os.path.join(self._tmpdir, 'home')
724
os.mkdir(self._homedir)
725
os.environ['HOME'] = self._homedir
726
self._archiveroot = os.path.join(self._tmpdir, 'archive')
727
self._archive = make_archive('demo@DONOTUSE', str(self._archiveroot))
730
os.environ['HOME'] = self._oldhome
731
shutil.rmtree(self._tmpdir)
732
TestCaseInTempDir.tearDown(self)
734
def make_import(self, namespace):
735
self._import = 'demo@DONOTUSE/%s' % namespace
736
os.mkdir(os.path.join(self._tmpdir, 'tree'))
737
tree = pybaz.init_tree(os.path.join(self._tmpdir, 'tree'),
739
msg = tree.log_message()
740
msg["summary"] = "I am importing now"
742
shutil.rmtree(os.path.join(self._tmpdir, 'tree'))
744
def test_cmd_exists(self):
745
from bzrlib.plugins.bzrtools import cmd_baz_import
747
def test_empty_archive(self):
748
command = cmd_baz_import()
749
command.run(os.path.join(self._tmpdir, 'output'), 'demo@DONOTUSE')
750
self.failUnless(os.path.exists(os.path.join(self._tmpdir,'output')))
751
walk_len = len(list(os.walk(os.path.join(self._tmpdir,'output'))))
752
self.assertEqual(7, walk_len)
754
def test_two_branches(self):
755
self.make_import('c--0')
756
self.make_import('c1--branch--0.2')
757
command = cmd_baz_import()
758
command.run(os.path.join(self._tmpdir, 'output'), 'demo@DONOTUSE')
759
self.failUnless(os.path.exists(os.path.join(self._tmpdir,'output')))
760
self.failUnless(os.path.exists(os.path.join(self._tmpdir,'output',
762
self.failUnless(os.path.exists(os.path.join(self._tmpdir,'output',
763
'c1', '0.2','branch')))
764
default_format = repository.RepositoryFormat.get_default_format()
765
if getattr(default_format, 'rich_root_data', False):
769
walk_len = len(list(os.walk(os.path.join(self._tmpdir,'output'))))
770
self.assertEqual(num_files, walk_len)
772
def test_run_twice(self):
773
self.make_import('c--0')
774
command = cmd_baz_import()
775
command.run(os.path.join(self._tmpdir, 'output'), 'demo@DONOTUSE')
776
command.run(os.path.join(self._tmpdir, 'output'), 'demo@DONOTUSE')
778
def test_accepts_reuse_history(self):
779
self.make_import('c--0')
780
self.run_bzr('baz-import', os.path.join(self._tmpdir, 'output'),
781
'demo@DONOTUSE', '.', '.')
783
def test_does_not_need_reuse_history(self):
784
self.make_import('c--0')
785
self.run_bzr('baz-import', os.path.join(self._tmpdir, 'output'),
788
def test_does_not_need_reuse_history(self):
789
self.make_import('c--0')
790
self.run_bzr('baz-import', os.path.join(self._tmpdir, 'output'),
793
def test_encoding_flag(self):
794
self.make_import('c--0')
795
self.run_bzr('baz-import', os.path.join(self._tmpdir, 'output'),
797
self.assertEqual(['Arch-1:demo@DONOTUSE%c--0--base-0'],
798
Branch.open(os.path.join(self._tmpdir,
799
'output/c/+trunk')).revision_history())
800
self.run_bzr('baz-import', os.path.join(self._tmpdir, 'output2'),
801
'demo@DONOTUSE', '--encoding', 'utf-8')
802
self.assertEqual(['Arch-1-utf-8:demo@DONOTUSE%c--0--base-0'],
803
Branch.open(os.path.join(self._tmpdir,
804
'output2/c/+trunk')).revision_history())
805
self.run_bzr('baz-import-branch', os.path.join(self._tmpdir, 'output3'),
806
'demo@DONOTUSE/c--0')
807
self.assertEqual(['Arch-1:demo@DONOTUSE%c--0--base-0'],
808
Branch.open(os.path.join(self._tmpdir,
809
'output3')).revision_history())
810
self.run_bzr('baz-import-branch', os.path.join(self._tmpdir,
811
'output4'), 'demo@DONOTUSE/c--0', '--encoding', 'utf-8')
812
self.assertEqual(['Arch-1-utf-8:demo@DONOTUSE%c--0--base-0'],
813
Branch.open(os.path.join(self._tmpdir,
814
'output4')).revision_history())