| |
| import argparse |
| import filecmp |
| import os |
|
|
| from mmengine.logging import MMLogger |
|
|
|
|
| def get_files(folder, extensions, ignore_folder=[]): |
| """Get all file paths in the folder with specified extensions.""" |
| files = [] |
| for root, dirs, files_in_dir in os.walk(folder): |
| for file in files_in_dir: |
| if any(file.endswith(ext) for ext in extensions): |
| files.append(os.path.relpath(os.path.join(root, file), folder)) |
| ignore_folders = [] |
| for folder in ignore_folder: |
| ignore_folders.append(os.path.relpath(folder)) |
| |
| ignore_files = [] |
| for file in files: |
| for folder in ignore_folders: |
| if file.startswith(folder): |
| ignore_files.append(file) |
| |
| keep_files = [] |
| for file in files: |
| if file not in ignore_files: |
| keep_files.append(file) |
|
|
| return keep_files |
|
|
|
|
| def compare_folders(folder1, folder2, extensions, ignore_folder): |
| """Compare files with specified extensions in two folders.""" |
| logger = MMLogger.get_current_instance() |
| files1 = set(get_files(folder1, extensions, ignore_folder)) |
| files2 = set(get_files(folder2, extensions)) |
|
|
| |
| only_in_folder1 = files1 - files2 |
| only_in_folder2 = files2 - files1 |
| common_files = files1 & files2 |
|
|
| if only_in_folder1: |
| message = f'Only in {folder1}: {only_in_folder1}, '\ |
| 'please copy files into {folder2}' |
| raise ValueError(message) |
| if only_in_folder2: |
| print(f'Only in {folder2}: {only_in_folder2}') |
|
|
| |
| for file in common_files: |
| file1 = os.path.join(folder1, file) |
| file2 = os.path.join(folder2, file) |
| if not filecmp.cmp(file1, file2, shallow=False): |
| logger.warning(f'Files differ: {file1} and {file2}') |
| raise ValueError(f'Files differ: {file1} and {file2}') |
| else: |
| pass |
| |
|
|
|
|
| def main(): |
| parser = argparse.ArgumentParser( |
| description='Compare specified files in two folders') |
| parser.add_argument('folder1', help='Path to the first folder') |
| parser.add_argument('folder2', help='Path to the second folder') |
| parser.add_argument( |
| '--extensions', |
| nargs='+', |
| default=['.py', '.json', '.md', '.yml', '.txt'], |
| help='File extensions to compare (default: .py .json .md .yml .txt)') |
| parser.add_argument('--ignore', |
| nargs='+', |
| default=[], |
| help='Folder of ignored case') |
| args = parser.parse_args() |
|
|
| compare_folders(args.folder1, args.folder2, args.extensions, args.ignore) |
|
|
|
|
| if __name__ == '__main__': |
| main() |
|
|