~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_bundle.py

  • Committer: Jelmer Vernooij
  • Date: 2011-12-30 12:52:54 UTC
  • mto: This revision was merged to the branch mainline in revision 6418.
  • Revision ID: jelmer@samba.org-20111230125254-igy1abnixsvulfqd
Simplify code a bit.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005-2010 Canonical Ltd
 
1
# Copyright (C) 2005-2011 Canonical Ltd
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
16
16
 
17
17
from cStringIO import StringIO
18
18
import os
19
 
import socket
 
19
import SocketServer
20
20
import sys
21
 
import threading
22
21
 
23
22
from bzrlib import (
24
23
    bzrdir,
27
26
    inventory,
28
27
    merge,
29
28
    osutils,
30
 
    repository,
31
29
    revision as _mod_revision,
32
30
    tests,
33
31
    treebuilder,
35
33
from bzrlib.bundle import read_mergeable_from_url
36
34
from bzrlib.bundle.apply_bundle import install_bundle, merge_bundle
37
35
from bzrlib.bundle.bundle_data import BundleTree
38
 
from bzrlib.bzrdir import BzrDir
39
36
from bzrlib.directory_service import directories
40
37
from bzrlib.bundle.serializer import write_bundle, read_bundle, v09, v4
41
38
from bzrlib.bundle.serializer.v08 import BundleSerializerV08
42
39
from bzrlib.bundle.serializer.v09 import BundleSerializerV09
43
40
from bzrlib.bundle.serializer.v4 import BundleSerializerV4
44
 
from bzrlib.branch import Branch
45
41
from bzrlib.repofmt import knitrepo
46
42
from bzrlib.tests import (
 
43
    features,
 
44
    test_commit,
47
45
    test_read_bundle,
48
 
    test_commit,
 
46
    test_server,
49
47
    )
50
48
from bzrlib.transform import TreeTransform
51
49
 
67
65
 
68
66
 
69
67
class MockTree(object):
 
68
 
70
69
    def __init__(self):
71
70
        from bzrlib.inventory import InventoryDirectory, ROOT_ID
72
71
        object.__init__(self)
77
76
 
78
77
    inventory = property(lambda x:x)
79
78
 
80
 
    def __iter__(self):
81
 
        return self.paths.iterkeys()
 
79
    def all_file_ids(self):
 
80
        return set(self.paths.keys())
82
81
 
83
82
    def __getitem__(self, file_id):
84
83
        if file_id == self.root.file_id:
114
113
            ie = InventoryDirectory(file_id, name, parent_id)
115
114
        elif kind == 'file':
116
115
            ie = InventoryFile(file_id, name, parent_id)
 
116
            ie.text_sha1 = text_sha_1
 
117
            ie.text_size = text_size
117
118
        elif kind == 'symlink':
118
119
            ie = InventoryLink(file_id, name, parent_id)
119
120
        else:
120
121
            raise errors.BzrError('unknown kind %r' % kind)
121
 
        ie.text_sha1 = text_sha_1
122
 
        ie.text_size = text_size
123
122
        return ie
124
123
 
125
124
    def add_dir(self, file_id, path):
145
144
        result.seek(0,0)
146
145
        return result
147
146
 
 
147
    def get_file_revision(self, file_id):
 
148
        return self.inventory[file_id].revision
 
149
 
148
150
    def contents_stats(self, file_id):
149
151
        if file_id not in self.contents:
150
152
            return None, None
492
494
                                 % (ancestor,))
493
495
 
494
496
                # Now check that the file contents are all correct
495
 
                for inventory_id in old:
 
497
                for inventory_id in old.all_file_ids():
496
498
                    try:
497
499
                        old_file = old.get_file(inventory_id)
498
500
                    except errors.NoSuchFile:
505
507
                new.unlock()
506
508
                old.unlock()
507
509
        if not _mod_revision.is_null(rev_id):
508
 
            rh = self.b1.revision_history()
509
 
            tree.branch.set_revision_history(rh[:rh.index(rev_id)+1])
 
510
            tree.branch.generate_revision_history(rev_id)
510
511
            tree.update()
511
512
            delta = tree.changes_from(self.b1.repository.revision_tree(rev_id))
512
513
            self.assertFalse(delta.has_changed(),
679
680
    def _test_symlink_bundle(self, link_name, link_target, new_link_target):
680
681
        link_id = 'link-1'
681
682
 
682
 
        self.requireFeature(tests.SymlinkFeature)
 
683
        self.requireFeature(features.SymlinkFeature)
683
684
        self.tree1 = self.make_branch_and_tree('b1')
684
685
        self.b1 = self.tree1.branch
685
686
 
726
727
        self._test_symlink_bundle('link', 'bar/foo', 'mars')
727
728
 
728
729
    def test_unicode_symlink_bundle(self):
729
 
        self.requireFeature(tests.UnicodeFilenameFeature)
 
730
        self.requireFeature(features.UnicodeFilenameFeature)
730
731
        self._test_symlink_bundle(u'\N{Euro Sign}link',
731
732
                                  u'bar/\N{Euro Sign}foo',
732
733
                                  u'mars\N{Euro Sign}')
833
834
        return bundle_file.getvalue()
834
835
 
835
836
    def test_unicode_bundle(self):
836
 
        self.requireFeature(tests.UnicodeFilenameFeature)
 
837
        self.requireFeature(features.UnicodeFilenameFeature)
837
838
        # Handle international characters
838
839
        os.mkdir('b1')
839
840
        f = open(u'b1/with Dod\N{Euro Sign}', 'wb')
1412
1413
        branch = tree_a.branch
1413
1414
        repo_a = branch.repository
1414
1415
        tree_a.commit("base", allow_pointless=True, rev_id='A')
1415
 
        self.failIf(branch.repository.has_signature_for_revision_id('A'))
 
1416
        self.assertFalse(branch.repository.has_signature_for_revision_id('A'))
1416
1417
        try:
1417
1418
            from bzrlib.testament import Testament
1418
1419
            # monkey patch gpg signing mechanism
1419
1420
            bzrlib.gpg.GPGStrategy = bzrlib.gpg.LoopbackGPGStrategy
1420
 
            new_config = test_commit.MustSignConfig(branch)
1421
 
            commit.Commit(config=new_config).commit(message="base",
 
1421
            new_config = test_commit.MustSignConfig()
 
1422
            commit.Commit(config_stack=new_config).commit(message="base",
1422
1423
                                                    allow_pointless=True,
1423
1424
                                                    rev_id='B',
1424
1425
                                                    working_tree=tree_a)
1442
1443
        install_bundle(repo_b, serializer.read(s))
1443
1444
 
1444
1445
 
1445
 
class V4WeaveBundleTester(V4BundleTester):
1446
 
 
1447
 
    def bzrdir_format(self):
1448
 
        return 'metaweave'
1449
 
 
1450
 
 
1451
1446
class V4_2aBundleTester(V4BundleTester):
1452
1447
 
1453
1448
    def bzrdir_format(self):
1839
1834
        bundle, then the ConnectionReset error should be propagated.
1840
1835
        """
1841
1836
        # Instantiate a server that will provoke a ConnectionReset
1842
 
        sock_server = _DisconnectingTCPServer()
 
1837
        sock_server = DisconnectingServer()
1843
1838
        self.start_server(sock_server)
1844
1839
        # We don't really care what the url is since the server will close the
1845
1840
        # connection without interpreting it
1847
1842
        self.assertRaises(errors.ConnectionReset, read_mergeable_from_url, url)
1848
1843
 
1849
1844
 
1850
 
class _DisconnectingTCPServer(object):
1851
 
    """A TCP server that immediately closes any connection made to it."""
1852
 
 
1853
 
    def start_server(self):
1854
 
        self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1855
 
        self.sock.bind(('127.0.0.1', 0))
1856
 
        self.sock.listen(1)
1857
 
        self.port = self.sock.getsockname()[1]
1858
 
        self.thread = threading.Thread(
1859
 
            name='%s (port %d)' % (self.__class__.__name__, self.port),
1860
 
            target=self.accept_and_close)
1861
 
        self.thread.start()
1862
 
 
1863
 
    def accept_and_close(self):
1864
 
        conn, addr = self.sock.accept()
1865
 
        conn.shutdown(socket.SHUT_RDWR)
1866
 
        conn.close()
 
1845
class DisconnectingHandler(SocketServer.BaseRequestHandler):
 
1846
    """A request handler that immediately closes any connection made to it."""
 
1847
 
 
1848
    def handle(self):
 
1849
        self.request.close()
 
1850
 
 
1851
 
 
1852
class DisconnectingServer(test_server.TestingTCPServerInAThread):
 
1853
 
 
1854
    def __init__(self):
 
1855
        super(DisconnectingServer, self).__init__(
 
1856
            ('127.0.0.1', 0),
 
1857
            test_server.TestingTCPServer,
 
1858
            DisconnectingHandler)
1867
1859
 
1868
1860
    def get_url(self):
1869
 
        return 'bzr://127.0.0.1:%d/' % (self.port,)
1870
 
 
1871
 
    def stop_server(self):
1872
 
        try:
1873
 
            # make sure the thread dies by connecting to the listening socket,
1874
 
            # just in case the test failed to do so.
1875
 
            conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1876
 
            conn.connect(self.sock.getsockname())
1877
 
            conn.close()
1878
 
        except socket.error:
1879
 
            pass
1880
 
        self.sock.close()
1881
 
        self.thread.join()
 
1861
        """Return the url of the server"""
 
1862
        return "bzr://%s:%d/" % self.server.server_address