~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_bundle.py

  • Committer: Jelmer Vernooij
  • Date: 2012-02-18 16:55:04 UTC
  • mfrom: (6437.23.10 2.5)
  • mto: This revision was merged to the branch mainline in revision 6469.
  • Revision ID: jelmer@samba.org-20120218165504-c9oe5c5ue805y8wp
Merge bzr/2.5.

Show diffs side-by-side

added added

removed removed

Lines of Context:
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,
41
40
from bzrlib.bundle.serializer.v4 import BundleSerializerV4
42
41
from bzrlib.repofmt import knitrepo
43
42
from bzrlib.tests import (
 
43
    features,
 
44
    test_commit,
44
45
    test_read_bundle,
45
 
    test_commit,
 
46
    test_server,
46
47
    )
47
48
from bzrlib.transform import TreeTransform
48
 
from bzrlib.tests import (
49
 
    features,
50
 
    )
51
49
 
52
50
 
53
51
def get_text(vf, key):
77
75
        self.root = InventoryDirectory(ROOT_ID, '', None)
78
76
 
79
77
    inventory = property(lambda x:x)
 
78
    root_inventory = property(lambda x:x)
 
79
 
 
80
    def get_root_id(self):
 
81
        return self.root.file_id
 
82
 
 
83
    def get_root_id(self):
 
84
        return self.root.file_id
80
85
 
81
86
    def all_file_ids(self):
82
87
        return set(self.paths.keys())
83
88
 
 
89
    def is_executable(self, file_id):
 
90
        # Not all the files are executable.
 
91
        return False
 
92
 
84
93
    def __getitem__(self, file_id):
85
94
        if file_id == self.root.file_id:
86
95
            return self.root
97
106
        for path, file_id in self.ids.iteritems():
98
107
            yield path, self[file_id]
99
108
 
100
 
    def get_file_kind(self, file_id):
 
109
    def kind(self, file_id):
101
110
        if file_id in self.contents:
102
111
            kind = 'file'
103
112
        else:
108
117
        from bzrlib.inventory import (InventoryEntry, InventoryFile
109
118
                                    , InventoryDirectory, InventoryLink)
110
119
        name = os.path.basename(path)
111
 
        kind = self.get_file_kind(file_id)
 
120
        kind = self.kind(file_id)
112
121
        parent_id = self.parent_id(file_id)
113
122
        text_sha_1, text_size = self.contents_stats(file_id)
114
123
        if kind == 'directory':
651
660
        bundle = self.get_valid_bundle('null:', 'a@cset-0-4')
652
661
 
653
662
        # Modified files
654
 
        open('b1/sub/dir/WithCaps.txt', 'ab').write('\nAdding some text\n')
