Patchwork run-tests: add --rev to run tests with specific version of hg

login
register
mail settings
Submitter timeless@mozdev.org
Date April 7, 2016, 2:54 a.m.
Message ID <c95967671da37d6669e7.1459997647@waste.org>
Download mbox | patch
Permalink /patch/14419/
State Superseded
Headers show

Comments

timeless@mozdev.org - April 7, 2016, 2:54 a.m.
# HG changeset patch
# User timeless <timeless@mozdev.org>
# Date 1459995887 0
#      Thu Apr 07 02:24:47 2016 +0000
# Node ID c95967671da37d6669e7ef786f471bf727d78592
# Parent  ea86cdcd9b50bf38c6b9dd7bbaa04b9c8cc0aefb
run-tests: add --rev to run tests with specific version of hg

This is mostly designed for use outside of hg.

Keep in mind that unless you specify a path inside $TESTTMP, your tests
will almost certainly fail.
timeless - April 7, 2016, 6:03 a.m.
> +            proc = subprocess.Popen(['hg', 'archive',

ok, so.. um...

archive doesn't work because it means `hg version` doesn't work.

fwiw, `hg update` doesn't work either, because if you have e.g. a
dotencode repo then if you update to before that, you won't have a
repo as far as hg is concerned (and you'll want another version of hg
in order to recover!).

I think in order for this to be handled correctly I will need to teach
run-tests how to ask help if modes in .hg/requires are supported by
the version of hg being selected.

Patch

diff --git a/tests/run-tests.py b/tests/run-tests.py
--- a/tests/run-tests.py
+++ b/tests/run-tests.py
@@ -263,6 +263,9 @@ 
     parser.add_option("--with-python3", metavar="PYTHON3",
                       help="Python 3 interpreter (if running under Python 2)"
                            " (TEMPORARY)")
+    parser.add_option('--rev', type="string",
+                      metavar="rev",
+                      help="run tests using the given revision")
     parser.add_option('--extra-config-opt', action="append",
                       help='set the given config opt in the test hgrc')
     parser.add_option('--random', action="store_true",
@@ -294,12 +297,16 @@ 
 
     if options.with_hg:
         options.with_hg = canonpath(_bytespath(options.with_hg))
+        if options.rev:
+            parser.error('--with-hg and --rev are incompatible')
         if not (os.path.isfile(options.with_hg) and
                 os.access(options.with_hg, os.X_OK)):
             parser.error('--with-hg must specify an executable hg script')
         if not os.path.basename(options.with_hg) == b'hg':
             sys.stderr.write('warning: --with-hg should specify an hg script\n')
     if options.local:
+        if options.rev:
+            parser.error('--local and --rev are incompatible')
         testdir = os.path.dirname(_bytespath(canonpath(sys.argv[0])))
         hgbin = os.path.join(os.path.dirname(testdir), b'hg')
         if os.name != 'nt' and not os.access(hgbin, os.X_OK):
@@ -2330,6 +2337,25 @@ 
             script = _bytespath(script)
             exe = _bytespath(exe)
         hgroot = os.path.dirname(os.path.dirname(script))
+        if self.options.rev:
+            tempsrc = os.path.join(self._hgtmp, b"source")
+            proc = subprocess.Popen(['hg', 'archive',
+                                     '-R', hgroot,
+                                     '--rev', self.options.rev,
+                                     tempsrc,
+                                    ],
+                                    stderr=subprocess.STDOUT,
+                                    stdout=subprocess.PIPE)
+            proc.wait()
+            out, _err = proc.communicate()
+            out = b"hg archive failed:\n" + out
+            if proc.returncode != 0:
+                if PYTHON3:
+                    sys.stdout.buffer.write(out)
+                else:
+                    sys.stdout.write(out)
+                sys.exit(1)
+            hgroot = tempsrc
         self._hgroot = hgroot
         os.chdir(hgroot)
         nohome = b'--home=""'
diff --git a/tests/test-run-tests.t b/tests/test-run-tests.t
--- a/tests/test-run-tests.t
+++ b/tests/test-run-tests.t
@@ -815,3 +815,32 @@ 
   # Ran 1 tests, 0 skipped, 0 warned, 1 failed.
   python hash seed: * (glob)
   [1]
+
+support for running a different version of mercurial
+note that it is typical for ~1/5 tests not to pass when using older
+versions of mercurial...
+
+  $ cat >> test-version.t <<EOF
+  >   $ hg version
+  >   Mercurial Distributed SCM (version unknown)
+  >   
+  >   Copyright (C) 2005-2008 Matt Mackall <mpm@selenic.com> and others
+  >   This is free software; see the source for copying conditions. There is NO
+  >   warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+  > EOF
+  $ run-tests.py --pure --rev 1.2 test-version.t
+  .
+  # Ran 1 tests, 0 skipped, 0 warned, 0 failed.
+
+To run tests at a version from the revision you select from --rev
+you need a test which introspects the source directory
+
+  $ cat > test-old-basic.t <<EOF
+  >   $ run-tests.py --pure --local ../../source/tests/test-basic.t
+  >   .
+  >   # Ran 1 tests, 0 skipped, 0 warned, 0 failed.
+  > EOF
+  $ run-tests.py --pure --rev 1.7 test-old-basic.t
+  .
+  # Ran 1 tests, 0 skipped, 0 warned, 0 failed.
+