Merge pull request #8972 from bonzini/C-symlink

resolve symlinks passed to -C
pull/9008/head
Jussi Pakkanen 3 years ago committed by GitHub
commit 0be74c7835
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 5
      mesonbuild/mdevenv.py
  2. 6
      mesonbuild/mdist.py
  3. 13
      mesonbuild/mesonlib/universal.py
  4. 3
      mesonbuild/minit.py
  5. 4
      mesonbuild/minstall.py
  6. 11
      mesonbuild/mtest.py
  7. 12
      run_unittests.py

@ -4,12 +4,12 @@ import tempfile
from pathlib import Path from pathlib import Path
from . import build from . import build
from .mesonlib import MesonException, is_windows from .mesonlib import MesonException, RealPathAction, is_windows
import typing as T import typing as T
def add_arguments(parser: argparse.ArgumentParser) -> None: def add_arguments(parser: argparse.ArgumentParser) -> None:
parser.add_argument('-C', default='.', dest='wd', parser.add_argument('-C', dest='wd', action=RealPathAction,
help='directory to cd into before running') help='directory to cd into before running')
parser.add_argument('command', nargs=argparse.REMAINDER, parser.add_argument('command', nargs=argparse.REMAINDER,
help='Command to run in developer environment (default: interactive shell)') help='Command to run in developer environment (default: interactive shell)')
@ -37,7 +37,6 @@ def get_env(b: build.Build, build_dir: str) -> T.Dict[str, str]:
return extra_env.get_env(env) return extra_env.get_env(env)
def run(options: argparse.Namespace) -> int: def run(options: argparse.Namespace) -> int:
options.wd = os.path.abspath(options.wd)
buildfile = Path(options.wd) / 'meson-private' / 'build.dat' buildfile = Path(options.wd) / 'meson-private' / 'build.dat'
if not buildfile.is_file(): if not buildfile.is_file():
raise MesonException(f'Directory {options.wd!r} does not seem to be a Meson build directory.') raise MesonException(f'Directory {options.wd!r} does not seem to be a Meson build directory.')

@ -23,7 +23,8 @@ import json
from glob import glob from glob import glob
from pathlib import Path from pathlib import Path
from mesonbuild.environment import detect_ninja from mesonbuild.environment import detect_ninja
from mesonbuild.mesonlib import windows_proof_rmtree, MesonException, quiet_git from mesonbuild.mesonlib import (MesonException, RealPathAction, quiet_git,
windows_proof_rmtree)
from mesonbuild.wrap import wrap from mesonbuild.wrap import wrap
from mesonbuild import mlog, build from mesonbuild import mlog, build
from .scripts.meson_exe import run_exe from .scripts.meson_exe import run_exe
@ -35,7 +36,7 @@ archive_extension = {'gztar': '.tar.gz',
'zip': '.zip'} 'zip': '.zip'}
def add_arguments(parser): def add_arguments(parser):
parser.add_argument('-C', default='.', dest='wd', parser.add_argument('-C', dest='wd', action=RealPathAction,
help='directory to cd into before running') help='directory to cd into before running')
parser.add_argument('--formats', default='xztar', parser.add_argument('--formats', default='xztar',
help='Comma separated list of archive types to create. Supports xztar (default), gztar, and zip.') help='Comma separated list of archive types to create. Supports xztar (default), gztar, and zip.')
@ -270,7 +271,6 @@ def determine_archives_to_generate(options):
return result return result
def run(options): def run(options):
options.wd = os.path.abspath(options.wd)
buildfile = Path(options.wd) / 'meson-private' / 'build.dat' buildfile = Path(options.wd) / 'meson-private' / 'build.dat'
if not buildfile.is_file(): if not buildfile.is_file():
raise MesonException(f'Directory {options.wd!r} does not seem to be a Meson build directory.') raise MesonException(f'Directory {options.wd!r} does not seem to be a Meson build directory.')

@ -14,6 +14,7 @@
"""A library of random helper functionality.""" """A library of random helper functionality."""
from pathlib import Path from pathlib import Path
import argparse
import enum import enum
import sys import sys
import stat import stat
@ -70,6 +71,7 @@ __all__ = [
'PerThreeMachine', 'PerThreeMachine',
'PerThreeMachineDefaultable', 'PerThreeMachineDefaultable',
'ProgressBar', 'ProgressBar',
'RealPathAction',
'TemporaryDirectoryWinProof', 'TemporaryDirectoryWinProof',
'Version', 'Version',
'check_direntry_issues', 'check_direntry_issues',
@ -1843,6 +1845,17 @@ else:
ProgressBar = ProgressBarTqdm ProgressBar = ProgressBarTqdm
class RealPathAction(argparse.Action):
def __init__(self, option_strings: T.List[str], dest: str, default: str = '.', **kwargs: T.Any):
default = os.path.abspath(os.path.realpath(default))
super().__init__(option_strings, dest, nargs=None, default=default, **kwargs)
def __call__(self, parser: argparse.ArgumentParser, namespace: argparse.Namespace,
values: T.Union[str, T.Sequence[T.Any], None], option_string: str = None) -> None:
assert isinstance(values, str)
setattr(namespace, self.dest, os.path.abspath(os.path.realpath(values)))
def get_wine_shortpath(winecmd: T.List[str], wine_paths: T.Sequence[str]) -> str: def get_wine_shortpath(winecmd: T.List[str], wine_paths: T.Sequence[str]) -> str:
"""Get A short version of @wine_paths to avoid reaching WINEPATH number """Get A short version of @wine_paths to avoid reaching WINEPATH number
of char limit. of char limit.

@ -139,7 +139,8 @@ def add_arguments(parser: 'argparse.ArgumentParser') -> None:
Meson project. Meson project.
''' '''
parser.add_argument("srcfiles", metavar="sourcefile", nargs="*", help="source files. default: all recognized files in current directory") parser.add_argument("srcfiles", metavar="sourcefile", nargs="*", help="source files. default: all recognized files in current directory")
parser.add_argument('-C', default='.', dest='wd', help='directory to cd into before running') parser.add_argument('-C', dest='wd', action=mesonlib.RealPathAction,
help='directory to cd into before running')
parser.add_argument("-n", "--name", help="project name. default: name of current directory") parser.add_argument("-n", "--name", help="project name. default: name of current directory")
parser.add_argument("-e", "--executable", help="executable name. default: project name") parser.add_argument("-e", "--executable", help="executable name. default: project name")
parser.add_argument("-d", "--deps", help="dependencies, comma-separated") parser.add_argument("-d", "--deps", help="dependencies, comma-separated")

@ -28,7 +28,7 @@ from . import environment
from .backend.backends import InstallData from .backend.backends import InstallData
from .coredata import major_versions_differ, MesonVersionMismatchException from .coredata import major_versions_differ, MesonVersionMismatchException
from .coredata import version as coredata_version from .coredata import version as coredata_version
from .mesonlib import is_windows, Popen_safe from .mesonlib import Popen_safe, RealPathAction, is_windows
from .scripts import depfixer, destdir_join from .scripts import depfixer, destdir_join
from .scripts.meson_exe import run_exe from .scripts.meson_exe import run_exe
try: try:
@ -65,7 +65,7 @@ build definitions so that it will not break when the change happens.'''
selinux_updates: T.List[str] = [] selinux_updates: T.List[str] = []
def add_arguments(parser: argparse.ArgumentParser) -> None: def add_arguments(parser: argparse.ArgumentParser) -> None:
parser.add_argument('-C', default='.', dest='wd', parser.add_argument('-C', dest='wd', action=RealPathAction,
help='directory to cd into before running') help='directory to cd into before running')
parser.add_argument('--profile-self', action='store_true', dest='profile', parser.add_argument('--profile-self', action='store_true', dest='profile',
help=argparse.SUPPRESS) help=argparse.SUPPRESS)

@ -43,7 +43,8 @@ from . import environment
from . import mlog from . import mlog
from .coredata import major_versions_differ, MesonVersionMismatchException from .coredata import major_versions_differ, MesonVersionMismatchException
from .coredata import version as coredata_version from .coredata import version as coredata_version
from .mesonlib import MesonException, OrderedSet, get_wine_shortpath, split_args, join_args from .mesonlib import (MesonException, OrderedSet, RealPathAction,
get_wine_shortpath, join_args, split_args)
from .mintro import get_infodir, load_info_file from .mintro import get_infodir, load_info_file
from .programs import ExternalProgram from .programs import ExternalProgram
from .backend.backends import TestProtocol, TestSerialisation from .backend.backends import TestProtocol, TestSerialisation
@ -104,7 +105,7 @@ def add_arguments(parser: argparse.ArgumentParser) -> None:
help='List available tests.') help='List available tests.')
parser.add_argument('--wrapper', default=None, dest='wrapper', type=split_args, parser.add_argument('--wrapper', default=None, dest='wrapper', type=split_args,
help='wrapper to run tests with (e.g. Valgrind)') help='wrapper to run tests with (e.g. Valgrind)')
parser.add_argument('-C', default='.', dest='wd', parser.add_argument('-C', dest='wd', action=RealPathAction,
# https://github.com/python/typeshed/issues/3107 # https://github.com/python/typeshed/issues/3107
# https://github.com/python/mypy/issues/7177 # https://github.com/python/mypy/issues/7177
type=os.path.abspath, # type: ignore type=os.path.abspath, # type: ignore
@ -1485,8 +1486,7 @@ class TestHarness:
startdir = os.getcwd() startdir = os.getcwd()
try: try:
if self.options.wd: os.chdir(self.options.wd)
os.chdir(self.options.wd)
self.build_data = build.load(os.getcwd()) self.build_data = build.load(os.getcwd())
if not self.options.setup: if not self.options.setup:
self.options.setup = self.build_data.test_setup_default_name self.options.setup = self.build_data.test_setup_default_name
@ -1656,8 +1656,7 @@ class TestHarness:
self.name_max_len = max([uniwidth(self.get_pretty_suite(test)) for test in tests]) self.name_max_len = max([uniwidth(self.get_pretty_suite(test)) for test in tests])
startdir = os.getcwd() startdir = os.getcwd()
try: try:
if self.options.wd: os.chdir(self.options.wd)
os.chdir(self.options.wd)
runners = [] # type: T.List[SingleTestRunner] runners = [] # type: T.List[SingleTestRunner]
for i in range(self.options.repeat): for i in range(self.options.repeat):
runners.extend(self.get_test_runner(test) for test in tests) runners.extend(self.get_test_runner(test) for test in tests)

@ -6896,6 +6896,18 @@ class LinuxlikeTests(BasePlatformTests):
pcfile = f.read() pcfile = f.read()
self.assertFalse('blub_blob_blib' in pcfile) self.assertFalse('blub_blob_blib' in pcfile)
def test_symlink_builddir(self):
'''
Test using a symlink as either the builddir for "setup" or
the argument for "-C".
'''
testdir = os.path.join(self.common_test_dir, '1 trivial')
os.symlink(self.builddir, self.builddir + '-symlink')
self.change_builddir(self.builddir + '-symlink')
self.init(testdir)
self.build()
self._run(self.mtest_command)
def test_vala_c_warnings(self): def test_vala_c_warnings(self):
''' '''
Test that no warnings are emitted for C code generated by Vala. This Test that no warnings are emitted for C code generated by Vala. This

Loading…
Cancel
Save