From fa9490083667eb281d41b6475b2a84ff43361aed Mon Sep 17 00:00:00 2001 From: hpk Date: Sat, 10 Feb 2007 15:45:41 +0100 Subject: [PATCH] [svn r38389] completing the picture: now if you don't have rsync_roots specified, the config.topdir is transfered but it is transferred to the "remotepath.join(topdir.basename)" (not actual code) to avoid random such rsyncs to destroy/affect remote filesystem state. --HG-- branch : trunk --- py/test/rsession/hostmanage.py | 29 ++++++++++------ py/test/rsession/testing/test_hostmanage.py | 38 +++++++++++++++------ 2 files changed, 46 insertions(+), 21 deletions(-) diff --git a/py/test/rsession/hostmanage.py b/py/test/rsession/hostmanage.py index 86c5bbcb0..0ff54e27c 100644 --- a/py/test/rsession/hostmanage.py +++ b/py/test/rsession/hostmanage.py @@ -13,17 +13,23 @@ class HostInfo(object): """ _hostname2list = {} - def __init__(self, spec): + def __init__(self, spec, addrel=""): parts = spec.split(':', 1) self.hostname = parts.pop(0) self.relpath = parts and parts.pop(0) or "" if self.hostname == "localhost" and not self.relpath: self.inplacelocal = True + if addrel: + raise ValueError("inplace localhosts cannot have " + "additional path %r" % addrel) else: self.inplacelocal = False if not self.relpath: self.relpath = "pytestcache-%s" % self.hostname + if addrel: + self.relpath += "/" + addrel # XXX too os-dependent assert not parts + assert self.inplacelocal or self.relpath self.hostid = self._getuniqueid(self.hostname) def _getuniqueid(self, hostname): @@ -32,7 +38,7 @@ class HostInfo(object): l.append(hostid) return hostid - def initgateway(self, python="python", topdir=None): + def initgateway(self, python="python"): if self.hostname == "localhost": self.gw = py.execnet.PopenGateway(python=python) else: @@ -44,14 +50,13 @@ class HostInfo(object): )).waitclose() self.gw_remotepath = None else: - relpath = self.relpath or topdir or "" - assert relpath + assert self.relpath channel = self.gw.remote_exec(py.code.Source( gethomedir, sethomedir, "sethomedir()", getpath_relto_home, """ channel.send(getpath_relto_home(%r)) - """ % relpath, + """ % self.relpath, )) self.gw_remotepath = channel.receive() @@ -116,19 +121,21 @@ class HostRSync(py.execnet.RSync): class HostManager(object): def __init__(self, config, hosts=None): self.config = config - if hosts is None: - hosts = self.config.getvalue("dist_hosts") - hosts = [HostInfo(x) for x in hosts] - self.hosts = hosts roots = self.config.getvalue_pathlist("dist_rsync_roots") + addrel = "" if roots is None: roots = [self.config.topdir] + addrel = self.config.topdir.basename self.roots = roots + if hosts is None: + hosts = self.config.getvalue("dist_hosts") + hosts = [HostInfo(x, addrel) for x in hosts] + self.hosts = hosts def prepare_gateways(self, reporter): python = self.config.getvalue("dist_remotepython") for host in self.hosts: - host.initgateway(python=python, topdir=self.config.topdir) + host.initgateway(python=python) reporter(repevent.HostGatewayReady(host, self.roots)) host.gw.host = host @@ -140,7 +147,7 @@ class HostManager(object): rsync = HostRSync(root, ignores=ignores, verbose=self.config.option.verbose) if root == self.config.topdir: - destrelpath ="" + destrelpath = "" else: destrelpath = root.basename for host in self.hosts: diff --git a/py/test/rsession/testing/test_hostmanage.py b/py/test/rsession/testing/test_hostmanage.py index e54e51d9c..afc09ea54 100644 --- a/py/test/rsession/testing/test_hostmanage.py +++ b/py/test/rsession/testing/test_hostmanage.py @@ -27,7 +27,15 @@ class TestHostInfo(DirSetup): x = HostInfo("localhost:") assert x.hostname == "localhost" assert not x.relpath - assert x.inplacelocal + + def test_addrel(self): + py.test.raises(ValueError, """ + HostInfo("localhost:", addrel="whatever") + """) + host = HostInfo("localhost:/tmp", addrel="base") + assert host.relpath == "/tmp/base" + host = HostInfo("localhost:tmp", addrel="base2") + assert host.relpath == "tmp/base2" def test_path(self): x = HostInfo("localhost:/tmp") @@ -161,6 +169,16 @@ class TestSyncing(DirSetup): assert not res2 class TestHostManager(DirSetup): + def gethostmanager(self, dist_hosts): + self.source.join("conftest.py").write(py.code.Source(""" + dist_hosts = %r + """ % (dist_hosts,))) + config = py.test.config._reparse([self.source]) + assert config.topdir == self.source + hm = HostManager(config) + assert hm.hosts + return hm + def test_hostmanager_custom_hosts(self): config = py.test.config._reparse([self.source]) hm = HostManager(config, hosts=[1,2,3]) @@ -169,15 +187,15 @@ class TestHostManager(DirSetup): def test_hostmanager_init_rsync_topdir(self): dir2 = self.source.ensure("dir1", "dir2", dir=1) dir2.ensure("hello") - config = py.test.config._reparse([self.source]) - assert config.topdir == self.source - hm = HostManager(config, - hosts=[HostInfo("localhost:" + str(self.dest))]) - events = [] - hm.init_rsync(reporter=events.append) - assert self.dest.join("dir1").check() - assert self.dest.join("dir1", "dir2").check() - assert self.dest.join("dir1", "dir2", 'hello').check() + hm = self.gethostmanager( + dist_hosts = ["localhost:%s" % self.dest] + ) + assert hm.config.topdir == self.source + hm.init_rsync([].append) + dest = self.dest.join(self.source.basename) + assert dest.join("dir1").check() + assert dest.join("dir1", "dir2").check() + assert dest.join("dir1", "dir2", 'hello').check() def test_hostmanager_init_rsync_rsync_roots(self): dir2 = self.source.ensure("dir1", "dir2", dir=1)