[svn r38192] streamlining localhost optimization handling,

and simplifying the test a bit.

--HG--
branch : trunk
This commit is contained in:
hpk 2007-02-08 19:35:18 +01:00
parent 411157756b
commit 6e293f593a
2 changed files with 40 additions and 44 deletions

View File

@ -17,14 +17,10 @@ class HostInfo(object):
def __init__(self, spec): def __init__(self, spec):
parts = spec.split(':', 1) parts = spec.split(':', 1)
self.hostname = parts.pop(0) self.hostname = parts.pop(0)
if parts and parts[0]: self.relpath = parts and parts.pop(0) or ""
self.relpath = parts[0] if not self.relpath and self.hostname != "localhost":
else: self.relpath = "pytestcache-%s" % self.hostname
self.relpath = "pytestcache-" + self.hostname assert not parts
if spec.find(':') == -1 and self.hostname == 'localhost':
self.rsync_flag = False
else:
self.rsync_flag = True
self.hostid = self._getuniqueid(self.hostname) self.hostid = self._getuniqueid(self.hostname)
def _getuniqueid(self, hostname): def _getuniqueid(self, hostname):
@ -33,23 +29,24 @@ class HostInfo(object):
l.append(hostid) l.append(hostid)
return hostid return hostid
def initgateway(self, python="python"): def initgateway(self, python="python", topdir=None):
assert not hasattr(self, 'gw')
if self.hostname == "localhost": if self.hostname == "localhost":
gw = py.execnet.PopenGateway(python=python) self.gw = py.execnet.PopenGateway(python=python)
else: else:
gw = py.execnet.SshGateway(self.hostname, self.gw = py.execnet.SshGateway(self.hostname,
remotepython=python) remotepython=python)
self.gw = gw relpath = self.relpath or topdir
channel = gw.remote_exec(py.code.Source( assert relpath
channel = self.gw.remote_exec(py.code.Source(
gethomedir, gethomedir,
getpath_relto_home, """ getpath_relto_home, """
import os import os
os.chdir(gethomedir()) os.chdir(gethomedir())
newdir = getpath_relto_home(%r) path = %r
# we intentionally don't ensure that 'newdir' exists if path:
channel.send(newdir) path = getpath_relto_home(path)
""" % str(self.relpath) channel.send(path)
""" % str(relpath)
)) ))
self.gw_remotepath = channel.receive() self.gw_remotepath = channel.receive()
@ -71,13 +68,13 @@ class HostInfo(object):
class HostRSync(py.execnet.RSync): class HostRSync(py.execnet.RSync):
""" RSyncer that filters out common files """ RSyncer that filters out common files
""" """
def __init__(self, source, *args, **kwargs): def __init__(self, sourcedir, *args, **kwargs):
self._synced = {} self._synced = {}
ignores= None ignores= None
if 'ignores' in kwargs: if 'ignores' in kwargs:
ignores = kwargs.pop('ignores') ignores = kwargs.pop('ignores')
self._ignores = ignores or [] self._ignores = ignores or []
super(HostRSync, self).__init__(source, **kwargs) super(HostRSync, self).__init__(sourcedir=sourcedir, **kwargs)
def filter(self, path): def filter(self, path):
path = py.path.local(path) path = py.path.local(path)
@ -91,20 +88,22 @@ class HostRSync(py.execnet.RSync):
return True return True
def add_target_host(self, host, reporter=lambda x: None, def add_target_host(self, host, reporter=lambda x: None,
destrelpath=None, finishedcallback=None): destrelpath="", finishedcallback=None):
key = host.hostname, host.relpath remotepath = host.relpath
if not host.rsync_flag or key in self._synced: key = host.hostname, remotepath
if host.hostname == "localhost" and not remotepath:
p = py.path.local(host.gw_remotepath)
assert p.join(destrelpath) == self._sourcedir
self._synced[key] = True
if key in self._synced:
if finishedcallback: if finishedcallback:
finishedcallback() finishedcallback()
return False return False
self._synced[key] = True self._synced[key] = True
# the follow attributes are set from host.initgateway() # the follow attributes are set from host.initgateway()
gw = host.gw if destrelpath:
remotepath = host.gw_remotepath
if destrelpath is not None:
remotepath = os.path.join(remotepath, destrelpath) remotepath = os.path.join(remotepath, destrelpath)
super(HostRSync, self).add_target(gw, super(HostRSync, self).add_target(host.gw, remotepath,
remotepath,
finishedcallback, finishedcallback,
delete=True, delete=True,
) )
@ -123,9 +122,9 @@ class HostManager(object):
self.roots = roots self.roots = roots
def prepare_gateways(self, reporter): def prepare_gateways(self, reporter):
dist_remotepython = self.config.getvalue("dist_remotepython") python = self.config.getvalue("dist_remotepython")
for host in self.hosts: for host in self.hosts:
host.initgateway(python=dist_remotepython) host.initgateway(python=python, topdir=self.config.topdir)
reporter(repevent.HostGatewayReady(host, self.roots)) reporter(repevent.HostGatewayReady(host, self.roots))
host.gw.host = host host.gw.host = host

View File

@ -26,7 +26,7 @@ class TestHostInfo(DirSetup):
def test_defaultpath(self): def test_defaultpath(self):
x = HostInfo("localhost:") x = HostInfo("localhost:")
assert x.hostname == "localhost" assert x.hostname == "localhost"
assert x.relpath == "pytestcache-" + x.hostname assert not x.relpath
def test_path(self): def test_path(self):
x = HostInfo("localhost:/tmp") x = HostInfo("localhost:/tmp")
@ -193,18 +193,15 @@ class TestHostManager(DirSetup):
assert not self.dest.join("dir6").check() assert not self.dest.join("dir6").check()
def test_hostmanage_optimise_localhost(self): def test_hostmanage_optimise_localhost(self):
def add_target(self, a, b, c): hosts = [HostInfo("localhost") for i in range(3)]
assert 0, "Should not rsync here" config = py.test.config._reparse([self.source])
try: hm = HostManager(config, hosts=hosts)
config = py.test.config._reparse([self.source]) events = []
old_add_target = HostRSync.add_target hm.init_rsync(events.append)
HostRSync.add_target = add_target for host in hosts:
hm = HostManager(config, hosts=[HostInfo('localhost') for i in assert host.gw_remotepath == str(self.source)
range(3)]) assert not host.relpath
events = [] assert events
hm.init_rsync(reporter=events.append)
finally:
HostRSync.add_target = old_add_target
def test_getpath_relto_home(): def test_getpath_relto_home():
x = getpath_relto_home("hello") x = getpath_relto_home("hello")