1
# Copyright (C) 2005-2010 Canonical Ltd
1
# Copyright (C) 2005-2011 Canonical Ltd
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
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 (
50
48
from bzrlib.transform import TreeTransform
78
77
inventory = property(lambda x:x)
81
return self.paths.iterkeys()
79
def all_file_ids(self):
80
return set(self.paths.keys())
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)
120
121
raise errors.BzrError('unknown kind %r' % kind)
121
ie.text_sha1 = text_sha_1
122
ie.text_size = text_size
125
124
def add_dir(self, file_id, path):
147
def get_file_revision(self, file_id):
148
return self.inventory[file_id].revision
148
150
def contents_stats(self, file_id):
149
151
if file_id not in self.contents:
150
152
return None, None
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)
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'
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
726
727
self._test_symlink_bundle('link', 'bar/foo', 'mars')
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()
835
836
def test_unicode_bundle(self):
836
self.requireFeature(tests.UnicodeFilenameFeature)
837
self.requireFeature(features.UnicodeFilenameFeature)
837
838
# Handle international characters
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'))
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,
1424
1425
working_tree=tree_a)
1839
1834
bundle, then the ConnectionReset error should be propagated.
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)
1850
class _DisconnectingTCPServer(object):
1851
"""A TCP server that immediately closes any connection made to it."""
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))
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)
1863
def accept_and_close(self):
1864
conn, addr = self.sock.accept()
1865
conn.shutdown(socket.SHUT_RDWR)
1845
class DisconnectingHandler(SocketServer.BaseRequestHandler):
1846
"""A request handler that immediately closes any connection made to it."""
1849
self.request.close()
1852
class DisconnectingServer(test_server.TestingTCPServerInAThread):
1855
super(DisconnectingServer, self).__init__(
1857
test_server.TestingTCPServer,
1858
DisconnectingHandler)
1868
1860
def get_url(self):
1869
return 'bzr://127.0.0.1:%d/' % (self.port,)
1871
def stop_server(self):
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())
1878
except socket.error:
1861
"""Return the url of the server"""
1862
return "bzr://%s:%d/" % self.server.server_address