source: tailor/vcpx/tests/tailor.py @ 1440

Revision 1440, 19.2 KB checked in by techtonik@…, 6 years ago (diff)

test suite windows path correction

Line 
1# -*- mode: python; coding: utf-8 -*-
2# :Progetto: vcpx -- Operational tests
3# :Creato:   lun 08 ago 2005 22:17:10 CEST
4# :Autore:   Lele Gaifax <lele@nautilus.homeip.net>
5# :Licenza:  GNU General Public License
6#
7
8"""\
9#!tailor
10'''
11[DEFAULT]
12target-module = None
13source-repository = %(tailor_repo)s
14encoding = None
15target-repository = None
16use-propset = False
17source-module = None
18update = True
19subdir = test
20debug = False
21remove-first-log-line = False
22patch-name-format = None
23verbose = False
24state-file = tailor.state
25start-revision = Version 0.9.17
26
27[darcs2bzr]
28target = bzr:tailor
29root-directory = %(testdir)s/darcs2bzr
30source = darcs:tailor
31patch-name-format = %(revision)s
32
33[bzr2darcs]
34source = bzr:tailor
35root-directory = %(testdir)s/bzr2darcs
36target = darcs:bzrtailor
37patch-name-format = %(revision)s
38start-revision = INITIAL
39
40[darcs:tailor]
41
42[bzr:tailor]
43repository = %(testdir)s/darcs2bzr
44
45[darcs:bzrtailor]
46
47
48[darcs2cdv]
49target = cdv:tailor
50root-directory = %(testdir)s/darcs2cdv
51source = darcs:tailor
52
53[cdv:tailor]
54
55
56[darcs2hg]
57target = hg:tailor
58root-directory = %(testdir)s/darcs2hg
59source = darcs:tailor
60
61[hg:tailor]
62
63
64[darcs2svn]
65target = svn:tailor
66root-directory = %(testdir)s/darcs2svn
67source = darcs:svntailor
68start-revision = INITIAL
69
70[svn2darcs]
71target = darcs:svntailor
72root-directory = %(testdir)s/svn2darcs
73source = svn:tailor
74start-revision = 1
75
76[svn:tailor]
77repository = file://%(testdir)s/svnrepo
78module = tailor
79subdir = svnside
80use-propset = True
81
82[darcs:svntailor]
83repository = %(tailor_repo)s
84subdir = darcside
85
86
87[darcs2monotone]
88target = monotone:tailor
89root-directory = %(testdir)s/darcs2monotone
90source = darcs:tailor
91
92[monotone2darcs]
93source = monotone:tailor
94root-directory = %(testdir)s/monotone2darcs
95target = darcs:mtntailor
96start-revision = INITIAL
97
98[monotone:tailor]
99keygenid = tailor
100passphrase = fin che la barca va
101repository = %(testdir)s/tailor-mtn.db
102module = tailor.test
103subdir = mntside
104
105[darcs:mtntailor]
106subdir = darcside
107
108
109[cvs2darcs]
110target = darcs:pxlib
111root-directory = %(testdir)s/cvs2darcs
112source = cvs:pxlib
113start-revision = R-0-5-1
114subdir = pxlib
115
116[darcs:pxlib]
117
118[cvs:pxlib]
119repository = :pserver:anonymous@pxlib.cvs.sourceforce.net:/cvsroot/pxlib
120module = pxlib
121encoding = iso-8859-1
122
123
124[darcs2cvs]
125target = cvs:tailor
126root-directory = %(testdir)s/darcs2cvs
127source = darcs:tailor
128
129[cvs:tailor]
130repository = :local:%(testdir)s/cvsrepo
131module = tailor
132
133
134[cvs2hg]
135root-directory = %(testdir)s/cvs2hg
136source = cvs:cmsmini
137target = hg:cmsmini
138start-revision = INITIAL
139subdir = cmsmini
140before-commit = remap_authors
141
142[cvs:cmsmini]
143repository = :pserver:anonymous@cvs.savannah.nongnu.org:/sources/cmsmini
144module = cmsmini
145
146[hg:cmsmini]
147
148
149[cvs2bzr]
150root-directory = %(testdir)s/cvs2bzr
151source = cvs:atse
152target = bzr:atse
153start-revision = spamies-improvement-branch INITIAL
154subdir = atse
155
156[cvs:atse]
157repository = :pserver:anonymous@collective.cvs.sourceforge.net:/cvsroot/collective
158module = ATSchemaEditorNG
159
160[bzr:atse]
161
162
163[cvs2svn]
164source = cvs:cmfeditions-houston-sprint
165target = svn:cmfeditions
166start-revision = houston-sprint-branch INITIAL
167root-directory = %(testdir)s/cvs2svn
168
169[cvs:cmfeditions-houston-sprint]
170repository = :pserver:anonymous@collective.cvs.sourceforge.net:/cvsroot/collective
171module = CMFEditions
172subdir = cvside
173
174[svn:cmfeditions]
175repository = file://%(testdir)s/cmfeditions.svnrepo
176module = cmfeditions
177subdir = svnside
178
179
180[svn2hg]
181source = svn:plonebook
182target = hg:plonebook
183start-revision = 1101
184root-directory = %(testdir)s/svn2hg
185
186[svn:plonebook]
187repository = http://docit.bice.dyndns.org
188module = /Plone/PloneBook2/it
189
190[hg:plonebook]
191
192[svn2hg_with_externals]
193source = svn:plonebook_we
194target = hg:plonebook
195start-revision = HEAD
196root-directory = %(testdir)s/svn2hg_we
197
198[svn:plonebook_we]
199repository = http://docit.bice.dyndns.org
200module = /Plone/PloneBook2/it
201ignore-externals = False
202
203
204[bazaar2darcs]
205source = bzr:oodoctest
206target = darcs:oodoctest
207root-directory = %(testdir)s/bazaar2darcs
208start-revision = INITIAL
209
210[bzr:oodoctest]
211repository = http://download.gna.org/oodoctest/oodoctest.og.main/
212
213[darcs:oodoctest]
214
215
216[darcs_rename_delete]
217source = darcs:darcs_rename_delete
218target = svn:darcs_rename_delete
219root-directory = %(testdir)s/darcs_rename_delete
220start-revision = INITIAL
221
222[darcs:darcs_rename_delete]
223repository = %(testdir)s/rename_delete
224subdir = darcs
225
226[svn:darcs_rename_delete]
227repository = file://%(testdir)s/darcs_rename_delete.svnrepo
228module = /
229subdir = svn
230
231
232[darcs_rename_delete_dir]
233source = darcs:darcs_rename_delete_dir
234target = svn:darcs_rename_delete_dir
235root-directory = %(testdir)s/darcs_rename_delete_dir
236start-revision = INITIAL
237
238[darcs:darcs_rename_delete_dir]
239repository = %(testdir)s/rename_delete_dir
240subdir = darcs
241
242[svn:darcs_rename_delete_dir]
243repository = file://%(testdir)s/darcs_rename_delete_dir.svnrepo
244module = /
245subdir = svn
246
247
248[cvsdirtest]
249target = bzr:cvsdirtest
250start-revision = INITIAL
251root-directory = %(testdir)s/cvsdirtest/cvs2bzr
252source = cvs:cvsdirtest
253subdir = test-work
254
255[cvspsdirtest]
256target = bzr:cvsdirtest
257start-revision = INITIAL
258root-directory = %(testdir)s/cvsdirtest/cvsps2bzr
259source = cvsps:cvsdirtest
260subdir = test-work
261
262[darcsdirtest]
263target = darcs:cvsdirtest
264start-revision = INITIAL
265root-directory = %(testdir)s/cvsdirtest/cvs2darcs
266source = cvs:cvsdirtest
267subdir = test-work
268
269[svndirtest]
270target = svn:cvsdirtest
271start-revision = INITIAL
272root-directory = %(testdir)s/cvsdirtest/cvs2svn
273source = cvs:cvsdirtest
274subdir = test-work
275
276[bzr:cvsdirtest]
277
278[darcs:cvsdirtest]
279
280[cvs:cvsdirtest]
281module = test
282repository = %(testdir)s/cvsdirtest.cvsrepo
283
284[cvsps:cvsdirtest]
285module = test
286repository = %(testdir)s/cvsdirtest.cvsrepo
287
288[svn:cvsdirtest]
289module = test
290repository = file://%(testdir)s/cvsdirtest.svnrepo
291
292[svnresurdirtest]
293target = svn:cvsresurdirtest
294start-revision = INITIAL
295root-directory = %(testdir)s/cvsresurdirtest/cvs2svn
296source = cvs:cvsresurdirtest
297subdir = test-work
298
299[cvs:cvsresurdirtest]
300module = test
301repository = %(testdir)s/cvsresurdirtest.cvsrepo
302
303[svn:cvsresurdirtest]
304module = test
305repository = file://%(testdir)s/cvsresurdirtest.svnrepo
306
307'''
308
309def remap_authors(context, changeset):
310    if changeset.author == 'tizziano':
311        changeset.author = 'tiziano'
312    return True
313"""
314
315from unittest import TestCase
316from cStringIO import StringIO
317from vcpx import TailorException
318from vcpx.config import Config
319from vcpx.tailor import Tailorizer
320from vcpx.shwrap import ExternalCommand, PIPE
321
322
323class OperationalTest(TestCase):
324
325    TESTDIR = None
326
327    def setUp(self):
328        from os import mkdir, getcwd
329        from os.path import exists, split, join
330        from tempfile import gettempdir
331        from atexit import register
332        from shutil import rmtree
333        from vcpx.tests import DEBUG
334
335        self.TESTDIR = join(gettempdir(), 'tailor-tests')
336
337        tailor_repo = getcwd()
338        while tailor_repo != split(tailor_repo)[0] and not exists(join(tailor_repo, '_darcs')):
339            tailor_repo = split(tailor_repo)[0]
340        assert exists(join(tailor_repo, '_darcs')), "Tailor Darcs repository not found!"
341        self.tailor_repo = tailor_repo
342        self.config = Config(StringIO(__doc__), {'tailor_repo': tailor_repo,
343                                                 'testdir': self.TESTDIR,
344                                                 'verbose': DEBUG})
345
346        if not exists(self.TESTDIR):
347            mkdir(self.TESTDIR)
348            register(rmtree, self.TESTDIR)
349
350    def diffWhenPossible(self, tailorizer):
351        "Diff the resulting sides"
352
353        from vcpx.tests import DEBUG
354
355        dwd = tailorizer.workingDir()
356        if not dwd.shared_basedirs:
357            cmd = ["diff", "-r", "-u"]
358            if tailorizer.source.METADIR:
359                cmd.extend(["-x", tailorizer.source.METADIR])
360            if tailorizer.target.METADIR:
361                cmd.extend(["-x", tailorizer.target.METADIR])
362            d = ExternalCommand(command=cmd, nolog=not DEBUG)
363            out = d.execute(dwd.source.repository.basedir,
364                            dwd.target.repository.basedir,
365                            stdout=PIPE)[0]
366            return out.read()
367        else:
368            return ""
369
370    def tailorize(self, project):
371        "The actual test"
372
373        tailorizer = Tailorizer(project, self.config)
374        self.assert_(not tailorizer.exists(),
375                     "For test purposes, better start from scratch!")
376        tailorizer()
377        self.assertEqual(self.diffWhenPossible(tailorizer), "")
378
379class Darcs(OperationalTest):
380    "Test darcs backend"
381
382    def testConfiguration(self):
383        "Test basic configuration"
384
385        p = Tailorizer('darcs2svn', self.config)
386        self.assertEqual(p.source.subdir, 'darcside')
387        self.assertEqual(p.rootdir, '%s/darcs2svn' % self.TESTDIR)
388        self.assertEqual(p.source.repository, self.tailor_repo)
389        self.assertEqual(p.target.repository,
390                         'file://%s/svnrepo' % self.TESTDIR)
391        self.assertEqual(p.state_file.filename,
392                         '%s/darcs2svn/tailor.state' % self.TESTDIR)
393
394        tailorizer = Tailorizer('cvs2darcs', self.config)
395        self.assertEqual(tailorizer.subdir, 'pxlib')
396        self.assertEqual(tailorizer.source.subdir, 'pxlib')
397
398    def testDarcsAndBazaar(self):
399        "Test darcs to Bazaar and the other way around"
400
401        self.tailorize('darcs2bzr')
402        self.tailorize('bzr2darcs')
403
404    def testDarcsToMercurial(self):
405        "Test darcs to mercurial"
406
407        self.tailorize('darcs2hg')
408
409    def testDarcsToCodeville(self):
410        "Test darcs to codeville"
411
412        self.tailorize('darcs2cdv')
413
414    def testDarcsAndSubversion(self):
415        "Test darcs to subversion and the other way around"
416
417        self.tailorize('darcs2svn')
418        self.tailorize('svn2darcs')
419
420    def testDarcsAndMonotone(self):
421        "Test darcs to monotone and the other way around"
422
423        self.tailorize('darcs2monotone')
424        self.tailorize('monotone2darcs')
425
426
427class Bazaar(OperationalTest):
428    "Test the Bazaar source backend"
429
430    def testBazaarAndPython23(self):
431        "Bazaar test we detect early when running under Python < 2.4"
432
433        from sys import version_info
434
435        if version_info < (2,4):
436            try:
437                self.tailorize('bazaar2darcs')
438            except TailorException, e:
439                self.assert_("Bazaar backend requires Python 2.4"
440                             in str(e))
441            else:
442                self.fail("Expected a specific TailorException")
443
444    def testBazaarToDarcs(self):
445        "Test bazaar to darcs"
446
447        try:
448            self.tailorize('bazaar2darcs')
449        except TailorException, e:
450            from sys import version_info
451
452            if version_info < (2,4):
453                # Under python 2.3 we expect an exception here, but
454                # different from the above: since we are still in a
455                # single python session importing the bzr stuff does
456                # not raise the same error, because from the python
457                # runtime pov the module is already loaded and thus
458                # the second import does not fail. The repository
459                # class will then instantiate the raw Repository
460                # class, not the specific bzr one. Still, when asked
461                # for a working dir, it will fail again
462                self.assert_("object has no attribute 'BzrWorkingDir'"
463                             in str(e))
464            else:
465                raise
466
467
468
469class Cvs(OperationalTest):
470    "Test the CVS source backend"
471
472    def testCvsToDarcs(self):
473        "Test CVS to darcs"
474
475        self.tailorize('cvs2darcs')
476
477    def testDarcsToCvs(self):
478        "Test Darcs to CVS"
479
480        self.tailorize('darcs2cvs')
481
482    def testCvsToMercurial(self):
483        "Test CVS to mercurial"
484
485        self.tailorize('cvs2hg')
486
487    def testCvsToBazaar(self):
488        "Test CVS to Bazaar"
489
490        self.tailorize('cvs2bzr')
491
492    def testCvsToSubversion(self):
493        "Test CVS branch to Subversion"
494
495        self.tailorize('cvs2svn')
496
497
498class Svn(OperationalTest):
499    "Test the subversion backend"
500
501    def testExternals(self):
502        "Exercise svn to mercurial with and without svn:externals"
503
504        from os.path import exists
505
506        external = self.TESTDIR + '/svn2hg%s/test/make/docutils.make'
507        self.tailorize('svn2hg')
508        self.failIf(exists(external % ''))
509
510        self.tailorize('svn2hg_with_externals')
511        self.failUnless(exists(external % '_we'))
512
513    def testDarcsRenameDelete(self):
514        "Try to migrate a darcs patch that renames and removes the same file"
515
516        from os import mkdir
517        from os.path import join
518        from vcpx.tests import DEBUG
519
520        drepo = join(self.TESTDIR, 'rename_delete')
521        mkdir(drepo)
522
523        darcs = ExternalCommand(command=['darcs'], cwd=drepo, nolog=not DEBUG)
524
525        darcs.execute('init')
526
527        fileA = join(drepo, 'fileA')
528        open(fileA, 'w')
529        darcs.execute('add', fileA)
530        darcs.execute('record', '-a', '-m', 'Add A')
531
532        fileB = join(drepo, 'fileB')
533        darcs.execute('mv', fileA, fileB)
534
535        darcs.execute('remove', fileB)
536
537        darcs.execute('record', '-a', '-m', 'Move A to B and delete B')
538
539        self.tailorize('darcs_rename_delete')
540
541    def testDarcsRenameDeleteDir(self):
542        "Test if darcs to svn fails on moves combined with directory deletes"
543
544        from os import mkdir
545        from os.path import join
546        from vcpx.tests import DEBUG
547
548        drepo = join(self.TESTDIR, 'rename_delete_dir')
549        mkdir(drepo)
550
551        darcs = ExternalCommand(command=['darcs'], cwd=drepo, nolog=not DEBUG)
552
553        darcs.execute('init')
554
555        dir = join(drepo, 'dir')
556        mkdir(dir)
557        darcs.execute('add', dir)
558        fileA = join(dir, 'fileA')
559        open(fileA, 'w')
560        darcs.execute('add', fileA)
561
562        darcs.execute('record', '-a', '-m', 'Add dir and dir/A')
563
564        fileB = join(drepo, 'fileA')
565        darcs.execute('rename', fileA, fileB)
566
567        darcs.execute('remove', dir)
568
569        darcs.execute('record', '-a', '-m', 'Move dir/A to A and delete dir')
570
571        self.tailorize('darcs_rename_delete_dir')
572
573
574class CvsOrderTest(OperationalTest):
575    """Test problems with improper ordering of adds with new directories."""
576
577    def setUp(self):
578        """Create a CVS repository that has the difficult history."""
579
580        from os import mkdir, getcwd
581        from os.path import join, exists
582        from vcpx.tests import DEBUG
583
584        super(CvsOrderTest, self).setUp()
585
586        repodir = join(self.TESTDIR, 'cvsdirtest.cvsrepo')
587        basedir = join(self.TESTDIR, 'cvsdirtest')
588
589        if not exists(repodir):
590            cvscmd = ['cvs', '-d', repodir]
591            mkdir(basedir)
592            mkdir(repodir)
593            startdir = join(basedir, 'start')
594            mkdir(startdir)
595
596            cvs = ExternalCommand(cwd=startdir, nolog=not DEBUG, command=cvscmd)
597            cvs.execute('init')
598            self.failIf(cvs.exit_status, "%r failed" % cvs._last_command)
599
600            open(join(startdir, 'foo'), "w").close()
601
602            cvs.execute('import', '-m', 'one', 'test', 'test', 'test1')
603            self.failIf(cvs.exit_status, "%r failed" % cvs._last_command)
604
605            workdir = join(basedir, 'work')
606            cvs.execute('checkout', '-d', workdir, 'test')
607            self.failIf(cvs.exit_status, "%r failed" % cvs._last_command)
608
609            bardir = join(workdir, 'bar')
610            mkdir(bardir)
611            baz = join(bardir, 'baz')
612            open(baz, "w").close()
613
614            cvs.execute('add', bardir, baz)
615            self.failIf(cvs.exit_status, "%r failed" % cvs._last_command)
616            cvs.execute('commit', '-m', 'two')
617            self.failIf(cvs.exit_status, "%r failed" % cvs._last_command)
618
619    def testCvsConvertDirectoryAddToBazaar(self):
620        """Test that we can handle directory adds in the cvs module to bzr."""
621
622        t = Tailorizer("cvsdirtest", self.config)
623        t()
624
625    def testCvspsConvertDirectoryAddToBazaar(self):
626        """Test that we can handle directory adds in the cvsps module to bzr."""
627
628        t = Tailorizer("cvspsdirtest", self.config)
629        t()
630
631    def testCvsConvertDirectoryAddToDarcs(self):
632        """Test that we can handle directory adds in the cvs module to darcs."""
633
634        t = Tailorizer("darcsdirtest", self.config)
635        t()
636
637    def testCvsConvertDirectoryAddToSubversion(self):
638        """Test that we can handle directory adds in the cvs module to svn."""
639
640        t = Tailorizer("svndirtest", self.config)
641        t()
642
643
644class CvsReappearedDirectory(OperationalTest):
645    """Test problems with resurrected directories."""
646
647    def setUp(self):
648        """Create a CVS repository that has the difficult history."""
649
650        from os import mkdir, getcwd
651        from os.path import join, exists
652        from time import sleep
653        from shutil import rmtree
654        from vcpx.tests import DEBUG
655
656        super(CvsReappearedDirectory, self).setUp()
657
658        repodir = join(self.TESTDIR, 'cvsresurdirtest.cvsrepo')
659        basedir = join(self.TESTDIR, 'cvsresurdirtest')
660
661        if not exists(repodir):
662            mkdir(basedir)
663            mkdir(repodir)
664            startdir = join(basedir, 'start')
665            mkdir(startdir)
666
667            cvs = ExternalCommand(cwd=startdir, nolog=not DEBUG, command=['cvs', '-d', repodir])
668            cvs.execute('init')
669            self.failIf(cvs.exit_status, "%r failed" % cvs._last_command)
670
671            open(join(startdir, 'foo'), "w").close()
672
673            cvs.execute('import', '-m', 'one', 'test', 'test', 'test1')
674            self.failIf(cvs.exit_status, "%r failed" % cvs._last_command)
675
676            workdir = join(basedir, 'work')
677            cvs.execute('checkout', '-d', workdir, 'test')
678            self.failIf(cvs.exit_status, "%r failed" % cvs._last_command)
679
680            cvs = ExternalCommand(cwd=workdir, nolog=not DEBUG, command=['cvs'])
681            bardir = join(workdir, 'bar')
682            mkdir(bardir)
683            baz = join(bardir, 'baz')
684            open(baz, "w").close()
685
686            cvs.execute('add', bardir, baz)
687            self.failIf(cvs.exit_status, "%r failed" % cvs._last_command)
688            cvs.execute('commit', '-m', 'two', baz)
689            self.failIf(cvs.exit_status, "%r failed" % cvs._last_command)
690            sleep(1)
691
692            cvs.execute('rm', '-f', baz)
693            self.failIf(cvs.exit_status, "%r failed" % cvs._last_command)
694            cvs.execute('commit', '-m', 'three', baz)
695            self.failIf(cvs.exit_status, "%r failed" % cvs._last_command)
696            cvs.execute('update', '-dP')
697            self.failIf(cvs.exit_status, "%r failed" % cvs._last_command)
698            sleep(1)
699
700            mkdir(bardir)
701            again = join(bardir, 'again')
702            open(again, "w").close()
703
704            cvs.execute('add', bardir, again)
705            self.failIf(cvs.exit_status, "%r failed" % cvs._last_command)
706            cvs.execute('commit', '-m', 'four', again)
707            self.failIf(cvs.exit_status, "%r failed" % cvs._last_command)
708
709    def testCvsReappearedDirectoryToSubversion(self):
710        """Test that we can handle resurrected cvs directory to svn."""
711
712        from vcpx.tests import DEBUG
713
714        t = Tailorizer("svnresurdirtest", self.config)
715        t()
716
717        svnls = ExternalCommand(nolog=not DEBUG, command=['svn', 'ls'])
718        manifest = svnls.execute('file://%s/cvsresurdirtest.svnrepo/test/bar' % self.TESTDIR,
719                                 stdout=PIPE)[0]
720        self.assertEqual(manifest.read(), "again\n")
Note: See TracBrowser for help on using the repository browser.