Skip to content
Snippets Groups Projects
  • Matt Harbison's avatar
    7740d510
    hg: add user-site to `sys.path` on Windows to allow pip-installed extensions · 7740d510
    Matt Harbison authored
    This has been in the TortoiseHg builds for several cycles now on Windows, and
    even longer on macOS.  It allows an extension to be configured with `ext =`
    syntax, instead of requiring the full path to be specified.  It's confusing for
    a user to be hit with messages about not being able to load extensions, based
    solely on which `hg.exe` is being run.
    
    This only applies to py2exe binaries, since wrapper.exe already sees into the
    user site area.  There are no frozen binaries on other platforms (that I'm aware
    of), and an equivalent change will need to be made to `dispatch.py` in order to
    work with PyOxidizer, since it bypasses this module completely.  (It also has
    the ability to use the `site` module, so it will look completely different.)
    
    Differential Revision: https://phab.mercurial-scm.org/D9531
    7740d510
    History
    hg: add user-site to `sys.path` on Windows to allow pip-installed extensions
    Matt Harbison authored
    This has been in the TortoiseHg builds for several cycles now on Windows, and
    even longer on macOS.  It allows an extension to be configured with `ext =`
    syntax, instead of requiring the full path to be specified.  It's confusing for
    a user to be hit with messages about not being able to load extensions, based
    solely on which `hg.exe` is being run.
    
    This only applies to py2exe binaries, since wrapper.exe already sees into the
    user site area.  There are no frozen binaries on other platforms (that I'm aware
    of), and an equivalent change will need to be made to `dispatch.py` in order to
    work with PyOxidizer, since it bypasses this module completely.  (It also has
    the ability to use the `site` module, so it will look completely different.)
    
    Differential Revision: https://phab.mercurial-scm.org/D9531
hg 1.70 KiB
#!/usr/bin/env python3
#
# mercurial - scalable distributed SCM
#
# Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
#
# This software may be used and distributed according to the terms of the
# GNU General Public License version 2 or any later version.
from __future__ import absolute_import

import os
import sys

libdir = '@LIBDIR@'

if libdir != '@' 'LIBDIR' '@':
    if not os.path.isabs(libdir):
        libdir = os.path.join(
            os.path.dirname(os.path.realpath(__file__)), libdir
        )
        libdir = os.path.abspath(libdir)
    sys.path.insert(0, libdir)

# Make `pip install --user ...` packages available to the official Windows
# build.  Most py2 packaging installs directly into the system python
# environment, so no changes are necessary for other platforms.  The Windows
# py2 package uses py2exe, which lacks a `site` module.  Hardcode it according
# to the documentation.
if getattr(sys, 'frozen', None) == 'console_exe':
    vi = sys.version_info
    sys.path.append(
        os.path.join(
            os.environ['APPDATA'],
            'Python',
            'Python%d%d' % (vi[0], vi[1]),
            'site-packages',
        )
    )

from hgdemandimport import tracing

with tracing.log('hg script'):
    # enable importing on demand to reduce startup time
    try:
        if sys.version_info[0] < 3 or sys.version_info >= (3, 6):
            import hgdemandimport

            hgdemandimport.enable()
    except ImportError:
        sys.stderr.write(
            "abort: couldn't find mercurial libraries in [%s]\n"
            % ' '.join(sys.path)
        )
        sys.stderr.write("(check your install and PYTHONPATH)\n")
        sys.exit(-1)

    from mercurial import dispatch

    dispatch.run()