rclone-api 1.1.2__tar.gz → 1.1.3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {rclone_api-1.1.2 → rclone_api-1.1.3}/PKG-INFO +1 -1
- {rclone_api-1.1.2 → rclone_api-1.1.3}/pyproject.toml +1 -1
- {rclone_api-1.1.2 → rclone_api-1.1.3}/src/rclone_api/s3/chunk_uploader.py +27 -1
- {rclone_api-1.1.2 → rclone_api-1.1.3}/src/rclone_api.egg-info/PKG-INFO +1 -1
- {rclone_api-1.1.2 → rclone_api-1.1.3}/.aiderignore +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.3}/.github/workflows/lint.yml +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.3}/.github/workflows/push_macos.yml +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.3}/.github/workflows/push_ubuntu.yml +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.3}/.github/workflows/push_win.yml +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.3}/.gitignore +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.3}/.pylintrc +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.3}/.vscode/launch.json +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.3}/.vscode/settings.json +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.3}/.vscode/tasks.json +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.3}/LICENSE +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.3}/MANIFEST.in +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.3}/README.md +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.3}/clean +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.3}/install +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.3}/lint +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.3}/requirements.testing.txt +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.3}/setup.cfg +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.3}/setup.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.3}/src/rclone_api/__init__.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.3}/src/rclone_api/assets/example.txt +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.3}/src/rclone_api/cli.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.3}/src/rclone_api/cmd/copy_large_s3.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.3}/src/rclone_api/cmd/list_files.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.3}/src/rclone_api/completed_process.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.3}/src/rclone_api/config.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.3}/src/rclone_api/convert.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.3}/src/rclone_api/deprecated.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.3}/src/rclone_api/diff.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.3}/src/rclone_api/dir.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.3}/src/rclone_api/dir_listing.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.3}/src/rclone_api/exec.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.3}/src/rclone_api/experimental/flags.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.3}/src/rclone_api/experimental/flags_base.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.3}/src/rclone_api/file.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.3}/src/rclone_api/filelist.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.3}/src/rclone_api/group_files.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.3}/src/rclone_api/process.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.3}/src/rclone_api/rclone.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.3}/src/rclone_api/remote.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.3}/src/rclone_api/rpath.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.3}/src/rclone_api/s3/api.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.3}/src/rclone_api/s3/basic_ops.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.3}/src/rclone_api/s3/create.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.3}/src/rclone_api/s3/types.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.3}/src/rclone_api/scan_missing_folders.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.3}/src/rclone_api/types.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.3}/src/rclone_api/util.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.3}/src/rclone_api/walk.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.3}/src/rclone_api.egg-info/SOURCES.txt +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.3}/src/rclone_api.egg-info/dependency_links.txt +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.3}/src/rclone_api.egg-info/entry_points.txt +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.3}/src/rclone_api.egg-info/requires.txt +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.3}/src/rclone_api.egg-info/top_level.txt +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.3}/test +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.3}/tests/archive/test_paramiko.py.disabled +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.3}/tests/test_cmd_list_files.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.3}/tests/test_copy.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.3}/tests/test_copy_files.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.3}/tests/test_diff.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.3}/tests/test_group_files.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.3}/tests/test_is_synced.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.3}/tests/test_ls.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.3}/tests/test_mount.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.3}/tests/test_mount_s3.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.3}/tests/test_mount_webdav.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.3}/tests/test_mounted_ranged_download.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.3}/tests/test_obscure.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.3}/tests/test_rclone_config.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.3}/tests/test_remote_control.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.3}/tests/test_remotes.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.3}/tests/test_s3.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.3}/tests/test_scan_missing_folders.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.3}/tests/test_size_files.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.3}/tests/test_walk.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.3}/tox.ini +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.3}/upload_package.sh +0 -0
|
@@ -127,6 +127,13 @@ class UploadState:
|
|
|
127
127
|
lock: Lock = Lock()
|
|
128
128
|
parts: list[FinishedPiece | None] = field(default_factory=list)
|
|
129
129
|
|
|
130
|
+
def update_source_file(self, src_file: Path) -> None:
|
|
131
|
+
new_file_size = os.path.getsize(src_file)
|
|
132
|
+
if new_file_size != self.upload_info.file_size:
|
|
133
|
+
raise ValueError("File size changed, cannot resume")
|
|
134
|
+
self.upload_info.src_file_path = src_file
|
|
135
|
+
self.save()
|
|
136
|
+
|
|
130
137
|
def is_done(self) -> bool:
|
|
131
138
|
return self.remaining() == 0
|
|
132
139
|
|
|
@@ -268,6 +275,7 @@ def _get_file_size(file_path: Path, timeout: int = 60) -> int:
|
|
|
268
275
|
while True:
|
|
269
276
|
expired = time.time() - start > timeout
|
|
270
277
|
try:
|
|
278
|
+
time.sleep(sleep_time)
|
|
271
279
|
if not_windows:
|
|
272
280
|
# Force a refresh of the directory cache
|
|
273
281
|
os.system(f"ls -l {file_path.parent}")
|
|
@@ -279,7 +287,6 @@ def _get_file_size(file_path: Path, timeout: int = 60) -> int:
|
|
|
279
287
|
raise
|
|
280
288
|
if expired:
|
|
281
289
|
raise TimeoutError(f"File {file_path} not found after {timeout} seconds")
|
|
282
|
-
time.sleep(sleep_time)
|
|
283
290
|
|
|
284
291
|
|
|
285
292
|
def file_chunker(
|
|
@@ -433,6 +440,18 @@ def prepare_upload_file_multipart(
|
|
|
433
440
|
return upload_info
|
|
434
441
|
|
|
435
442
|
|
|
443
|
+
def _abort_previous_upload(upload_state: UploadState) -> None:
|
|
444
|
+
if upload_state.upload_info.upload_id:
|
|
445
|
+
try:
|
|
446
|
+
upload_state.upload_info.s3_client.abort_multipart_upload(
|
|
447
|
+
Bucket=upload_state.upload_info.bucket_name,
|
|
448
|
+
Key=upload_state.upload_info.object_name,
|
|
449
|
+
UploadId=upload_state.upload_info.upload_id,
|
|
450
|
+
)
|
|
451
|
+
except Exception as e:
|
|
452
|
+
locked_print(f"Error aborting previous upload: {e}")
|
|
453
|
+
|
|
454
|
+
|
|
436
455
|
def upload_file_multipart(
|
|
437
456
|
s3_client: BaseClient,
|
|
438
457
|
bucket_name: str,
|
|
@@ -488,6 +507,13 @@ def upload_file_multipart(
|
|
|
488
507
|
|
|
489
508
|
filechunks: Queue[FileChunk | None] = Queue(10)
|
|
490
509
|
upload_state = get_upload_state() or make_new_state()
|
|
510
|
+
try:
|
|
511
|
+
upload_state.update_source_file(file_path)
|
|
512
|
+
except ValueError as e:
|
|
513
|
+
locked_print(f"Cannot resume upload: {e}, size changed, starting over")
|
|
514
|
+
_abort_previous_upload(upload_state)
|
|
515
|
+
upload_state = make_new_state()
|
|
516
|
+
upload_state.save()
|
|
491
517
|
if upload_state.is_done():
|
|
492
518
|
return MultiUploadResult.ALREADY_DONE
|
|
493
519
|
finished = upload_state.finished()
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|