Skip to content

Commit

Permalink
Created the filesystem module.
Browse files Browse the repository at this point in the history
  • Loading branch information
jpakkane committed Nov 7, 2019
1 parent 48a7190 commit 46788d1
Show file tree
Hide file tree
Showing 14 changed files with 156 additions and 1 deletion.
31 changes: 31 additions & 0 deletions docs/markdown/Fs-module.md
Original file line number Diff line number Diff line change
@@ -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.
10 changes: 10 additions & 0 deletions docs/markdown/snippets/fsmodule.md
Original file line number Diff line number Diff line change
@@ -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.')
```
1 change: 1 addition & 0 deletions docs/sitemap.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
3 changes: 2 additions & 1 deletion mesonbuild/interpreter.py
Original file line number Diff line number Diff line change
Expand Up @@ -1689,7 +1689,7 @@ def get_argument_syntax_method(self, args, kwargs):


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'])
Expand All @@ -1714,6 +1714,7 @@ def method_call(self, method_name, args, kwargs):
# 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,
Expand Down
17 changes: 17 additions & 0 deletions mesonbuild/modules/__init__.py
Original file line number Diff line number Diff line change
@@ -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
Expand Down
59 changes: 59 additions & 0 deletions mesonbuild/modules/fs.py
Original file line number Diff line number Diff line change
@@ -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)
1 change: 1 addition & 0 deletions test cases/common/227 fs module/a_symlink
21 changes: 21 additions & 0 deletions test cases/common/227 fs module/meson.build
Original file line number Diff line number Diff line change
@@ -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')
1 change: 1 addition & 0 deletions test cases/common/227 fs module/subdir/meson.build
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
assert(fs.exists('subdirfile.txt'), 'Subdir file lookup is broken.')
1 change: 1 addition & 0 deletions test cases/common/227 fs module/subdir/subdirfile.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
I have no content.
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
project('subbie')

fs = import('fs')

assert(fs.exists('subprojectfile.txt'), 'Subproject root file not found.')

subdir('subsub')

subproject('subbie')
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
I'm not empty. So there's at least that.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
assert(fs.exists('subsubfile.txt'), 'Subproject subdir lookup failed.')
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Thank you for looking inside me.

0 comments on commit 46788d1

Please sign in to comment.