aboutsummaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authorDaniel Mensinger <daniel@mensinger-ka.de>2020-07-16 20:29:34 +0200
committerDaniel Mensinger <daniel@mensinger-ka.de>2020-07-16 21:03:18 +0200
commit019ed04331695bb6f5c5fff70dfced34c4ba9012 (patch)
tree144d85bd7b209e5e45f92a680866f30cdc2e5e96 /tools
parent2353d67c25629da049b192d7fddb3e7851edb8df (diff)
downloadmeson-019ed04331695bb6f5c5fff70dfced34c4ba9012.zip
meson-019ed04331695bb6f5c5fff70dfced34c4ba9012.tar.gz
meson-019ed04331695bb6f5c5fff70dfced34c4ba9012.tar.bz2
mdata: Generate mesondata.py from */data folders
Diffstat (limited to 'tools')
-rwxr-xr-xtools/gen_data.py139
1 files changed, 139 insertions, 0 deletions
diff --git a/tools/gen_data.py b/tools/gen_data.py
new file mode 100755
index 0000000..2cc05a4
--- /dev/null
+++ b/tools/gen_data.py
@@ -0,0 +1,139 @@
+#!/usr/bin/env python3
+
+# Copyright 2020 Daniel Mensinger
+
+# 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 sys
+import hashlib
+import textwrap
+import re
+from pathlib import Path
+from datetime import datetime
+import typing as T
+
+class DataFile:
+ file_counter = 0
+
+ def __init__(self, path: Path, root: Path):
+ self.path = path
+ self.id = self.path.relative_to(root)
+ self.data_str = f'file_{DataFile.file_counter}_data_' + re.sub('[^a-zA-Z0-9]', '_', self.path.name)
+ DataFile.file_counter += 1
+
+ b = self.path.read_bytes()
+ self.data = b.decode()
+ self.sha256sum = hashlib.sha256(b).hexdigest()
+
+ def __repr__(self) -> str:
+ return f'<{type(self).__name__}: [{self.sha256sum}] {self.id}>'
+
+def main() -> int:
+ root_dir = Path(__file__).resolve().parents[1]
+ mesonbuild_dir = root_dir / 'mesonbuild'
+ out_file = mesonbuild_dir / 'mesondata.py'
+
+ data_dirs = mesonbuild_dir.glob('**/data')
+
+ data_files: T.List[DataFile] = []
+
+ for d in data_dirs:
+ for p in d.iterdir():
+ data_files += [DataFile(p, mesonbuild_dir)]
+
+ print(f'Found {len(data_files)} data files')
+
+ # Generate the data script
+ data = ''
+
+ data += textwrap.dedent(f'''\
+ # Copyright {datetime.today().year} 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.
+
+
+ ####
+ #### WARNING: This is an automatically generated file! Do not edit!
+ #### Generated by {Path(__file__).resolve().relative_to(root_dir)}
+ ####
+
+
+ from pathlib import Path
+ import typing as T
+
+ if T.TYPE_CHECKING:
+ from .environment import Environment
+
+ ######################
+ # BEGIN Data section #
+ ######################
+
+ ''')
+
+ for i in data_files:
+ data += f"{i.data_str} = '''\\\n{i.data}'''\n\n"
+
+ data += textwrap.dedent(f'''
+ ####################
+ # END Data section #
+ ####################
+
+ class DataFile:
+ def __init__(self, path: Path, sha256sum: str, data: str) -> None:
+ self.path = path
+ self.sha256sum = sha256sum
+ self.data = data
+
+ def write_once(self, path: Path) -> None:
+ if not path.exists():
+ path.write_text(self.data)
+
+ def write_to_private(self, env: 'Environment') -> Path:
+ out_file = Path(env.scratch_dir) / 'data' / self.path.name
+ out_file.parent.mkdir(exist_ok=True)
+ self.write_once(out_file)
+ return out_file
+
+
+ mesondata = {{
+ ''')
+
+ for i in data_files:
+ data += textwrap.indent(textwrap.dedent(f"""\
+ '{i.id}': DataFile(
+ Path('{i.id}'),
+ '{i.sha256sum}',
+ {i.data_str},
+ ),
+ """), ' ')
+
+ data += textwrap.dedent('''\
+ }
+ ''')
+
+ print(f'Updating {out_file}')
+ out_file.write_text(data)
+ return 0
+
+if __name__ == '__main__':
+ sys.exit(main())