1
# Copyright (C) 2005-2011 Canonical Ltd
1
# Copyright (C) 2005-2010 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
33
35
from bzrlib.bundle import read_mergeable_from_url
34
36
from bzrlib.bundle.apply_bundle import install_bundle, merge_bundle
35
37
from bzrlib.bundle.bundle_data import BundleTree
38
from bzrlib.bzrdir import BzrDir
36
39
from bzrlib.directory_service import directories
37
40
from bzrlib.bundle.serializer import write_bundle, read_bundle, v09, v4
38
41
from bzrlib.bundle.serializer.v08 import BundleSerializerV08
39
42
from bzrlib.bundle.serializer.v09 import BundleSerializerV09
40
43
from bzrlib.bundle.serializer.v4 import BundleSerializerV4
44
from bzrlib.branch import Branch
41
45
from bzrlib.repofmt import knitrepo
42
46
from bzrlib.tests import (
48
50
from bzrlib.transform import TreeTransform
77
78
inventory = property(lambda x:x)
79
def all_file_ids(self):
80
return set(self.paths.keys())
81
return self.paths.iterkeys()
82
83
def __getitem__(self, file_id):
83
84
if file_id == self.root.file_id:
147
def get_file_revision(self, file_id):
148
return self.inventory[file_id].revision
150
148
def contents_stats(self, file_id):
151
149
if file_id not in self.contents:
152
150
return None, None
509
507
if not _mod_revision.is_null(rev_id):
510
tree.branch.generate_revision_history(rev_id)
508
rh = self.b1.revision_history()
509
tree.branch.set_revision_history(rh[:rh.index(rev_id)+1])
512
511
delta = tree.changes_from(self.b1.repository.revision_tree(rev_id))
513
512
self.assertFalse(delta.has_changed(),
680
679
def _test_symlink_bundle(self, link_name, link_target, new_link_target):
681
680
link_id = 'link-1'
683
self.requireFeature(features.SymlinkFeature)
682
self.requireFeature(tests.SymlinkFeature)
684
683
self.tree1 = self.make_branch_and_tree('b1')
685
684
self.b1 = self.tree1.branch
727
726
self._test_symlink_bundle('link', 'bar/foo', 'mars')
729
728
def test_unicode_symlink_bundle(self):
730
self.requireFeature(features.UnicodeFilenameFeature)
729
self.requireFeature(tests.UnicodeFilenameFeature)
731
730
self._test_symlink_bundle(u'\N{Euro Sign}link',
732
731
u'bar/\N{Euro Sign}foo',
733
732
u'mars\N{Euro Sign}')
834
833
return bundle_file.getvalue()
836
835
def test_unicode_bundle(self):
837
self.requireFeature(features.UnicodeFilenameFeature)
836
self.requireFeature(tests.UnicodeFilenameFeature)
838
837
# Handle international characters
840
839
f = open(u'b1/with Dod\N{Euro Sign}', 'wb')
1413
1412
branch = tree_a.branch
1414
1413
repo_a = branch.repository
1415
1414
tree_a.commit("base", allow_pointless=True, rev_id='A')
1416
self.assertFalse(branch.repository.has_signature_for_revision_id('A'))
1415
self.failIf(branch.repository.has_signature_for_revision_id('A'))
1418
1417
from bzrlib.testament import Testament
1419
1418
# monkey patch gpg signing mechanism
1420
1419
bzrlib.gpg.GPGStrategy = bzrlib.gpg.LoopbackGPGStrategy
1421
new_config = test_commit.MustSignConfig()
1422
commit.Commit(config_stack=new_config).commit(message="base",
1420
new_config = test_commit.MustSignConfig(branch)
1421
commit.Commit(config=new_config).commit(message="base",
1423
1422
allow_pointless=True,
1425
1424
working_tree=tree_a)
1834
1839
bundle, then the ConnectionReset error should be propagated.
1836
1841
# Instantiate a server that will provoke a ConnectionReset
1837
sock_server = DisconnectingServer()
1842
sock_server = _DisconnectingTCPServer()
1838
1843
self.start_server(sock_server)
1839
1844
# We don't really care what the url is since the server will close the
1840
1845
# connection without interpreting it
1842
1847
self.assertRaises(errors.ConnectionReset, read_mergeable_from_url, url)
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)
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)
1860
1868
def get_url(self):
1861
"""Return the url of the server"""
1862
return "bzr://%s:%d/" % self.server.server_address
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: