16
16
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18
18
from bzrlib.tests import TestCaseInTempDir, TestCase
19
from bzrlib import repository
20
19
from bzrlib.osutils import has_symlinks
23
22
except ImportError:
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,
25
from bzrlib.plugins.bzrtools.baz_import import (import_version, revision_id,
26
cmd_baz_import, make_archive)
27
from bzrlib.errors import NoSuchRevision
37
29
from StringIO import StringIO
39
31
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
34
from bzrlib.plugins.bzrtools.fai import namespace_previous
48
35
from bzrlib.branch import Branch
72
59
pybaz.set_my_id("Test User<test@example.org>")
74
61
self.make_empty_import()
77
63
self._empty_tag = 'demo@DONOTUSE/c--empty-tag--0'
78
self._empty_tag_bzr = revision_id(self._empty_tag + '--base-0', None)
64
self._empty_tag_bzr = revision_id(self._empty_tag + '--base-0')
79
65
pybaz.Revision('demo@DONOTUSE/c--import--0--base-0').make_continuation(
80
66
pybaz.Version(self._empty_tag))
82
68
self._empty_merged_tag = 'demo@DONOTUSE/c--empty-merged-tag--0'
83
69
self._empty_merged_tag_bzr_base = revision_id(self._empty_merged_tag
85
71
self._empty_merged_tag_bzr = revision_id(self._empty_merged_tag
87
73
pybaz.Revision('demo@DONOTUSE/c--import--0--base-0').make_continuation(
88
74
pybaz.Version(self._empty_merged_tag))
89
75
tree = pybaz.Revision(self._empty_merged_tag + '--base-0').get(
98
84
# tree, two commits, includes merge of other branch
99
85
self._empty_merged_tag_2 = 'demo@DONOTUSE/c--empty-tag-2--0'
100
86
self._empty_merged_tag_2_bzr_base = revision_id(
101
self._empty_merged_tag_2 + '--base-0', None)
87
self._empty_merged_tag_2 + '--base-0')
102
88
self._empty_merged_tag_2_bzr = revision_id(
103
self._empty_merged_tag_2 + '--patch-1', None)
89
self._empty_merged_tag_2 + '--patch-1')
104
90
pybaz.Revision('demo@DONOTUSE/c--import--0--base-0').make_continuation(
105
91
pybaz.Version(self._empty_merged_tag_2))
106
92
tree = pybaz.Revision(self._empty_merged_tag_2 + '--base-0').get (
113
99
shutil.rmtree(os.path.join(self._tmpdir, 'tree'))
115
101
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',
102
self._bad_id_tag_bzr_base = revision_id(self._bad_id_tag + '--base-0')
103
self._bad_id_tag_bzr = revision_id(self._bad_id_tag + '--patch-1')
120
104
pybaz.Revision('demo@DONOTUSE/c--import--0--base-0').make_continuation(
121
105
pybaz.Version(self._bad_id_tag))
122
106
tree = pybaz.Revision(self._bad_id_tag + '--base-0').get(
136
120
def make_import_symlink(self):
137
121
self._import_symlink = 'demo@DONOTUSE/c--import-symlink--0'
138
122
self._import_symlink_bzr = revision_id(
139
self._import_symlink + '--base-0', None)
123
self._import_symlink + '--base-0')
140
124
os.mkdir(os.path.join(self._tmpdir, 'tree'))
141
125
tree = pybaz.init_tree(os.path.join(self._tmpdir, 'tree'),
142
126
self._import_symlink)
143
link_path = os.path.join(self._tmpdir, 'tree', 'alink')
144
os.symlink('missing-file-name', link_path)
127
os.symlink('missing-file-name',
128
os.path.join(self._tmpdir, 'tree', 'alink'))
145
129
tree.add_tag('alink')
146
130
id_file = open(os.path.join(tree, '.arch-ids', 'alink.id'), 'w')
147
131
id_file.write('symlink_tag\n')
149
133
msg = tree.log_message()
150
134
msg["summary"] = "Import with a symlink"
151
135
tree.import_(msg)
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
136
shutil.rmtree(os.path.join(self._tmpdir, 'tree'))
161
138
def make_empty_import(self):
168
145
tree.import_(msg)
169
146
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
148
def make_missing_ancestor(self):
182
149
self._archivegoneroot = os.path.join(self._tmpdir, 'archivegone')
183
150
self._archive = make_archive('demo-gone@DONOTUSE',
184
151
str(self._archivegoneroot))
185
152
self._missing_import = 'demo-gone@DONOTUSE/c--import--0'
186
153
self._missing_import_bzr = revision_id(self._missing_import
188
155
self._missing_ancestor = 'demo@DONOTUSE/c--gone--0'
189
156
self._missing_ancestor_bzr = revision_id(self._missing_ancestor
191
158
os.mkdir(os.path.join(self._tmpdir, 'tree'))
192
159
tree = pybaz.init_tree(os.path.join(self._tmpdir, 'tree'),
193
160
self._missing_import)
200
167
pybaz.Version(self._missing_ancestor))
202
169
# make an import for testing history-reuse logic.
203
172
# note the use of a namespace layout here.
204
173
self._missing_import_imported = os.path.join(self._tmpdir,
205
174
'archivegone-bzr')
207
176
os.mkdir(os.path.join(self._tmpdir, 'archivegone-bzr', 'c'))
208
177
import_version(os.path.join(self._tmpdir, 'archivegone-bzr',
210
pybaz.Version(self._missing_import), None)
179
pybaz.Version(self._missing_import),
211
181
# and make it inaccessible
212
182
pybaz.Archive('demo-gone@DONOTUSE').unregister()
214
184
def make_inbranch_continuation(self):
215
185
self._inbranch_tag = 'demo@DONOTUSE/c--inbranch-tag--0'
216
186
self._inbranch_tag_base = self._inbranch_tag + '--base-0'
217
self._inbranch_tag_base_bzr = revision_id(self._inbranch_tag_base,
187
self._inbranch_tag_base_bzr = revision_id(self._inbranch_tag_base)
219
188
pybaz.Revision('demo@DONOTUSE/c--import--0--base-0').make_continuation(
220
189
pybaz.Version(self._inbranch_tag))
221
190
self._inbranch_tag_head = self._inbranch_tag + '--patch-1'
222
self._inbranch_tag_head_bzr = revision_id(self._inbranch_tag_head,
191
self._inbranch_tag_head_bzr = revision_id(self._inbranch_tag_head)
224
192
pybaz.Revision(self._inbranch_tag_base).make_continuation(
225
193
pybaz.Version(self._inbranch_tag))
241
209
TestCaseInTempDir.setUp(self)
242
210
ResourcedTestCase.setUpResources(self)
243
211
os.environ['HOME'] = self._baz._homedir
212
self.output = StringIO()
245
214
def tearDown(self):
246
215
ResourcedTestCase.tearDownResources(self)
247
216
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)
218
def collect(self, text):
219
self.output.write(text)
220
self.output.write("\n")
263
222
def test_import_empty(self):
264
import_version('output', pybaz.Version(self._baz._import), None)
223
import_version('output', pybaz.Version(self._baz._import),
265
225
# expected results:
266
226
# one commit, no files, revision identifier of
267
227
# 'demo@DONOTUSE_c--import--0--base-0'
272
232
rev = repo.get_revision('Arch-1:demo@DONOTUSE%c--import--0--base-0')
274
234
import_version('output2', pybaz.Version('demo@DONOTUSE/c--import--0'),
276
236
branch2 = Branch.open('output2')
277
237
repo2 = branch2.repository
278
238
self.assertEqual(branch.revision_history(), branch2.revision_history())
287
247
"Arch-1:demo@DONOTUSE%c--import--0--base-0")
289
249
def test_empty_tagged(self):
290
import_version('output', pybaz.Version(self._baz._empty_tag), None)
250
import_version('output', pybaz.Version(self._baz._empty_tag),
291
252
# expected results:
292
253
# two commits, no files, revision identifiers of
293
254
# 'demo@DONOTUSE_c--import--0--base-0' and
298
259
self._baz._empty_tag_bzr])
299
260
rev = branch.repository.get_revision(self._baz._empty_tag_bzr)
301
import_version('output2', pybaz.Version(self._baz._empty_tag), None)
262
import_version('output2', pybaz.Version(self._baz._empty_tag),
302
264
branch2 = Branch.open('output2')
303
265
self.assertEqual(branch.revision_history(), branch2.revision_history())
304
266
rev2 = branch2.repository.get_revision(self._baz._empty_tag_bzr)
312
274
self.assertEqual(rev.revision_id, self._baz._empty_tag_bzr)
314
276
def test_empty_merged_tagged(self):
315
import_version('output', pybaz.Version(self._baz._empty_merged_tag),
277
import_version('output', pybaz.Version(self._baz._empty_merged_tag),
317
279
# expected results:
318
280
# two commits, no files, revision identifiers of
319
281
# 'demo@DONOTUSE_c--import--0--base-0' and
328
290
self._baz._empty_merged_tag_bzr_base,
329
291
self._baz._empty_merged_tag_bzr])
331
import_version('output2', pybaz.Version(self._baz._empty_merged_tag),
293
import_version('output2', pybaz.Version(self._baz._empty_merged_tag),
333
295
branch2 = Branch.open('output2')
334
296
repo2 = branch2.repository
335
297
# and import what we should be merged up against for checking with.
336
import_version('output3', pybaz.Version(self._baz._empty_tag), None)
298
import_version('output3', pybaz.Version(self._baz._empty_tag),
337
300
branch3 = Branch.open('output3')
339
302
self.assertEqual(branch.revision_history(), branch2.revision_history())
370
333
# self.assertEqual(branch.missing_revisions(branch3), [])
372
335
def test_merge_branch_with_merges(self):
373
import_version('output', pybaz.Version(self._baz._empty_merged_tag_2),
336
import_version('output', pybaz.Version(self._baz._empty_merged_tag_2),
375
338
# expected results:
376
339
# two commits, no files, revision identifiers of
377
340
# 'demo@DONOTUSE_c--import--0--base-0' and
387
350
self._baz._empty_merged_tag_2_bzr])
389
352
import_version('output2', pybaz.Version(self._baz._empty_merged_tag_2),
391
354
branch2 = Branch.open('output2')
392
355
repo2 = branch2.repository
393
356
# and import what we should be merged up against for checking with.
394
357
import_version('output3', pybaz.Version(self._baz._empty_merged_tag),
396
359
branch3 = Branch.open('output3')
398
361
self.assertEqual(branch.revision_history(), branch2.revision_history())
429
392
# self.assertEqual(branch.missing_revisions(branch3), [])
431
394
def test_import_symlink(self):
432
import_version('output', pybaz.Version(self._baz._import_symlink),
395
import_version('output', pybaz.Version(self._baz._import_symlink),
434
397
# expected results:
435
# two commits, no files, revision identifier of
398
# one commit, no files, revision identifier of
436
399
# 'demo@DONOTUSE_c--import--0--base-0'
437
400
branch = Branch.open('output')
438
401
self.assertEqual(branch.revision_history(),
440
403
rev = branch.repository.get_revision(self._baz._import_symlink_bzr)
442
405
import_version('output2', pybaz.Version(self._baz._import_symlink),
444
407
branch2 = Branch.open('output2')
445
408
self.assertEqual(branch.revision_history(), branch2.revision_history())
446
409
rev2 = branch2.repository.get_revision(self._baz._import_symlink_bzr)
459
422
self.assertEqual(entry.kind, 'symlink')
460
423
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
425
def test_missing_ancestor(self):
467
426
import_version('output', pybaz.Version(self._baz._missing_ancestor),
469
428
# expected results:
470
429
# one commits, no files, revision identifiers of
471
430
# 'demo@DONOTUSE_c--gone--0--base-0' and
475
434
[self._baz._missing_ancestor_bzr])
476
435
rev = branch.repository.get_revision(self._baz._missing_ancestor_bzr)
478
import_version('output2', pybaz.Version(self._baz._missing_ancestor),
437
import_version('output2', pybaz.Version(self._baz._missing_ancestor),
480
439
branch2 = Branch.open('output2')
481
440
self.assertEqual(branch.revision_history(), branch2.revision_history())
482
441
rev2 = branch2.repository.get_revision(self._baz._missing_ancestor_bzr)
498
457
def test_missing_ancestor_reusing_history(self):
499
458
import_version('output', pybaz.Version(self._baz._missing_ancestor),
501
460
reuse_history_from=[self._baz._missing_import_imported])
502
461
# expected results:
503
462
# one commits, no files, revision identifiers of
510
469
rev = branch.repository.get_revision(self._baz._missing_ancestor_bzr)
512
471
import_version('output2', pybaz.Version(self._baz._missing_ancestor),
514
473
reuse_history_from=[self._baz._missing_import_imported])
515
474
branch2 = Branch.open('output2')
516
475
self.assertEqual(branch.revision_history(), branch2.revision_history())
530
489
self.assertEqual(1, len(rev.parent_ids))
532
491
def test_bad_file_id(self):
533
import_version('output', pybaz.Version(self._baz._bad_id_tag), None)
492
import_version('output', pybaz.Version(self._baz._bad_id_tag),
534
494
# expected results:
535
495
# three commits, one files, revision identifiers of
536
496
# 'demo@DONOTUSE_c--import--0--base-0' ,
547
507
self.assertEqual('path', inv.id2path('x_this_id%2fneeds%25escaping'))
549
509
def test_appending_revisions_already_present(self):
550
import_version('output', pybaz.Version(self._baz._bad_id_tag), None,
510
import_version('output', pybaz.Version(self._baz._bad_id_tag),
511
self.collect, max_count=2)
552
512
# expected results:
553
513
# three commits, one files, revision identifiers of
554
514
# 'demo@DONOTUSE_c--import--0--base-0' ,
565
525
self.assertEqual(branch.revision_history(),
566
526
['Arch-1:demo@DONOTUSE%c--import--0--base-0'])
568
import_version('output', pybaz.Version(self._baz._bad_id_tag), None)
528
import_version('output', pybaz.Version(self._baz._bad_id_tag),
569
530
branch = Branch.open('output')
570
531
self.assertEqual(branch.revision_history(),
571
532
['Arch-1:demo@DONOTUSE%c--import--0--base-0',
577
538
self.assertEqual('path', inv.id2path('x_this_id%2fneeds%25escaping'))
579
540
def test_appending_revisions_all_already_present(self):
580
import_version('output', pybaz.Version(self._baz._bad_id_tag), None)
541
import_version('output', pybaz.Version(self._baz._bad_id_tag),
581
543
# expected results:
582
544
# three commits, one files, revision identifiers of
583
545
# 'demo@DONOTUSE_c--import--0--base-0' ,
595
557
self.assertEqual(branch.revision_history(),
596
558
['Arch-1:demo@DONOTUSE%c--import--0--base-0'])
598
import_version('output', pybaz.Version(self._baz._bad_id_tag), None)
560
import_version('output', pybaz.Version(self._baz._bad_id_tag),
599
562
branch = Branch.open('output')
600
563
self.assertEqual(branch.revision_history(),
601
564
['Arch-1:demo@DONOTUSE%c--import--0--base-0',
607
570
self.assertEqual('path', inv.id2path('x_this_id%2fneeds%25escaping'))
609
572
def test_inbranch_conversion(self):
610
import_version('output', pybaz.Version(self._baz._inbranch_tag), None)
573
import_version('output', pybaz.Version(self._baz._inbranch_tag),
611
575
# expected results:
612
576
# three commits, no files, revision identifiers of
613
577
# 'demo@DONOTUSE_c--import--0--base-0' and
620
584
self._baz._inbranch_tag_base_bzr,
621
585
self._baz._inbranch_tag_head_bzr])
623
import_version('output2', pybaz.Version(self._baz._inbranch_tag), None)
587
import_version('output2', pybaz.Version(self._baz._inbranch_tag),
624
589
branch2 = Branch.open('output2')
626
591
self.assertEqual(branch.revision_history(), branch2.revision_history())
646
611
self.assertEqual(rev.parent_ids,
647
612
[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
615
class TestNamespacePrevious(TestCase):
687
641
self.assertEqual(namespace_previous(self.version['versionfix-3000']),
688
642
self.version['versionfix-2999'])
691
644
class TestNamespaceMapping(TestCase):
693
646
def test_namespace_mapping_branch(self):
710
663
class TestFileIdMapping(TestCase):
712
665
def test_slash(self):
666
from bzrlib.plugins.bzrtools.baz_import import map_file_id
713
667
self.assertEqual('c%2fc', map_file_id('c/c'))
714
668
self.assertEqual('c%25c', map_file_id('c%c'))
742
696
shutil.rmtree(os.path.join(self._tmpdir, 'tree'))
744
698
def test_cmd_exists(self):
745
from bzrlib.plugins.bzrtools import cmd_baz_import
699
from bzrlib.plugins.bzrtools.baz_import import cmd_baz_import
747
701
def test_empty_archive(self):
748
702
command = cmd_baz_import()
762
716
self.failUnless(os.path.exists(os.path.join(self._tmpdir,'output',
763
717
'c1', '0.2','branch')))
764
default_format = repository.RepositoryFormat.get_default_format()
765
if getattr(default_format, 'rich_root_data', False):
769
718
walk_len = len(list(os.walk(os.path.join(self._tmpdir,'output'))))
770
self.assertEqual(num_files, walk_len)
719
self.assertEqual(22, walk_len)
772
721
def test_run_twice(self):
773
722
self.make_import('c--0')
784
733
self.make_import('c--0')
785
734
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())