tests/run-tests.py
changeset 28143 c754996fd41f
parent 28142 85e28a46c7f1
child 28169 1b07331f5900
equal deleted inserted replaced
28142:85e28a46c7f1 28143:c754996fd41f
   247         help="external diff viewer")
   247         help="external diff viewer")
   248     parser.add_option("--with-hg", type="string",
   248     parser.add_option("--with-hg", type="string",
   249         metavar="HG",
   249         metavar="HG",
   250         help="test using specified hg script rather than a "
   250         help="test using specified hg script rather than a "
   251              "temporary installation")
   251              "temporary installation")
       
   252     parser.add_option("--chg", action="store_true",
       
   253                       help="install and use chg wrapper in place of hg")
   252     parser.add_option("--with-chg", metavar="CHG",
   254     parser.add_option("--with-chg", metavar="CHG",
   253                       help="use specified chg wrapper in place of hg")
   255                       help="use specified chg wrapper in place of hg")
   254     parser.add_option("-3", "--py3k-warnings", action="store_true",
   256     parser.add_option("-3", "--py3k-warnings", action="store_true",
   255         help="enable Py3k warnings on Python 2.6+")
   257         help="enable Py3k warnings on Python 2.6+")
   256     parser.add_option('--extra-config-opt', action="append",
   258     parser.add_option('--extra-config-opt', action="append",
   292         if os.name != 'nt' and not os.access(hgbin, os.X_OK):
   294         if os.name != 'nt' and not os.access(hgbin, os.X_OK):
   293             parser.error('--local specified, but %r not found or not executable'
   295             parser.error('--local specified, but %r not found or not executable'
   294                          % hgbin)
   296                          % hgbin)
   295         options.with_hg = hgbin
   297         options.with_hg = hgbin
   296 
   298 
       
   299     if (options.chg or options.with_chg) and os.name == 'nt':
       
   300         parser.error('chg does not work on %s' % os.name)
   297     if options.with_chg:
   301     if options.with_chg:
   298         if os.name == 'nt':
   302         options.chg = False  # no installation to temporary location
   299             parser.error('chg does not work on %s' % os.name)
       
   300         options.with_chg = os.path.realpath(
   303         options.with_chg = os.path.realpath(
   301             os.path.expanduser(_bytespath(options.with_chg)))
   304             os.path.expanduser(_bytespath(options.with_chg)))
   302         if not (os.path.isfile(options.with_chg) and
   305         if not (os.path.isfile(options.with_chg) and
   303                 os.access(options.with_chg, os.X_OK)):
   306                 os.access(options.with_chg, os.X_OK)):
   304             parser.error('--with-chg must specify a chg executable')
   307             parser.error('--with-chg must specify a chg executable')
       
   308     if options.chg and options.with_hg:
       
   309         # chg shares installation location with hg
       
   310         parser.error('--chg does not work when --with-hg is specified '
       
   311                      '(use --with-chg instead)')
   305 
   312 
   306     options.anycoverage = options.cover or options.annotate or options.htmlcov
   313     options.anycoverage = options.cover or options.annotate or options.htmlcov
   307     if options.anycoverage:
   314     if options.anycoverage:
   308         try:
   315         try:
   309             import coverage
   316             import coverage
  1947             self._tmpbindir = self._bindir
  1954             self._tmpbindir = self._bindir
  1948             self._pythondir = os.path.join(self._installdir, b"lib", b"python")
  1955             self._pythondir = os.path.join(self._installdir, b"lib", b"python")
  1949 
  1956 
  1950         # set up crafted chg environment, then replace "hg" command by "chg"
  1957         # set up crafted chg environment, then replace "hg" command by "chg"
  1951         chgbindir = self._bindir
  1958         chgbindir = self._bindir
  1952         if self.options.with_chg:
  1959         if self.options.chg or self.options.with_chg:
  1953             self._chgsockdir = d = os.path.join(self._hgtmp, b'chgsock')
  1960             self._chgsockdir = d = os.path.join(self._hgtmp, b'chgsock')
  1954             os.mkdir(d)
  1961             os.mkdir(d)
  1955             osenvironb[b'CHGSOCKNAME'] = os.path.join(d, b"server")
  1962             osenvironb[b'CHGSOCKNAME'] = os.path.join(d, b"server")
  1956             osenvironb[b'CHGHG'] = os.path.join(self._bindir, self._hgcommand)
  1963             osenvironb[b'CHGHG'] = os.path.join(self._bindir, self._hgcommand)
       
  1964         if self.options.chg:
       
  1965             self._hgcommand = b'chg'
       
  1966         elif self.options.with_chg:
  1957             chgbindir = os.path.dirname(os.path.realpath(self.options.with_chg))
  1967             chgbindir = os.path.dirname(os.path.realpath(self.options.with_chg))
  1958             self._hgcommand = os.path.basename(self.options.with_chg)
  1968             self._hgcommand = os.path.basename(self.options.with_chg)
  1959 
  1969 
  1960         osenvironb[b"BINDIR"] = self._bindir
  1970         osenvironb[b"BINDIR"] = self._bindir
  1961         osenvironb[b"PYTHON"] = PYTHON
  1971         osenvironb[b"PYTHON"] = PYTHON
  2041             if self._installdir:
  2051             if self._installdir:
  2042                 self._installhg()
  2052                 self._installhg()
  2043                 self._checkhglib("Testing")
  2053                 self._checkhglib("Testing")
  2044             else:
  2054             else:
  2045                 self._usecorrectpython()
  2055                 self._usecorrectpython()
       
  2056             if self.options.chg:
       
  2057                 assert self._installdir
       
  2058                 self._installchg()
  2046 
  2059 
  2047             if self.options.restart:
  2060             if self.options.restart:
  2048                 orig = list(tests)
  2061                 orig = list(tests)
  2049                 while tests:
  2062                 while tests:
  2050                     if os.path.exists(tests[0] + ".err"):
  2063                     if os.path.exists(tests[0] + ".err"):
  2342         finally:
  2355         finally:
  2343             pipe.close()
  2356             pipe.close()
  2344 
  2357 
  2345         return self._hgpath
  2358         return self._hgpath
  2346 
  2359 
       
  2360     def _installchg(self):
       
  2361         """Install chg into the test environment"""
       
  2362         vlog('# Performing temporary installation of CHG')
       
  2363         assert os.path.dirname(self._bindir) == self._installdir
       
  2364         assert self._hgroot, 'must be called after _installhg()'
       
  2365         cmd = (b'"%(make)s" clean install PREFIX="%(prefix)s"'
       
  2366                % {b'make': 'make',  # TODO: switch by option or environment?
       
  2367                   b'prefix': self._installdir})
       
  2368         cwd = os.path.join(self._hgroot, b'contrib', b'chg')
       
  2369         vlog("# Running", cmd)
       
  2370         proc = subprocess.Popen(cmd, shell=True, cwd=cwd,
       
  2371                                 stdin=subprocess.PIPE, stdout=subprocess.PIPE,
       
  2372                                 stderr=subprocess.STDOUT)
       
  2373         out, _err = proc.communicate()
       
  2374         if proc.returncode != 0:
       
  2375             if PYTHON3:
       
  2376                 sys.stdout.buffer.write(out)
       
  2377             else:
       
  2378                 sys.stdout.write(out)
       
  2379             sys.exit(1)
       
  2380 
  2347     def _killchgdaemons(self):
  2381     def _killchgdaemons(self):
  2348         """Kill all background chg command servers spawned by tests"""
  2382         """Kill all background chg command servers spawned by tests"""
  2349         for f in os.listdir(self._chgsockdir):
  2383         for f in os.listdir(self._chgsockdir):
  2350             if not f.endswith(b'.pid'):
  2384             if not f.endswith(b'.pid'):
  2351                 continue
  2385                 continue