| # SPDX-FileCopyrightText: 2020 Efabless Corporation |
| # |
| # 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. |
| # SPDX-License-Identifier: Apache-2.0 |
| |
| import argparse |
| import csv |
| import logging |
| from pathlib import Path |
| |
| import requests |
| |
| try: |
| from checks.utils.utils import file_hash |
| except ImportError: |
| from utils.utils import file_hash |
| |
| |
| def check_manifest(input_directory, manifest_check_log, manifest_git_url): |
| result = True |
| mismatches = [] |
| if input_directory.exists(): |
| hashes = requests.get(manifest_git_url).text |
| hashes_filepaths_pairs = csv.reader(hashes.split('\n'), delimiter=' ', skipinitialspace=True) |
| with open(manifest_check_log, 'w') as f: |
| for row in hashes_filepaths_pairs: |
| if len(row): |
| hash_of_file, file_path = row |
| file_path = input_directory / file_path |
| try: |
| if hash_of_file != file_hash(file_path): |
| f.write(f"{file_path}: FAILED\n") |
| mismatches.append(str(file_path)) |
| result = False |
| else: |
| f.write(f"{file_path}: OK\n") |
| except FileNotFoundError: |
| logging.error(f"Manifest file {file_path.name} was not found in path: {file_path}") |
| f.write(f"{file_path}: NOT FOUND\n") |
| mismatches.append(str(file_path)) |
| result = False |
| else: |
| logging.warning(f"Manifest path ({input_directory}) was not found") |
| result = False |
| |
| if result: |
| logging.info(f"Caravel version matches, for the full report check: {manifest_check_log}") |
| else: |
| logging.warning(f"Caravel version mismatched, found {len(mismatches)} mismatches, for the full report check: {manifest_check_log}") |
| return result |
| |
| |
| def main(*args, **kwargs): |
| path = kwargs['input_directory'] |
| output_directory = kwargs['output_directory'] / 'logs' / 'manifest_check.log' |
| manifest_git_url = f"https://raw.githubusercontent.com/efabless/caravel/{kwargs['manifest_source']}/manifest" |
| |
| return check_manifest(path, output_directory, manifest_git_url) |
| |
| |
| if __name__ == '__main__': |
| logging.basicConfig(level=logging.DEBUG, format=f"%(asctime)s | %(levelname)-7s | %(message)s", datefmt='%d-%b-%Y %H:%M:%S') |
| parser = argparse.ArgumentParser(description='Runs a manifest check on a given directory.') |
| parser.add_argument('--input_directory', '-i', required=True, help='Input Directory') |
| parser.add_argument('--output_directory', '-o', required=True, help='Output Directory') |
| args = parser.parse_args() |
| if main(input_directory=Path(args.input_directory), output_directory=Path(args.output_directory), manifest_source='master'): |
| logging.info("Manifest Clean") |
| else: |
| logging.warning("Manifest Dirty") |