Revert "Add fs.relative_to()"

This reverts commit f52bcaa27f.

It did not pass CI, and was merged anyway because there were two CI
errors in the same cygwin job. The other error was not the fault of this
commit, and since cygwin errors were glossed over because they were
"expected", the presence of a new error *added* by this commit was
overlooked.

Per the meson development policy, PRs which result in CI errors
can/should be reverted at will, no questions asked.
pull/12134/head
Eli Schwartz 2 years ago
parent 1fd70a2a00
commit 84c8905d52
No known key found for this signature in database
GPG Key ID: CEB167EFB5722BD6
  1. 14
      docs/markdown/Fs-module.md
  2. 17
      docs/markdown/snippets/fs_relative_to.md
  3. 29
      mesonbuild/modules/fs.py
  4. 25
      test cases/common/220 fs module/meson.build
  5. 5
      test cases/common/220 fs module/subdir/btgt.c
  6. 34
      test cases/common/220 fs module/subdir/meson.build

@ -224,20 +224,6 @@ fs.stem('foo/bar/baz.dll.a') # baz.dll
project. If the file specified by `path` is a `files()` object it
cannot refer to a built file.
### relative_to
*Since 1.3.0*
Return a relative filepath. In the event a relative path could not be found, the
absolute path of `to` is returned. Relative path arguments will be assumed to be
relative to `meson.current_source_dir()`.
Has the following positional arguments:
- to `str | file | custom_tgt | custom_idx | tgt`: end path
- from `str | file | custom_tgt | custom_idx | tgt`: start path
returns:
- a string
### copyfile

@ -1,17 +0,0 @@
## `fs.relative_to()`
The `fs` module now has a `relative_to` method. The method will return the
relative path from argument one to argument two, if one exists. Otherwise, the
absolute path to argument one is returned.
```meson
assert(fs.relative_to('c:\\prefix\\lib', 'c:\\prefix\\bin') == '..\\lib')
assert(fs.relative_to('c:\\proj1\\foo', 'd:\\proj1\\bar') == 'c:\\proj1\\foo')
assert(fs.relative_to('prefix\\lib\\foo', 'prefix') == 'lib\\foo')
assert(fs.relative_to('/prefix/lib', '/prefix/bin') == '../lib')
assert(fs.relative_to('prefix/lib/foo', 'prefix') == 'lib/foo')
```
In addition to strings, it can handle files, custom targets, custom target
indices, and build targets.

@ -20,16 +20,19 @@ import typing as T
from . import ExtensionModule, ModuleReturnValue, ModuleInfo
from .. import mlog
from ..build import BuildTarget, CustomTarget, CustomTargetIndex, InvalidArguments
from ..build import CustomTarget, InvalidArguments
from ..interpreter.type_checking import INSTALL_KW, INSTALL_MODE_KW, INSTALL_TAG_KW, NoneType
from ..interpreterbase import FeatureNew, KwargInfo, typed_kwargs, typed_pos_args, noKwargs
from ..mesonlib import File, MesonException, has_path_sep, path_is_in_root, relpath
from ..mesonlib import (
File,
MesonException,
has_path_sep,
path_is_in_root,
)
if T.TYPE_CHECKING:
from . import ModuleState
from ..build import BuildTargetTypes
from ..interpreter import Interpreter
from ..interpreterbase import TYPE_kwargs
from ..mesonlib import FileOrString, FileMode
from typing_extensions import TypedDict
@ -72,7 +75,6 @@ class FSModule(ExtensionModule):
'stem': self.stem,
'read': self.read,
'copyfile': self.copyfile,
'relative_to': self.relative_to,
})
def _absolute_dir(self, state: 'ModuleState', arg: 'FileOrString') -> Path:
@ -310,23 +312,6 @@ class FSModule(ExtensionModule):
return ModuleReturnValue(ct, [ct])
@FeatureNew('fs.relative_to', '1.3.0')
@typed_pos_args('fs.relative_to', (str, File, CustomTarget, CustomTargetIndex, BuildTarget), (str, File, CustomTarget, CustomTargetIndex, BuildTarget))
@noKwargs
def relative_to(self, state: ModuleState, args: T.Tuple[T.Union[FileOrString, BuildTargetTypes], T.Union[FileOrString, BuildTargetTypes]], kwargs: TYPE_kwargs) -> str:
def to_path(arg: T.Union[FileOrString, CustomTarget, CustomTargetIndex, BuildTarget]) -> str:
if isinstance(arg, File):
return arg.absolute_path(state.environment.source_dir, state.environment.build_dir)
elif isinstance(arg, (CustomTarget, CustomTargetIndex, BuildTarget)):
return state.backend.get_target_filename_abs(arg)
else:
return os.path.join(state.environment.source_dir, state.subdir, arg)
t = to_path(args[0])
f = to_path(args[1])
return relpath(t, f)
def initialize(*args: T.Any, **kwargs: T.Any) -> FSModule:
return FSModule(*args, **kwargs)

