diff --git a/mdrsclient/commands/upload.py b/mdrsclient/commands/upload.py index cc683b2..fbc7c82 100644 --- a/mdrsclient/commands/upload.py +++ b/mdrsclient/commands/upload.py @@ -26,6 +26,12 @@ class UploadCommand(BaseCommand): upload_parser.add_argument( "-r", "--recursive", help="upload directories and their contents recursive", action="store_true" ) + upload_parser.add_argument( + "-s", + "--skip-if-exists", + help="skip the upload if file is already uploaded and file size is the same", + action="store_true", + ) upload_parser.add_argument("local_path", help="local file path (/foo/bar/data.txt)") upload_parser.add_argument("remote_path", help="remote folder path (remote:/lab/path/)") upload_parser.set_defaults(func=cls.func) @@ -35,10 +41,11 @@ class UploadCommand(BaseCommand): local_path = str(args.local_path) remote_path = str(args.remote_path) is_recursive = bool(args.recursive) - cls.upload(local_path, remote_path, is_recursive) + is_skip_if_exists = bool(args.skip_if_exists) + cls.upload(local_path, remote_path, is_recursive, is_skip_if_exists) @classmethod - def upload(cls, local_path: str, remote_path: str, is_recursive: bool) -> None: + def upload(cls, local_path: str, remote_path: str, is_recursive: bool, is_skip_if_exists: bool) -> None: (remote, laboratory_name, r_path) = cls._parse_remote_host_with_path(remote_path) l_path = os.path.abspath(local_path) if not os.path.exists(l_path): @@ -78,22 +85,24 @@ class UploadCommand(BaseCommand): infos.append(UploadFileInfo(folder_map[d_dirname], os.path.join(dirpath, filename))) else: infos.append(UploadFileInfo(folder, l_path)) - cls.__multiple_upload(connection, infos) + cls.__multiple_upload(connection, infos, is_skip_if_exists) @classmethod - def __multiple_upload(cls, connection: MDRSConnection, infos: list[UploadFileInfo]) -> None: + def __multiple_upload( + cls, connection: MDRSConnection, infos: list[UploadFileInfo], is_skip_if_exists: bool + ) -> None: file_api = FilesApi(connection) with ThreadPoolExecutor(max_workers=CONCURRENT) as pool: - pool.map(lambda x: cls.__multiple_upload_worker(file_api, x), infos) + pool.map(lambda x: cls.__multiple_upload_worker(file_api, x, is_skip_if_exists), infos) @classmethod - def __multiple_upload_worker(cls, file_api: FilesApi, info: UploadFileInfo) -> None: + def __multiple_upload_worker(cls, file_api: FilesApi, info: UploadFileInfo, is_skip_if_exists: bool) -> None: basename = os.path.basename(info.path) file = info.folder.find_file(basename) try: if file is None: file_api.create(info.folder.id, info.path) - else: + elif not is_skip_if_exists or file.size != os.path.getsize(info.path): file_api.update(file, info.path) print(os.path.join(info.folder.path, basename)) except MDRSException as e: