Created the filesystem module.

pull/6155/head
Jussi Pakkanen 5 years ago
parent 48a719033e
commit 46788d1b5b
  1. 31
      docs/markdown/Fs-module.md
  2. 10
      docs/markdown/snippets/fsmodule.md
  3. 1
      docs/sitemap.txt
  4. 3
      mesonbuild/interpreter.py
  5. 17
      mesonbuild/modules/__init__.py
  6. 59
      mesonbuild/modules/fs.py
  7. 1
      test cases/common/227 fs module/a_symlink
  8. 21
      test cases/common/227 fs module/meson.build
  9. 1
      test cases/common/227 fs module/subdir/meson.build
  10. 1
      test cases/common/227 fs module/subdir/subdirfile.txt
  11. 9
      test cases/common/227 fs module/subprojects/subbie/meson.build
  12. 1
      test cases/common/227 fs module/subprojects/subbie/subprojectfile.txt
  13. 1
      test cases/common/227 fs module/subprojects/subbie/subsub/meson.build
  14. 1
      test cases/common/227 fs module/subprojects/subbie/subsub/subsubfile.txt

@ -0,0 +1,31 @@
# FS (filesystem) module
This module provides functions to inspect the file system. It is
available starting with version 0.53.0.
## File lookup rules
Non-absolute paths are looked up relative to the directory where the
current `meson.build` file is.
### exists
Takes a single string argument and returns true if an entity with that
name exists on the file system. This can be a file, directory or a
special entry such as a device node.
### is_dir
Takes a single string argument and returns true if a directory with
that name exists on the file system. This method follows symbolic
links.
### is_file
Takes a single string argument and returns true if an file with that
name exists on the file system. This method follows symbolic links.
### is_symlink
Takes a single string argument and returns true if the path pointed to
by the string is a symbolic link.

@ -0,0 +1,10 @@
## A new module for filesystem operations
The new `fs` module can be used to examine the contents of the current
file system.
```meson
fs = import('fs')
assert(fs.exists('important_file'),
'The important file is missing.')
```

@ -32,6 +32,7 @@ index.md
Modules.md
CMake-module.md
Dlang-module.md
Fs-module.md
Gnome-module.md
Hotdoc-module.md
i18n-module.md

@ -1689,7 +1689,7 @@ class CompilerHolder(InterpreterObject):
ModuleState = namedtuple('ModuleState', [
'build_to_src', 'subproject', 'subdir', 'current_lineno', 'environment',
'source_root', 'build_to_src', 'subproject', 'subdir', 'current_lineno', 'environment',
'project_name', 'project_version', 'backend', 'targets',
'data', 'headers', 'man', 'global_args', 'project_args', 'build_machine',
'host_machine', 'target_machine', 'current_node'])
@ -1714,6 +1714,7 @@ class ModuleHolder(InterpreterObject, ObjectHolder):
# because the Build object contains dicts and lists.
num_targets = len(self.interpreter.build.targets)
state = ModuleState(
source_root = self.interpreter.environment.get_source_dir(),
build_to_src=mesonlib.relpath(self.interpreter.environment.get_source_dir(),
self.interpreter.environment.get_build_dir()),
subproject=self.interpreter.subproject,

@ -1,3 +1,20 @@
# Copyright 2019 The Meson development team
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
# http://www.apache.org/licenses/LICENSE-2.0
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# This file contains the detection logic for external dependencies that
# are UI-related.
import os
from .. import build

@ -0,0 +1,59 @@
# Copyright 2019 The Meson development team
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
# http://www.apache.org/licenses/LICENSE-2.0
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import os
from . import ExtensionModule
from . import ModuleReturnValue
from ..mesonlib import MesonException
from ..interpreterbase import stringArgs, noKwargs
class FSModule(ExtensionModule):
def __init__(self, interpreter):
super().__init__(interpreter)
self.snippets.add('generate_dub_file')
@stringArgs
@noKwargs
def exists(self, state, args, kwargs):
if len(args) != 1:
MesonException('method takes exactly one argument.')
test_file = os.path.join(state.source_root, state.subdir, args[0])
return ModuleReturnValue(os.path.exists(test_file), [])
def _check(self, check_fun, state, args):
if len(args) != 1:
MesonException('method takes exactly one argument.')
test_file = os.path.join(state.source_root, state.subdir, args[0])
return ModuleReturnValue(check_fun(test_file), [])
@stringArgs
@noKwargs
def is_symlink(self, state, args, kwargs):
return self._check(os.path.islink, state, args)
@stringArgs
@noKwargs
def is_file(self, state, args, kwargs):
return self._check(os.path.isfile, state, args)
@stringArgs
@noKwargs
def is_dir(self, state, args, kwargs):
return self._check(os.path.isdir, state, args)
def initialize(*args, **kwargs):
return FSModule(*args, **kwargs)

@ -0,0 +1,21 @@
project('fs module test')
fs = import('fs')
assert(fs.exists('meson.build'), 'Existing file reported as missing.')
assert(not fs.exists('nonexisting'), 'Nonexisting file was found.')
if build_machine.system() != 'windows' and build_machine.system() != 'cygwin'
assert(fs.is_symlink('a_symlink'), 'Symlink not detected.')
assert(not fs.is_symlink('meson.build'), 'Regular file detected as symlink.')
endif
assert(fs.is_file('meson.build'), 'File not detected as a file.')
assert(not fs.is_file('subprojects'), 'Directory detected as a file.')
assert(not fs.is_file('nonexisting'), 'Bad path detected as a file.')
assert(fs.is_dir('subprojects'), 'Dir not detected correctly.')
assert(not fs.is_dir('meson.build'), 'File detected as a dir.')
assert(not fs.is_dir('nonexisting'), 'Bad path detected as a dir.')
subdir('subdir')

@ -0,0 +1 @@
assert(fs.exists('subdirfile.txt'), 'Subdir file lookup is broken.')

@ -0,0 +1,9 @@
project('subbie')
fs = import('fs')
assert(fs.exists('subprojectfile.txt'), 'Subproject root file not found.')
subdir('subsub')
subproject('subbie')

@ -0,0 +1 @@
assert(fs.exists('subsubfile.txt'), 'Subproject subdir lookup failed.')
Loading…
Cancel
Save