@ -1,4 +1,4 @@
project('fs module test', 'c')
project('fs module test')
is_windows = build_machine.system() == 'windows'
@ -139,29 +139,6 @@ assert(fs.name('foo/bar/baz.dll.a') == 'baz.dll.a', 'failed to get basename with
assert(fs.stem('foo/bar/baz.dll') == 'baz', 'failed to get stem with suffix')
assert(fs.stem('foo/bar/baz.dll.a') == 'baz.dll', 'failed to get stem with compound suffix')
# relative_to
if build_machine.system() == 'windows'
# strings
assert(fs.relative_to('c:\\prefix\\lib\\foo', 'c:\\prefix') == 'lib\\foo')
assert(fs.relative_to('c:\\prefix\\lib', 'c:\\prefix\\bin') == '..\\lib')
assert(fs.relative_to('c:\\proj1\\foo', 'd:\\proj1\\bar') == 'c:\\proj1\\foo')
assert(fs.relative_to('prefix\\lib\\foo', 'prefix') == 'lib\\foo')
assert(fs.relative_to('prefix\\lib', 'prefix\\bin') == '..\\lib')
assert(fs.relative_to('proj1\\foo', 'proj1\\bar') == '..\\foo')
assert(fs.relative_to('subdir/subdirfile.txt', meson.current_source_dir()) == 'subdir\\subdirfile.txt')
assert(fs.relative_to(files('meson.build'), files('subdir/meson.build')) == '..\\..\\meson.build')
assert(fs.relative_to(files('meson.build'), 'subdir/meson.build') == '..\\..\\meson.build')
else
# strings
assert(fs.relative_to('/prefix/lib/foo', '/prefix') == 'lib/foo')
assert(fs.relative_to('/prefix/lib', '/prefix/bin') == '../lib')
assert(fs.relative_to('prefix/lib/foo', 'prefix') == 'lib/foo')
assert(fs.relative_to('prefix/lib', 'prefix/bin') == '../lib')
assert(fs.relative_to('subdir/subdirfile.txt', meson.current_source_dir()) == 'subdir/subdirfile.txt')
assert(fs.relative_to(files('meson.build'), files('subdir/meson.build')) == '../../meson.build')
assert(fs.relative_to(files('meson.build'), 'subdir/meson.build') == '../../meson.build')
endif
subdir('subdir')
subproject('subbie')

@ -1,5 +0,0 @@
int
main(void)
{
return 0;
}

@ -4,37 +4,3 @@ assert(fs.is_samepath(meson.project_source_root(), '..'), 'is_samepath not detec
assert(fs.is_samepath(meson.project_build_root(), meson.current_build_dir() / '..'), 'is_samepath not detecting same directory')
assert(fs.is_samepath(subdirfiles[0], 'subdirfile.txt'), 'is_samepath not detecting same directory when using File and str')
# More relative_to to test subdir/builddir components
build_to_src = fs.relative_to(meson.current_source_dir(), meson.current_build_dir())
src_to_build = fs.relative_to(meson.current_build_dir(), meson.current_source_dir())
btgt = executable('btgt', 'btgt.c')
ctgt = fs.copyfile('subdirfile.txt')
if build_machine.system() == 'windows'
# Test that CustomTarget works
assert(fs.relative_to('subdirfile.txt', ctgt) == '..\\@0@\\subdirfile.txt'.format(build_to_src))
assert(fs.relative_to(ctgt, 'subdirfile.txt') == '..\\@0@\\subdirfile.txt'.format(src_to_build))
# Test that CustomTargetIndex works
assert(fs.relative_to('subdirfile.txt', ctgt[0]) == '..\\@0@\\subdirfile.txt'.format(build_to_src))
assert(fs.relative_to(ctgt[0], 'subdirfile.txt') == '..\\@0@\\subdirfile.txt'.format(src_to_build))
# Test that BuildTarget works
assert(fs.relative_to('subdirfile.txt', btgt) == '..\\@0@\\subdirfile.txt'.format(build_to_src))
assert(fs.relative_to(btgt, 'subdirfile.txt') == '..\\@0@\\btgt.exe'.format(src_to_build))
else
# Test that CustomTarget works
assert(fs.relative_to('subdirfile.txt', ctgt) == '../@0@/subdirfile.txt'.format(build_to_src))
assert(fs.relative_to(ctgt, 'subdirfile.txt') == '../@0@/subdirfile.txt'.format(src_to_build))
# Test that CustomTargetIndex works
assert(fs.relative_to('subdirfile.txt', ctgt[0]) == '../@0@/subdirfile.txt'.format(build_to_src))
assert(fs.relative_to(ctgt[0], 'subdirfile.txt') == '../@0@/subdirfile.txt'.format(src_to_build))
# Test that BuildTarget works
assert(fs.relative_to('subdirfile.txt', btgt) == '../@0@/subdirfile.txt'.format(build_to_src))
if host_machine.system() == 'windows'
assert(fs.relative_to(btgt, 'subdirfile.txt') == '../@0@/btgt.exe'.format(src_to_build))
else
assert(fs.relative_to(btgt, 'subdirfile.txt') == '../@0@/btgt'.format(src_to_build))
endif
endif

Loading…
Cancel
Save