| #!/usr/bin/env python3 |
| # -*- coding: utf-8 -*- |
| # |
| # Copyright (C) 2017-2020 The Project X-Ray Authors. |
| # |
| # Use of this source code is governed by a ISC-style |
| # license that can be found in the LICENSE file or at |
| # https://opensource.org/licenses/ISC |
| # |
| # SPDX-License-Identifier: ISC |
| |
| import argparse |
| import hashlib |
| import os |
| import parse as format_parser |
| import subprocess |
| import sys |
| |
| """Module for generating the Info.md file found in the database directory.""" |
| |
| info_md_header = """ |
| # Details |
| |
| Last updated on {human_date} ({iso8601_date}). |
| |
| Created using [Project X-Ray](https://github.com/SymbiFlow/prjxray) version [{commit_hash_short}](https://github.com/SymbiFlow/prjxray/commit/{commit_hash_long}). |
| |
| Latest commit was; |
| ``` |
| {commit_latest} |
| ``` |
| |
| """ |
| |
| info_md_section = """ |
| |
| ## Database for [{part_line}]({part_line}/) |
| |
| ### Settings |
| |
| Created using following [settings/{part_line}.sh (sha256: {settings_sha256})](https://github.com/SymbiFlow/prjxray/blob/{commit_hash_long}/settings/{part_line}.sh) |
| ```shell |
| {settings_contents} |
| ``` |
| |
| ### [Results]({part_line}/) |
| |
| Results have checksums; |
| |
| """ |
| |
| info_md_file = " * [`{file_sha256} ./{file_short_path}`](./{file_short_path})\n" |
| |
| |
| def sha256(s): |
| m = hashlib.sha256() |
| m.update(s) |
| return m.hexdigest() |
| |
| |
| def sha256_file(p): |
| return sha256(open(p, 'rb').read()) |
| |
| |
| def run(c): |
| o = subprocess.check_output(c, shell=True) |
| return o.decode('utf-8').strip() |
| |
| |
| def main(argv): |
| |
| parser = argparse.ArgumentParser() |
| parser.add_argument( |
| '--keep', |
| default=False, |
| action="store_true", |
| help="""\ |
| Keep the existing commit information. |
| """) |
| args = parser.parse_args() |
| |
| info_md_filename = os.path.join('database', 'Info.md') |
| assert os.path.exists(info_md_filename), info_md_filename |
| |
| info_md = [] |
| |
| info_md.append(open('database/README.md').read()) |
| |
| v = {} |
| v['human_date'] = run('TZ=UTC date') |
| v['iso8601_date'] = run('TZ=UTC date --iso-8601=seconds') |
| if not args.keep: |
| v['commit_latest'] = run('git log -1') |
| v['commit_hash_short'] = run('git log -1 --pretty=%h') |
| v['commit_hash_long'] = run('git log -1 --pretty=%H') |
| else: |
| with open(info_md_filename) as f: |
| result = format_parser.parse( |
| '{before}' + info_md_header + '{after}', f.read()) |
| assert result |
| assert result['human_date'] |
| assert result['iso8601_date'] |
| v['commit_latest'] = result['commit_latest'] |
| v['commit_hash_short'] = result['commit_hash_short'] |
| v['commit_hash_long'] = result['commit_hash_long'] |
| |
| info_md.append(info_md_header.format(**v)) |
| |
| for part_line in sorted(os.listdir('database')): |
| if part_line.startswith('.'): |
| continue |
| part_path = os.path.join('database', part_line) |
| |
| if not os.path.isdir(part_path): |
| continue |
| |
| files = list(os.listdir(part_path)) |
| files.sort() |
| |
| settings_path = os.path.join('settings', part_line + '.sh') |
| settings_raw = open(settings_path, 'rb').read() |
| |
| w = {} |
| w['commit_hash_long'] = v['commit_hash_long'] |
| w['part_line'] = part_line |
| w['settings_contents'] = settings_raw.decode('utf-8') |
| w['settings_sha256'] = sha256(settings_raw) |
| |
| info_md.append(info_md_section.format(**w)) |
| |
| files = [] |
| for dirpath, dirnames, filenames in os.walk(part_path): |
| for f in filenames: |
| files.append(os.path.join(dirpath, f)) |
| |
| files.sort() |
| for p in files: |
| x = {} |
| x['file_real_path'] = './' + p |
| x['file_short_path'] = os.path.join( |
| part_line, os.path.relpath(p, part_path)) |
| x['file_sha256'] = sha256_file(p) |
| info_md.append(info_md_file.format(**x)) |
| |
| with open(info_md_filename, 'w') as f: |
| f.write("".join(info_md)) |
| |
| return 0 |
| |
| |
| if __name__ == "__main__": |
| sys.exit(main(sys.argv)) |