contrib/python-zstandard/zstandard/__init__.py
author Martin von Zweigbergk <martinvonz@google.com>
Fri, 13 Apr 2018 23:23:47 -0700
changeset 38843 6f7c9527030b
parent 37495 b1fb341d8a61
child 40121 73fef626dae3
permissions -rw-r--r--
scmutil: make shortest() respect disambiguation revset The previous patch would let you use a shorter prefix if the prefix is unique within a configured revset. However, that's not very useful if there's no simple way of knowing what that shorter prefix is. This patch adapts the shortest() template function to use the shorter prefixes for nodes in the configured revset. This is currently extremely slow, because it calculates the revset for each call to shortest(). To make this faster, the next patch will start caching the revset instance. Ideally we'd cache a prefix tree instance instead. Differential Revision: https://phab.mercurial-scm.org/D4038

# Copyright (c) 2017-present, Gregory Szorc
# All rights reserved.
#
# This software may be modified and distributed under the terms
# of the BSD license. See the LICENSE file for details.

"""Python interface to the Zstandard (zstd) compression library."""

from __future__ import absolute_import, unicode_literals

# This module serves 2 roles:
#
# 1) Export the C or CFFI "backend" through a central module.
# 2) Implement additional functionality built on top of C or CFFI backend.

import os
import platform

# Some Python implementations don't support C extensions. That's why we have
# a CFFI implementation in the first place. The code here import one of our
# "backends" then re-exports the symbols from this module. For convenience,
# we support falling back to the CFFI backend if the C extension can't be
# imported. But for performance reasons, we only do this on unknown Python
# implementation. Notably, for CPython we require the C extension by default.
# Because someone will inevitably want special behavior, the behavior is
# configurable via an environment variable. A potentially better way to handle
# this is to import a special ``__importpolicy__`` module or something
# defining a variable and `setup.py` could write the file with whatever
# policy was specified at build time. Until someone needs it, we go with
# the hacky but simple environment variable approach.
_module_policy = os.environ.get('PYTHON_ZSTANDARD_IMPORT_POLICY', 'default')

if _module_policy == 'default':
    if platform.python_implementation() in ('CPython',):
        from zstd import *
        backend = 'cext'
    elif platform.python_implementation() in ('PyPy',):
        from zstd_cffi import *
        backend = 'cffi'
    else:
        try:
            from zstd import *
            backend = 'cext'
        except ImportError:
            from zstd_cffi import *
            backend = 'cffi'
elif _module_policy == 'cffi_fallback':
    try:
        from zstd import *
        backend = 'cext'
    except ImportError:
        from zstd_cffi import *
        backend = 'cffi'
elif _module_policy == 'cext':
    from zstd import *
    backend = 'cext'
elif _module_policy == 'cffi':
    from zstd_cffi import *
    backend = 'cffi'
else:
    raise ImportError('unknown module import policy: %s; use default, cffi_fallback, '
                      'cext, or cffi' % _module_policy)