[svn r38192] streamlining localhost optimization handling,
and simplifying the test a bit. --HG-- branch : trunk
This commit is contained in:
		
							parent
							
								
									411157756b
								
							
						
					
					
						commit
						6e293f593a
					
				|  | @ -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 | ||||
| 
 | ||||
|  |  | |||
|  | @ -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") | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue