|
|
|
|
|
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() |
|
|
|