view tests/test-imports-checker.t @ 35767:5f5fb279fd39

streamclone: also stream caches to the client When stream clone is used over bundle2, relevant cache files are also streamed. This is expected to be a massive performance win for clone since no important cache will have to be recomputed. Some performance numbers: (All times are wall-clock times in seconds, 2 attempts per case.) # Mozilla-Central ## Clone over ssh over lan V1 streaming: 234.3 239.6 V2 streaming: 248.4 243.7 ## Clone over ssh over Internet V1 streaming: 175.5 110.9 V2 streaming: 109.1 111.0 ## Clone over HTTP over lan V1 streaming: 105.3 105.6 V2 streaming: 112.7 111.4 ## Clone over HTTP over internet V1 streaming: 105.6 114.6 V2 streaming: 226.7 225.9 ## Hg tags V1 streaming (no cache): 1.084 1.071 V2 streaming (cache): 0.312 0.325 ## Hg branches V1 streaming (no cache): 14.047 14.148 V2 streaming (with cache): 0.312 0.333 # Pypy ## Clone over ssh over internet V1 streaming: 29.4 30.1 V2 streaming: 31.2 30.1 ## Clone over http over internet V1 streaming: 29.7 29.7 V2 streaming: 75.2 72.9 (since ssh and lan are not affected, there seems to be an issue with how we read/write the http stream on connection with latency, unrelated to the format) ## Hg tags V1 streaming (no cache): 1.752 1.664 V2 streaming (with cache): 0.274 0.260 ## Hg branches V1 streaming (no cache): 4.469 4.728 V2 streaming (with cache): 0.318 0.321 # Private repository: * 500K revision revisions * 11K topological heads * 28K branch heads ## hg tags no cache: 1543.332 with cache: 4.900 ## hg branches no cache: 91.828 with cache: 2.955
author Boris Feld <boris.feld@octobus.net>
date Thu, 18 Jan 2018 00:50:12 +0100
parents bc2535238de2
children 5abc47d4ca6b
line wrap: on
line source

#require test-repo

  $ . "$TESTDIR/helpers-testrepo.sh"
  $ testrepohgenv
  $ import_checker="$TESTDIR"/../contrib/import-checker.py

Run the doctests from the import checker, and make sure
it's working correctly.
  $ TERM=dumb
  $ export TERM
  $ $PYTHON -m doctest $import_checker

Run additional tests for the import checker

  $ mkdir testpackage
  $ touch testpackage/__init__.py

  $ cat > testpackage/multiple.py << EOF
  > from __future__ import absolute_import
  > import os, sys
  > EOF

  $ cat > testpackage/unsorted.py << EOF
  > from __future__ import absolute_import
  > import sys
  > import os
  > EOF

  $ cat > testpackage/stdafterlocal.py << EOF
  > from __future__ import absolute_import
  > from . import unsorted
  > import os
  > EOF

  $ cat > testpackage/requirerelative.py << EOF
  > from __future__ import absolute_import
  > import testpackage.unsorted
  > EOF

  $ cat > testpackage/importalias.py << EOF
  > from __future__ import absolute_import
  > import ui
  > EOF

  $ cat > testpackage/relativestdlib.py << EOF
  > from __future__ import absolute_import
  > from .. import os
  > EOF

  $ cat > testpackage/symbolimport.py << EOF
  > from __future__ import absolute_import
  > from .unsorted import foo
  > EOF

  $ cat > testpackage/latesymbolimport.py << EOF
  > from __future__ import absolute_import
  > from . import unsorted
  > from mercurial.node import hex
  > EOF

  $ cat > testpackage/multiplegroups.py << EOF
  > from __future__ import absolute_import
  > from . import unsorted
  > from . import more
  > EOF

  $ mkdir testpackage/subpackage
  $ cat > testpackage/subpackage/levelpriority.py << EOF
  > from __future__ import absolute_import
  > from . import foo
  > from .. import parent
  > EOF

  $ touch testpackage/subpackage/foo.py
  $ cat > testpackage/subpackage/__init__.py << EOF
  > from __future__ import absolute_import
  > from . import levelpriority  # should not cause cycle
  > EOF

  $ cat > testpackage/subpackage/localimport.py << EOF
  > from __future__ import absolute_import
  > from . import foo
  > def bar():
  >     # should not cause "higher-level import should come first"
  >     from .. import unsorted
  >     # but other errors should be detected
  >     from .. import more
  >     import testpackage.subpackage.levelpriority
  > EOF

  $ cat > testpackage/importmodulefromsub.py << EOF
  > from __future__ import absolute_import
  > from .subpackage import foo  # not a "direct symbol import"
  > EOF

  $ cat > testpackage/importsymbolfromsub.py << EOF
  > from __future__ import absolute_import
  > from .subpackage import foo, nonmodule
  > EOF

  $ cat > testpackage/sortedentries.py << EOF
  > from __future__ import absolute_import
  > from . import (
  >     foo,
  >     bar,
  > )
  > EOF

  $ cat > testpackage/importfromalias.py << EOF
  > from __future__ import absolute_import
  > from . import ui
  > EOF

  $ cat > testpackage/importfromrelative.py << EOF
  > from __future__ import absolute_import
  > from testpackage.unsorted import foo
  > EOF

  $ mkdir testpackage2
  $ touch testpackage2/__init__.py

  $ cat > testpackage2/latesymbolimport.py << EOF
  > from __future__ import absolute_import
  > from testpackage import unsorted
  > from mercurial.node import hex
  > EOF

# Shadowing a stdlib module to test "relative import of stdlib module" is
# allowed if the module is also being checked

  $ mkdir email
  $ touch email/__init__.py
  $ touch email/errors.py
  $ cat > email/utils.py << EOF
  > from __future__ import absolute_import
  > from . import errors
  > EOF

  $ $PYTHON "$import_checker" testpackage*/*.py testpackage/subpackage/*.py \
  >   email/*.py
  testpackage/importalias.py:2: ui module must be "as" aliased to uimod
  testpackage/importfromalias.py:2: ui from testpackage must be "as" aliased to uimod
  testpackage/importfromrelative.py:2: import should be relative: testpackage.unsorted
  testpackage/importfromrelative.py:2: direct symbol import foo from testpackage.unsorted
  testpackage/importsymbolfromsub.py:2: direct symbol import nonmodule from testpackage.subpackage
  testpackage/latesymbolimport.py:3: symbol import follows non-symbol import: mercurial.node
  testpackage/multiple.py:2: multiple imported names: os, sys
  testpackage/multiplegroups.py:3: multiple "from . import" statements
  testpackage/relativestdlib.py:2: relative import of stdlib module
  testpackage/requirerelative.py:2: import should be relative: testpackage.unsorted
  testpackage/sortedentries.py:2: imports from testpackage not lexically sorted: bar < foo
  testpackage/stdafterlocal.py:3: stdlib import "os" follows local import: testpackage
  testpackage/subpackage/levelpriority.py:3: higher-level import should come first: testpackage
  testpackage/subpackage/localimport.py:7: multiple "from .. import" statements
  testpackage/subpackage/localimport.py:8: import should be relative: testpackage.subpackage.levelpriority
  testpackage/symbolimport.py:2: direct symbol import foo from testpackage.unsorted
  testpackage/unsorted.py:3: imports not lexically sorted: os < sys
  testpackage2/latesymbolimport.py:3: symbol import follows non-symbol import: mercurial.node
  [1]