655
 
        open('b1/sub/dir/ pre space', 'ab').write(
 
663
        with open('b1/sub/dir/WithCaps.txt', 'ab') as f: f.write('\nAdding some text\n')
 
664
        with open('b1/sub/dir/ pre space', 'ab') as f: f.write(
656
665
             '\r\nAdding some\r\nDOS format lines\r\n')
657
 
        open('b1/sub/dir/nolastnewline.txt', 'ab').write('\n')
 
666
        with open('b1/sub/dir/nolastnewline.txt', 'ab') as f: f.write('\n')
658
667
        self.tree1.rename_one('sub/dir/ pre space',
659
668
                              'sub/ start space')
660
669
        self.tree1.commit('Modified files', rev_id='a@cset-0-5')
809
818
        self.tree1 = self.make_branch_and_tree('b1')
810
819
        self.b1 = self.tree1.branch
811
820
 
812
 
        open('b1/one', 'wb').write('one\n')
 
821
        with open('b1/one', 'wb') as f: f.write('one\n')
813
822
        self.tree1.add('one')
814
823
        self.tree1.commit('add file', rev_id='a@cset-0-1')
815
 
        open('b1/one', 'wb').write('two\n')
 
824
        with open('b1/one', 'wb') as f: f.write('two\n')
816
825
        self.tree1.commit('modify', rev_id='a@cset-0-2')
817
 
        open('b1/one', 'wb').write('three\n')
 
826
        with open('b1/one', 'wb') as f: f.write('three\n')
818
827
        self.tree1.commit('modify', rev_id='a@cset-0-3')
819
828
        bundle_file = StringIO()
820
829
        rev_ids = write_bundle(self.tree1.branch.repository, 'a@cset-0-3',
899
908
        bundle = self.get_valid_bundle('null:', 'white-1')
900
909
 
901
910
        # Modified
902
 
        open('b1/trailing space ', 'ab').write('add some text\n')
 
911
        with open('b1/trailing space ', 'ab') as f: f.write('add some text\n')
903
912
        self.tree1.commit('add text', rev_id='white-2')
904
913
 
905
914
        bundle = self.get_valid_bundle('white-1', 'white-2')
947
956
        self.tree1.commit('message', rev_id='revid1')
948
957
        bundle = self.get_valid_bundle('null:', 'revid1')
949
958
        tree = self.get_bundle_tree(bundle, 'revid1')
950
 
        self.assertEqual('revid1', tree.inventory.root.revision)
 
959
        root_revision = tree.get_file_revision(tree.get_root_id())
 
960
        self.assertEqual('revid1', root_revision)
951
961
 
952
962
    def test_install_revisions(self):
953
963
        self.tree1 = self.make_branch_and_tree('b1')
1420
1430
            from bzrlib.testament import Testament
1421
1431
            # monkey patch gpg signing mechanism
1422
1432
            bzrlib.gpg.GPGStrategy = bzrlib.gpg.LoopbackGPGStrategy
1423
 
            new_config = test_commit.MustSignConfig(branch)
1424
 
            commit.Commit(config=new_config).commit(message="base",
 
1433
            new_config = test_commit.MustSignConfig()
 
1434
            commit.Commit(config_stack=new_config).commit(message="base",
1425
1435
                                                    allow_pointless=True,
1426
1436
                                                    rev_id='B',
1427
1437
                                                    working_tree=tree_a)
1836
1846
        bundle, then the ConnectionReset error should be propagated.
1837
1847
        """
1838
1848
        # Instantiate a server that will provoke a ConnectionReset
1839
 
        sock_server = _DisconnectingTCPServer()
 
1849
        sock_server = DisconnectingServer()
1840
1850
        self.start_server(sock_server)
1841
1851
        # We don't really care what the url is since the server will close the
1842
1852
        # connection without interpreting it
1844
1854
        self.assertRaises(errors.ConnectionReset, read_mergeable_from_url, url)
1845
1855
 
1846
1856
 
1847
 
class _DisconnectingTCPServer(object):
1848
 
    """A TCP server that immediately closes any connection made to it."""
1849
 
 
1850
 
    def start_server(self):
1851
 
        self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1852
 
        self.sock.bind(('127.0.0.1', 0))
1853
 
        self.sock.listen(1)
1854
 
        self.port = self.sock.getsockname()[1]
1855
 
        self.thread = threading.Thread(
1856
 
            name='%s (port %d)' % (self.__class__.__name__, self.port),
1857
 
            target=self.accept_and_close)
1858
 
        self.thread.start()
1859
 
 
1860
 
    def accept_and_close(self):
1861
 
        conn, addr = self.sock.accept()
1862
 
        conn.shutdown(socket.SHUT_RDWR)
1863
 
        conn.close()
 
1857
class DisconnectingHandler(SocketServer.BaseRequestHandler):
 
1858
    """A request handler that immediately closes any connection made to it."""
 
1859
 
 
1860
    def handle(self):
 
1861
        self.request.close()
 
1862
 
 
1863
 
 
1864
class DisconnectingServer(test_server.TestingTCPServerInAThread):
 
1865
 
 
1866
    def __init__(self):
 
1867
        super(DisconnectingServer, self).__init__(
 
1868
            ('127.0.0.1', 0),
 
1869
            test_server.TestingTCPServer,
 
1870
            DisconnectingHandler)
1864
1871
 
1865
1872
    def get_url(self):
1866
 
        return 'bzr://127.0.0.1:%d/' % (self.port,)
1867
 
 
1868
 
    def stop_server(self):
1869
 
        try:
1870
 
            # make sure the thread dies by connecting to the listening socket,
1871
 
            # just in case the test failed to do so.
1872
 
            conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1873
 
            conn.connect(self.sock.getsockname())
1874
 
            conn.close()
1875
 
        except socket.error:
1876
 
            pass
1877
 
        self.sock.close()
1878
 
        self.thread.join()
 
1873
        """Return the url of the server"""
 
1874
        return "bzr://%s:%d/" % self.server.server_address