From 6e293f593a4c012cdd1f3d213e7d2538506dba0b Mon Sep 17 00:00:00 2001 From: hpk Date: Thu, 8 Feb 2007 19:35:18 +0100 Subject: [PATCH] [svn r38192] streamlining localhost optimization handling, and simplifying the test a bit. --HG-- branch : trunk --- py/test/rsession/hostmanage.py | 61 ++++++++++----------- py/test/rsession/testing/test_hostmanage.py | 23 ++++---- 2 files changed, 40 insertions(+), 44 deletions(-) diff --git a/py/test/rsession/hostmanage.py b/py/test/rsession/hostmanage.py index e2069b53c..0b175c250 100644 --- a/py/test/rsession/hostmanage.py +++ b/py/test/rsession/hostmanage.py @@ -17,14 +17,10 @@ class HostInfo(object): def __init__(self, spec): parts = spec.split(':', 1) self.hostname = parts.pop(0) - if parts and parts[0]: - self.relpath = parts[0] - else: - self.relpath = "pytestcache-" + self.hostname - if spec.find(':') == -1 and self.hostname == 'localhost': - self.rsync_flag = False - else: - self.rsync_flag = True + self.relpath = parts and parts.pop(0) or "" + if not self.relpath and self.hostname != "localhost": + self.relpath = "pytestcache-%s" % self.hostname + assert not parts self.hostid = self._getuniqueid(self.hostname) def _getuniqueid(self, hostname): @@ -33,23 +29,24 @@ class HostInfo(object): l.append(hostid) return hostid - def initgateway(self, python="python"): - assert not hasattr(self, 'gw') + def initgateway(self, python="python", topdir=None): if self.hostname == "localhost": - gw = py.execnet.PopenGateway(python=python) + self.gw = py.execnet.PopenGateway(python=python) else: - gw = py.execnet.SshGateway(self.hostname, - remotepython=python) - self.gw = gw - channel = gw.remote_exec(py.code.Source( + self.gw = py.execnet.SshGateway(self.hostname, + remotepython=python) + relpath = self.relpath or topdir + assert relpath + channel = self.gw.remote_exec(py.code.Source( gethomedir, getpath_relto_home, """ import os os.chdir(gethomedir()) - newdir = getpath_relto_home(%r) - # we intentionally don't ensure that 'newdir' exists - channel.send(newdir) - """ % str(self.relpath) + path = %r + if path: + path = getpath_relto_home(path) + channel.send(path) + """ % str(relpath) )) self.gw_remotepath = channel.receive() @@ -71,13 +68,13 @@ class HostInfo(object): class HostRSync(py.execnet.RSync): """ RSyncer that filters out common files """ - def __init__(self, source, *args, **kwargs): + def __init__(self, sourcedir, *args, **kwargs): self._synced = {} ignores= None if 'ignores' in kwargs: ignores = kwargs.pop('ignores') self._ignores = ignores or [] - super(HostRSync, self).__init__(source, **kwargs) + super(HostRSync, self).__init__(sourcedir=sourcedir, **kwargs) def filter(self, path): path = py.path.local(path) @@ -91,20 +88,22 @@ class HostRSync(py.execnet.RSync): return True def add_target_host(self, host, reporter=lambda x: None, - destrelpath=None, finishedcallback=None): - key = host.hostname, host.relpath - if not host.rsync_flag or key in self._synced: + destrelpath="", finishedcallback=None): + remotepath = host.relpath + 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: finishedcallback() return False self._synced[key] = True # the follow attributes are set from host.initgateway() - gw = host.gw - remotepath = host.gw_remotepath - if destrelpath is not None: + if destrelpath: remotepath = os.path.join(remotepath, destrelpath) - super(HostRSync, self).add_target(gw, - remotepath, + super(HostRSync, self).add_target(host.gw, remotepath, finishedcallback, delete=True, ) @@ -123,9 +122,9 @@ class HostManager(object): self.roots = roots def prepare_gateways(self, reporter): - dist_remotepython = self.config.getvalue("dist_remotepython") + python = self.config.getvalue("dist_remotepython") for host in self.hosts: - host.initgateway(python=dist_remotepython) + host.initgateway(python=python, topdir=self.config.topdir) reporter(repevent.HostGatewayReady(host, self.roots)) host.gw.host = host diff --git a/py/test/rsession/testing/test_hostmanage.py b/py/test/rsession/testing/test_hostmanage.py index fe9421bc0..4dcdcef67 100644 --- a/py/test/rsession/testing/test_hostmanage.py +++ b/py/test/rsession/testing/test_hostmanage.py @@ -26,7 +26,7 @@ class TestHostInfo(DirSetup): def test_defaultpath(self): x = HostInfo("localhost:") assert x.hostname == "localhost" - assert x.relpath == "pytestcache-" + x.hostname + assert not x.relpath def test_path(self): x = HostInfo("localhost:/tmp") @@ -193,18 +193,15 @@ class TestHostManager(DirSetup): assert not self.dest.join("dir6").check() def test_hostmanage_optimise_localhost(self): - def add_target(self, a, b, c): - assert 0, "Should not rsync here" - try: - config = py.test.config._reparse([self.source]) - old_add_target = HostRSync.add_target - HostRSync.add_target = add_target - hm = HostManager(config, hosts=[HostInfo('localhost') for i in - range(3)]) - events = [] - hm.init_rsync(reporter=events.append) - finally: - HostRSync.add_target = old_add_target + hosts = [HostInfo("localhost") for i in range(3)] + config = py.test.config._reparse([self.source]) + hm = HostManager(config, hosts=hosts) + events = [] + hm.init_rsync(events.append) + for host in hosts: + assert host.gw_remotepath == str(self.source) + assert not host.relpath + assert events def test_getpath_relto_home(): x = getpath_relto_home("hello")