comparison tests/run-tests.py @ 18244:5a3c71b0e042

run-tests.py: fix handling of symlink to the right python Before: a symlink for python in BINDIR was sometimes created, but it was never updated when a different Python was used and it was never removed. An invalid python could thus be left around and used when testing with --local. Now: the symlink is removed when wrong and created when necessary. The mechanism for finding the right name (python or python.exe) also had to be simplified and made more explicit.
author Mads Kiilerich <mads@kiilerich.com>
date Mon, 07 Jan 2013 02:14:41 +0100
parents f5842787a958
children 6880eae9f861
comparison
equal deleted inserted replaced
18243:b3b1b8e127e5 18244:5a3c71b0e042
354 shutil.rmtree(HGTMP, True) 354 shutil.rmtree(HGTMP, True)
355 355
356 def usecorrectpython(): 356 def usecorrectpython():
357 # some tests run python interpreter. they must use same 357 # some tests run python interpreter. they must use same
358 # interpreter we use or bad things will happen. 358 # interpreter we use or bad things will happen.
359 exedir, exename = os.path.split(sys.executable) 359 pyexename = sys.platform == 'win32' and 'python.exe' or 'python'
360 if exename in ('python', 'python.exe'):
361 path = findprogram(exename)
362 if os.path.dirname(path) == exedir:
363 return
364 else:
365 exename = 'python'
366 if sys.platform == 'win32':
367 exename = 'python.exe'
368 if getattr(os, 'symlink', None): 360 if getattr(os, 'symlink', None):
369 vlog("# Making python executable in test path a symlink to '%s'" % 361 vlog("# Making python executable in test path a symlink to '%s'" %
370 sys.executable) 362 sys.executable)
371 mypython = os.path.join(BINDIR, exename) 363 mypython = os.path.join(BINDIR, pyexename)
372 try: 364 try:
373 os.symlink(sys.executable, mypython) 365 if os.readlink(mypython) == sys.executable:
366 return
367 os.unlink(mypython)
374 except OSError, err: 368 except OSError, err:
375 # child processes may race, which is harmless 369 if err.errno != errno.ENOENT:
376 if err.errno != errno.EEXIST:
377 raise 370 raise
371 if findprogram(pyexename) != sys.executable:
372 try:
373 os.symlink(sys.executable, mypython)
374 except OSError, err:
375 # child processes may race, which is harmless
376 if err.errno != errno.EEXIST:
377 raise
378 else: 378 else:
379 vlog("# Modifying search path to find %s in '%s'" % (exename, exedir)) 379 exedir, exename = os.path.split(sys.executable)
380 vlog("# Modifying search path to find %s as %s in '%s'" %
381 (exename, pyexename, exedir))
380 path = os.environ['PATH'].split(os.pathsep) 382 path = os.environ['PATH'].split(os.pathsep)
381 while exedir in path: 383 while exedir in path:
382 path.remove(exedir) 384 path.remove(exedir)
383 os.environ['PATH'] = os.pathsep.join([exedir] + path) 385 os.environ['PATH'] = os.pathsep.join([exedir] + path)
384 if not findprogram(exename): 386 if not findprogram(pyexename):
385 print "WARNING: Cannot find %s in search path" % exename 387 print "WARNING: Cannot find %s in search path" % pyexename
386 388
387 def installhg(options): 389 def installhg(options):
388 vlog("# Performing temporary installation of HG") 390 vlog("# Performing temporary installation of HG")
389 installerrs = os.path.join("tests", "install.err") 391 installerrs = os.path.join("tests", "install.err")
390 compiler = '' 392 compiler = ''