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:
26
from bzrlib.plugins.bzrtools import cmd_baz_import
27
from bzrlib.plugins.bzrtools.baz_import import (import_version,
26
from bzrtools.baz_import import (import_version, revision_id,
27
cmd_baz_import, make_archive, map_file_id)
29
from bzrlib.plugins.bzrtools.baz_import import (import_version,
32
35
from StringIO import StringIO
34
37
from testresources import (TestResource, TestLoader, OptimisingTestSuite,
38
41
from bzrlib.errors import NoSuchRevision
39
from bzrlib.plugins.bzrtools.fai import namespace_previous
43
from bzrtools.fai import namespace_previous
45
from bzrlib.plugins.bzrtools.fai import namespace_previous
40
46
from bzrlib.branch import Branch
64
70
pybaz.set_my_id("Test User<test@example.org>")
66
72
self.make_empty_import()
69
74
self._empty_tag = 'demo@DONOTUSE/c--empty-tag--0'
70
self._empty_tag_bzr = revision_id(self._empty_tag + '--base-0', None)
75
self._empty_tag_bzr = revision_id(self._empty_tag + '--base-0')
71
76
pybaz.Revision('demo@DONOTUSE/c--import--0--base-0').make_continuation(
72
77
pybaz.Version(self._empty_tag))
74
79
self._empty_merged_tag = 'demo@DONOTUSE/c--empty-merged-tag--0'
75
self._empty_merged_tag_bzr_base = revision_id(self._empty_merged_tag
77
self._empty_merged_tag_bzr = revision_id(self._empty_merged_tag
80
self._empty_merged_tag_bzr_base = revision_id(self._empty_merged_tag
82
self._empty_merged_tag_bzr = revision_id(self._empty_merged_tag
79
84
pybaz.Revision('demo@DONOTUSE/c--import--0--base-0').make_continuation(
80
85
pybaz.Version(self._empty_merged_tag))
81
86
tree = pybaz.Revision(self._empty_merged_tag + '--base-0').get(
86
91
msg["summary"]="did a merge, yarh"
88
93
shutil.rmtree(os.path.join(self._tmpdir, 'tree'))
90
95
# tree, two commits, includes merge of other branch
91
96
self._empty_merged_tag_2 = 'demo@DONOTUSE/c--empty-tag-2--0'
92
97
self._empty_merged_tag_2_bzr_base = revision_id(
93
self._empty_merged_tag_2 + '--base-0', None)
98
self._empty_merged_tag_2 + '--base-0')
94
99
self._empty_merged_tag_2_bzr = revision_id(
95
self._empty_merged_tag_2 + '--patch-1', None)
100
self._empty_merged_tag_2 + '--patch-1')
96
101
pybaz.Revision('demo@DONOTUSE/c--import--0--base-0').make_continuation(
97
102
pybaz.Version(self._empty_merged_tag_2))
98
103
tree = pybaz.Revision(self._empty_merged_tag_2 + '--base-0').get (
105
110
shutil.rmtree(os.path.join(self._tmpdir, 'tree'))
107
112
self._bad_id_tag = 'demo@DONOTUSE/c--bad-id--0'
108
self._bad_id_tag_bzr_base = revision_id(self._bad_id_tag + '--base-0',
110
self._bad_id_tag_bzr = revision_id(self._bad_id_tag + '--patch-1',
113
self._bad_id_tag_bzr_base = revision_id(self._bad_id_tag + '--base-0')
114
self._bad_id_tag_bzr = revision_id(self._bad_id_tag + '--patch-1')
112
115
pybaz.Revision('demo@DONOTUSE/c--import--0--base-0').make_continuation(
113
116
pybaz.Version(self._bad_id_tag))
114
117
tree = pybaz.Revision(self._bad_id_tag + '--base-0').get(
115
118
os.path.join(self._tmpdir, 'tree'))
116
119
from bzrlib.plugins.bzrtools.baz_import import add_file
117
add_file(os.path.join(self._tmpdir,'tree/path'), 'text',
120
add_file(os.path.join(self._tmpdir,'tree/path'), 'text',
118
121
'this_id/needs%escaping')
119
122
msg = tree.log_message()
120
123
msg["summary"] = "commit something which needs escaping."
153
156
def make_empty_import(self):
154
157
self._import = 'demo@DONOTUSE/c--import--0'
155
158
os.mkdir(os.path.join(self._tmpdir, 'tree'))
156
tree = pybaz.init_tree(os.path.join(self._tmpdir, 'tree'),
159
tree = pybaz.init_tree(os.path.join(self._tmpdir, 'tree'),
158
161
msg = tree.log_message()
159
162
msg["summary"] = "I am importing now"
160
163
tree.import_(msg)
161
164
shutil.rmtree(os.path.join(self._tmpdir, 'tree'))
163
def make_utf8_log(self):
164
self._utf8 = 'demo@DONOTUSE/c--utf8--0'
165
os.mkdir(os.path.join(self._tmpdir, 'tree'))
166
tree = pybaz.init_tree(os.path.join(self._tmpdir, 'tree'),
168
msg = tree.log_message()
169
msg["summary"] = u"I am importing now\u1234".encode('utf-8')
171
shutil.rmtree(os.path.join(self._tmpdir, 'tree'))
173
166
def make_missing_ancestor(self):
174
167
self._archivegoneroot = os.path.join(self._tmpdir, 'archivegone')
175
168
self._archive = make_archive('demo-gone@DONOTUSE',
176
169
str(self._archivegoneroot))
177
170
self._missing_import = 'demo-gone@DONOTUSE/c--import--0'
178
self._missing_import_bzr = revision_id(self._missing_import
171
self._missing_import_bzr = revision_id(self._missing_import
180
173
self._missing_ancestor = 'demo@DONOTUSE/c--gone--0'
181
self._missing_ancestor_bzr = revision_id(self._missing_ancestor
174
self._missing_ancestor_bzr = revision_id(self._missing_ancestor
183
176
os.mkdir(os.path.join(self._tmpdir, 'tree'))
184
tree = pybaz.init_tree(os.path.join(self._tmpdir, 'tree'),
177
tree = pybaz.init_tree(os.path.join(self._tmpdir, 'tree'),
185
178
self._missing_import)
186
179
msg = tree.log_message()
187
180
msg["summary"] = "I am importing now"
194
187
# make an import for testing history-reuse logic.
195
188
# note the use of a namespace layout here.
196
self._missing_import_imported = os.path.join(self._tmpdir,
189
self._missing_import_imported = os.path.join(self._tmpdir,
197
190
'archivegone-bzr')
198
191
os.mkdir(os.path.join(self._tmpdir, 'archivegone-bzr'))
199
192
os.mkdir(os.path.join(self._tmpdir, 'archivegone-bzr', 'c'))
200
import_version(os.path.join(self._tmpdir, 'archivegone-bzr',
193
import_version(os.path.join(self._tmpdir, 'archivegone-bzr',
202
pybaz.Version(self._missing_import), None)
195
pybaz.Version(self._missing_import))
203
196
# and make it inaccessible
204
197
pybaz.Archive('demo-gone@DONOTUSE').unregister()
206
199
def make_inbranch_continuation(self):
207
200
self._inbranch_tag = 'demo@DONOTUSE/c--inbranch-tag--0'
208
201
self._inbranch_tag_base = self._inbranch_tag + '--base-0'
209
self._inbranch_tag_base_bzr = revision_id(self._inbranch_tag_base,
202
self._inbranch_tag_base_bzr = revision_id(self._inbranch_tag_base)
211
203
pybaz.Revision('demo@DONOTUSE/c--import--0--base-0').make_continuation(
212
204
pybaz.Version(self._inbranch_tag))
213
205
self._inbranch_tag_head = self._inbranch_tag + '--patch-1'
214
self._inbranch_tag_head_bzr = revision_id(self._inbranch_tag_head,
206
self._inbranch_tag_head_bzr = revision_id(self._inbranch_tag_head)
216
207
pybaz.Revision(self._inbranch_tag_base).make_continuation(
217
208
pybaz.Version(self._inbranch_tag))
237
228
def tearDown(self):
238
229
ResourcedTestCase.tearDownResources(self)
239
230
TestCaseInTempDir.tearDown(self)
241
def test_import_utf8(self):
242
import_version('output', pybaz.Version(self._baz._utf8), None)
243
branch = Branch.open('output')
244
plain_revid = 'Arch-1:demo@DONOTUSE%c--utf8--0--base-0'
245
self.assertEqual([plain_revid], branch.revision_history())
246
self.assertEqual(u'I am importing now\ufffd\ufffd\ufffd',
247
branch.repository.get_revision(plain_revid).message)
248
import_version('output2', pybaz.Version(self._baz._utf8), 'utf-8')
249
branch2 = Branch.open('output2')
250
utf8_revid = 'Arch-1-utf-8:demo@DONOTUSE%c--utf8--0--base-0'
251
self.assertEqual([utf8_revid], branch2.revision_history())
252
self.assertEqual(u'I am importing now\u1234',
253
branch2.repository.get_revision(utf8_revid).message)
255
232
def test_import_empty(self):
256
import_version('output', pybaz.Version(self._baz._import), None)
233
import_version('output', pybaz.Version(self._baz._import))
257
234
# expected results:
258
# one commit, no files, revision identifier of
235
# one commit, no files, revision identifier of
259
236
# 'demo@DONOTUSE_c--import--0--base-0'
260
237
branch = Branch.open('output')
261
238
repo = branch.repository
279
255
"Arch-1:demo@DONOTUSE%c--import--0--base-0")
281
257
def test_empty_tagged(self):
282
import_version('output', pybaz.Version(self._baz._empty_tag), None)
258
import_version('output', pybaz.Version(self._baz._empty_tag))
283
259
# expected results:
284
# two commits, no files, revision identifiers of
260
# two commits, no files, revision identifiers of
285
261
# 'demo@DONOTUSE_c--import--0--base-0' and
286
262
# self._baz._empty_tag_bzr
287
263
branch = Branch.open('output')
300
276
# and we should get some expected values:
301
277
self.assertEqual(rev.committer, "Test User<test@example.org>")
302
self.assertEqual(rev.message,
278
self.assertEqual(rev.message,
303
279
"tag of demo@DONOTUSE/c--import--0--base-0")
304
280
self.assertEqual(rev.revision_id, self._baz._empty_tag_bzr)
306
282
def test_empty_merged_tagged(self):
307
import_version('output', pybaz.Version(self._baz._empty_merged_tag),
283
import_version('output', pybaz.Version(self._baz._empty_merged_tag))
309
284
# expected results:
310
# two commits, no files, revision identifiers of
285
# two commits, no files, revision identifiers of
311
286
# 'demo@DONOTUSE_c--import--0--base-0' and
312
287
# self._baz._empty_merged_tag_bzr_base
313
288
# self._baz._empty_merged_tag_bzr
320
295
self._baz._empty_merged_tag_bzr_base,
321
296
self._baz._empty_merged_tag_bzr])
323
import_version('output2', pybaz.Version(self._baz._empty_merged_tag),
298
import_version('output2', pybaz.Version(self._baz._empty_merged_tag))
325
299
branch2 = Branch.open('output2')
326
300
repo2 = branch2.repository
327
301
# and import what we should be merged up against for checking with.
328
import_version('output3', pybaz.Version(self._baz._empty_tag), None)
302
import_version('output3', pybaz.Version(self._baz._empty_tag))
329
303
branch3 = Branch.open('output3')
331
305
self.assertEqual(branch.revision_history(), branch2.revision_history())
332
self.assertNotEqual(branch.revision_history(),
306
self.assertNotEqual(branch.revision_history(),
333
307
branch3.revision_history())
334
308
# check revisions in the history.
335
309
rev = repo.get_revision(self._baz._empty_merged_tag_bzr_base)
357
331
self._baz._empty_merged_tag_bzr_base)
358
332
self.assertEqual(rev.parent_ids[1], self._baz._empty_tag_bzr)
360
# this tree should have nothing missing from that tree.
334
# this tree should have nothing missing from that tree.
361
335
# FIXME there is no code for this right now.
362
336
# self.assertEqual(branch.missing_revisions(branch3), [])
364
338
def test_merge_branch_with_merges(self):
365
import_version('output', pybaz.Version(self._baz._empty_merged_tag_2),
339
import_version('output', pybaz.Version(self._baz._empty_merged_tag_2))
367
340
# expected results:
368
# two commits, no files, revision identifiers of
341
# two commits, no files, revision identifiers of
369
342
# 'demo@DONOTUSE_c--import--0--base-0' and
370
343
# self._baz._empty_merged_tag_2_bzr_base
371
344
# self._baz._empty_merged_tag_2_bzr
378
351
self._baz._empty_merged_tag_2_bzr_base,
379
352
self._baz._empty_merged_tag_2_bzr])
381
import_version('output2', pybaz.Version(self._baz._empty_merged_tag_2),
354
import_version('output2', pybaz.Version(self._baz._empty_merged_tag_2))
383
355
branch2 = Branch.open('output2')
384
356
repo2 = branch2.repository
385
357
# and import what we should be merged up against for checking with.
386
import_version('output3', pybaz.Version(self._baz._empty_merged_tag),
358
import_version('output3', pybaz.Version(self._baz._empty_merged_tag))
388
359
branch3 = Branch.open('output3')
390
361
self.assertEqual(branch.revision_history(), branch2.revision_history())
391
self.assertNotEqual(branch.revision_history(),
362
self.assertNotEqual(branch.revision_history(),
392
363
branch3.revision_history())
393
364
# check revisions in the history.
394
365
rev = repo.get_revision(self._baz._empty_merged_tag_2_bzr_base)
397
368
self.assertEqual(rev, rev2)
398
369
# and we should get some expected values:
399
370
self.assertEqual(rev.committer, "Test User<test@example.org>")
400
self.assertEqual(rev.message,
371
self.assertEqual(rev.message,
401
372
"tag of demo@DONOTUSE/c--import--0--base-0")
402
self.assertEqual(rev.revision_id,
373
self.assertEqual(rev.revision_id,
403
374
self._baz._empty_merged_tag_2_bzr_base)
405
376
# check next revisions in the history.
416
387
self.assertEqual(rev.parent_ids[1],
417
388
self._baz._empty_merged_tag_bzr)
419
# this tree should have nothing missing from that tree.
390
# this tree should have nothing missing from that tree.
420
391
# FIXME there is no code for this right now.
421
392
# self.assertEqual(branch.missing_revisions(branch3), [])
423
394
def test_import_symlink(self):
424
import_version('output', pybaz.Version(self._baz._import_symlink),
395
import_version('output', pybaz.Version(self._baz._import_symlink),
426
397
# expected results:
427
# two commits, no files, revision identifier of
398
# two commits, no files, revision identifier of
428
399
# 'demo@DONOTUSE_c--import--0--base-0'
429
400
branch = Branch.open('output')
430
401
self.assertEqual(branch.revision_history(),
451
422
self.assertEqual(entry.kind, 'symlink')
452
423
self.assertEqual(entry.symlink_target, 'missing-file-name')
454
# Test kind change for import
455
import_version('output3', pybaz.Version(self._baz._import_symlink),
425
# current bzr doesn't handle type changes
426
self.assertRaises(AssertionError, import_version, 'output3',
427
pybaz.Version(self._baz._import_symlink))
458
429
def test_missing_ancestor(self):
459
import_version('output', pybaz.Version(self._baz._missing_ancestor),
430
import_version('output', pybaz.Version(self._baz._missing_ancestor))
461
431
# expected results:
462
# one commits, no files, revision identifiers of
432
# one commits, no files, revision identifiers of
463
433
# 'demo@DONOTUSE_c--gone--0--base-0' and
464
434
# a merge of demo-gone@DONOTUSE%c--import--0
465
435
branch = Branch.open('output')
478
447
# and we should get some expected values:
479
448
self.assertEqual(rev.committer, "Test User<test@example.org>")
480
self.assertEqual(rev.message,
449
self.assertEqual(rev.message,
481
450
"tag of demo-gone@DONOTUSE/c--import--0--base-0")
482
451
self.assertEqual(rev.revision_id, self._baz._missing_ancestor_bzr)
483
452
self.assertEqual(rev.parent_ids[0], self._baz._missing_import_bzr)
484
453
self.assertEqual(1, len(rev.parent_ids))
486
455
# must NOT be able to get the merged evision
487
self.assertRaises(NoSuchRevision, branch.repository.get_revision,
456
self.assertRaises(NoSuchRevision, branch.repository.get_revision,
488
457
self._baz._missing_import_bzr)
490
459
def test_missing_ancestor_reusing_history(self):
491
460
import_version('output', pybaz.Version(self._baz._missing_ancestor),
493
461
reuse_history_from=[self._baz._missing_import_imported])
494
462
# expected results:
495
# one commits, no files, revision identifiers of
496
# 'demo-gone@DONOTUSE%c--import--0--base-0' and
463
# one commits, no files, revision identifiers of
464
# 'demo-gone@DONOTUSE%c--import--0--base-0' and
497
465
# 'demo@DONOTUSE%c--gone--0--base-0'
498
466
branch = Branch.open('output')
499
467
self.assertEqual(branch.revision_history(),
516
483
# and we should get some expected values:
517
484
self.assertEqual(rev.committer, "Test User<test@example.org>")
518
self.assertEqual(rev.message,
485
self.assertEqual(rev.message,
519
486
"tag of demo-gone@DONOTUSE/c--import--0--base-0")
520
487
self.assertEqual(rev.revision_id, self._baz._missing_ancestor_bzr)
521
488
self.assertEqual(rev.parent_ids[0], self._baz._missing_import_bzr)
522
489
self.assertEqual(1, len(rev.parent_ids))
524
491
def test_bad_file_id(self):
525
import_version('output', pybaz.Version(self._baz._bad_id_tag), None)
492
import_version('output', pybaz.Version(self._baz._bad_id_tag))
526
493
# expected results:
527
# three commits, one files, revision identifiers of
494
# three commits, one files, revision identifiers of
528
495
# 'demo@DONOTUSE_c--import--0--base-0' ,
529
496
# 'demo@DONOTUSE/c--bad-id--0--base-0' ,
530
497
# ''demo@DONOTUSE/c--bad-id--0--patch-1'
539
506
self.assertEqual('path', inv.id2path('x_this_id%2fneeds%25escaping'))
541
508
def test_appending_revisions_already_present(self):
542
import_version('output', pybaz.Version(self._baz._bad_id_tag), None,
509
import_version('output', pybaz.Version(self._baz._bad_id_tag),
544
511
# expected results:
545
# three commits, one files, revision identifiers of
512
# three commits, one files, revision identifiers of
546
513
# 'demo@DONOTUSE_c--import--0--base-0' ,
547
514
# 'demo@DONOTUSE/c--bad-id--0--base-0' ,
548
515
# ''demo@DONOTUSE/c--bad-id--0--patch-1'
569
536
self.assertEqual('path', inv.id2path('x_this_id%2fneeds%25escaping'))
571
538
def test_appending_revisions_all_already_present(self):
572
import_version('output', pybaz.Version(self._baz._bad_id_tag), None)
539
import_version('output', pybaz.Version(self._baz._bad_id_tag))
573
540
# expected results:
574
# three commits, one files, revision identifiers of
541
# three commits, one files, revision identifiers of
575
542
# 'demo@DONOTUSE_c--import--0--base-0' ,
576
543
# 'demo@DONOTUSE/c--bad-id--0--base-0' ,
577
544
# ''demo@DONOTUSE/c--bad-id--0--patch-1'
599
566
self.assertEqual('path', inv.id2path('x_this_id%2fneeds%25escaping'))
601
568
def test_inbranch_conversion(self):
602
import_version('output', pybaz.Version(self._baz._inbranch_tag), None)
569
import_version('output', pybaz.Version(self._baz._inbranch_tag))
603
570
# expected results:
604
# three commits, no files, revision identifiers of
571
# three commits, no files, revision identifiers of
605
572
# 'demo@DONOTUSE_c--import--0--base-0' and
606
573
# self._baz._inbranch_tag_base_bzr
607
574
# self._baz._inbranch_tag_head_bzr
734
701
shutil.rmtree(os.path.join(self._tmpdir, 'tree'))
736
703
def test_cmd_exists(self):
737
from bzrlib.plugins.bzrtools import cmd_baz_import
704
from bzrlib.plugins.bzrtools.baz_import import cmd_baz_import
739
706
def test_empty_archive(self):
740
707
command = cmd_baz_import()
741
708
command.run(os.path.join(self._tmpdir, 'output'), 'demo@DONOTUSE')
742
709
self.failUnless(os.path.exists(os.path.join(self._tmpdir,'output')))
743
710
walk_len = len(list(os.walk(os.path.join(self._tmpdir,'output'))))
744
self.assertEqual(9, walk_len)
711
self.assertEqual(7, walk_len)
746
713
def test_two_branches(self):
747
714
self.make_import('c--0')
749
716
command = cmd_baz_import()
750
717
command.run(os.path.join(self._tmpdir, 'output'), 'demo@DONOTUSE')
751
718
self.failUnless(os.path.exists(os.path.join(self._tmpdir,'output')))
752
self.failUnless(os.path.exists(os.path.join(self._tmpdir,'output',
719
self.failUnless(os.path.exists(os.path.join(self._tmpdir,'output',
754
self.failUnless(os.path.exists(os.path.join(self._tmpdir,'output',
721
self.failUnless(os.path.exists(os.path.join(self._tmpdir,'output',
755
722
'c1', '0.2','branch')))
756
default_format = repository.RepositoryFormat.get_default_format()
757
723
walk_len = len(list(os.walk(os.path.join(self._tmpdir,'output'))))
758
self.assertEqual(22, walk_len)
724
self.assertEqual(20, walk_len)
760
726
def test_run_twice(self):
761
727
self.make_import('c--0')
762
728
command = cmd_baz_import()
763
729
command.run(os.path.join(self._tmpdir, 'output'), 'demo@DONOTUSE')
764
730
command.run(os.path.join(self._tmpdir, 'output'), 'demo@DONOTUSE')
766
732
def test_accepts_reuse_history(self):
767
733
self.make_import('c--0')
768
self.run_bzr(['baz-import', os.path.join(self._tmpdir, 'output'),
769
'demo@DONOTUSE', '.', '.'])
771
def test_does_not_need_reuse_history(self):
772
self.make_import('c--0')
773
self.run_bzr(['baz-import', os.path.join(self._tmpdir, 'output'),
776
def test_does_not_need_reuse_history(self):
777
self.make_import('c--0')
778
self.run_bzr(['baz-import', os.path.join(self._tmpdir, 'output'),
781
def test_encoding_flag(self):
782
self.make_import('c--0')
783
self.run_bzr(['baz-import', os.path.join(self._tmpdir, 'output'),
785
self.assertEqual(['Arch-1:demo@DONOTUSE%c--0--base-0'],
786
Branch.open(os.path.join(self._tmpdir,
787
'output/c/+trunk')).revision_history())
788
self.run_bzr(['baz-import', os.path.join(self._tmpdir, 'output2'),
789
'demo@DONOTUSE', '--encoding', 'utf-8'])
790
self.assertEqual(['Arch-1-utf-8:demo@DONOTUSE%c--0--base-0'],
791
Branch.open(os.path.join(self._tmpdir,
792
'output2/c/+trunk')).revision_history())
793
self.run_bzr(['baz-import-branch', os.path.join(self._tmpdir,
794
'output3'), 'demo@DONOTUSE/c--0'])
795
self.assertEqual(['Arch-1:demo@DONOTUSE%c--0--base-0'],
796
Branch.open(os.path.join(self._tmpdir,
797
'output3')).revision_history())
798
self.run_bzr(['baz-import-branch', os.path.join(self._tmpdir,
799
'output4'), 'demo@DONOTUSE/c--0', '--encoding', 'utf-8'])
800
self.assertEqual(['Arch-1-utf-8:demo@DONOTUSE%c--0--base-0'],
801
Branch.open(os.path.join(self._tmpdir,
802
'output4')).revision_history())
734
self.run_bzr('baz-import', os.path.join(self._tmpdir, 'output'),
735
'demo@DONOTUSE', '.', '.')
737
def test_does_not_need_reuse_history(self):
738
self.make_import('c--0')
739
self.run_bzr('baz-import', os.path.join(self._tmpdir, 'output'),