rclone-api 1.1.2__tar.gz → 1.1.4__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.4}/PKG-INFO +1 -1
- {rclone_api-1.1.2 → rclone_api-1.1.4}/pyproject.toml +1 -1
- {rclone_api-1.1.2 → rclone_api-1.1.4}/src/rclone_api/s3/chunk_uploader.py +27 -5
- {rclone_api-1.1.2 → rclone_api-1.1.4}/src/rclone_api.egg-info/PKG-INFO +1 -1
- {rclone_api-1.1.2 → rclone_api-1.1.4}/.aiderignore +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.4}/.github/workflows/lint.yml +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.4}/.github/workflows/push_macos.yml +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.4}/.github/workflows/push_ubuntu.yml +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.4}/.github/workflows/push_win.yml +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.4}/.gitignore +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.4}/.pylintrc +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.4}/.vscode/launch.json +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.4}/.vscode/settings.json +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.4}/.vscode/tasks.json +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.4}/LICENSE +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.4}/MANIFEST.in +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.4}/README.md +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.4}/clean +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.4}/install +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.4}/lint +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.4}/requirements.testing.txt +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.4}/setup.cfg +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.4}/setup.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.4}/src/rclone_api/__init__.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.4}/src/rclone_api/assets/example.txt +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.4}/src/rclone_api/cli.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.4}/src/rclone_api/cmd/copy_large_s3.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.4}/src/rclone_api/cmd/list_files.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.4}/src/rclone_api/completed_process.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.4}/src/rclone_api/config.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.4}/src/rclone_api/convert.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.4}/src/rclone_api/deprecated.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.4}/src/rclone_api/diff.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.4}/src/rclone_api/dir.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.4}/src/rclone_api/dir_listing.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.4}/src/rclone_api/exec.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.4}/src/rclone_api/experimental/flags.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.4}/src/rclone_api/experimental/flags_base.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.4}/src/rclone_api/file.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.4}/src/rclone_api/filelist.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.4}/src/rclone_api/group_files.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.4}/src/rclone_api/process.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.4}/src/rclone_api/rclone.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.4}/src/rclone_api/remote.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.4}/src/rclone_api/rpath.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.4}/src/rclone_api/s3/api.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.4}/src/rclone_api/s3/basic_ops.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.4}/src/rclone_api/s3/create.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.4}/src/rclone_api/s3/types.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.4}/src/rclone_api/scan_missing_folders.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.4}/src/rclone_api/types.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.4}/src/rclone_api/util.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.4}/src/rclone_api/walk.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.4}/src/rclone_api.egg-info/SOURCES.txt +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.4}/src/rclone_api.egg-info/dependency_links.txt +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.4}/src/rclone_api.egg-info/entry_points.txt +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.4}/src/rclone_api.egg-info/requires.txt +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.4}/src/rclone_api.egg-info/top_level.txt +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.4}/test +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.4}/tests/archive/test_paramiko.py.disabled +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.4}/tests/test_cmd_list_files.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.4}/tests/test_copy.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.4}/tests/test_copy_files.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.4}/tests/test_diff.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.4}/tests/test_group_files.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.4}/tests/test_is_synced.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.4}/tests/test_ls.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.4}/tests/test_mount.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.4}/tests/test_mount_s3.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.4}/tests/test_mount_webdav.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.4}/tests/test_mounted_ranged_download.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.4}/tests/test_obscure.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.4}/tests/test_rclone_config.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.4}/tests/test_remote_control.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.4}/tests/test_remotes.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.4}/tests/test_s3.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.4}/tests/test_scan_missing_folders.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.4}/tests/test_size_files.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.4}/tests/test_walk.py +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.4}/tox.ini +0 -0
- {rclone_api-1.1.2 → rclone_api-1.1.4}/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
|
|
|
@@ -264,13 +271,10 @@ def _get_chunk_tmpdir() -> Path:
|
|
|
264
271
|
def _get_file_size(file_path: Path, timeout: int = 60) -> int:
|
|
265
272
|
sleep_time = timeout / 60 if timeout > 0 else 1
|
|
266
273
|
start = time.time()
|
|
267
|
-
not_windows = os.name != "nt"
|
|
268
274
|
while True:
|
|
269
275
|
expired = time.time() - start > timeout
|
|
270
276
|
try:
|
|
271
|
-
|
|
272
|
-
# Force a refresh of the directory cache
|
|
273
|
-
os.system(f"ls -l {file_path.parent}")
|
|
277
|
+
time.sleep(sleep_time)
|
|
274
278
|
if file_path.exists():
|
|
275
279
|
return file_path.stat().st_size
|
|
276
280
|
except FileNotFoundError as e:
|
|
@@ -279,7 +283,6 @@ def _get_file_size(file_path: Path, timeout: int = 60) -> int:
|
|
|
279
283
|
raise
|
|
280
284
|
if expired:
|
|
281
285
|
raise TimeoutError(f"File {file_path} not found after {timeout} seconds")
|
|
282
|
-
time.sleep(sleep_time)
|
|
283
286
|
|
|
284
287
|
|
|
285
288
|
def file_chunker(
|
|
@@ -433,6 +436,18 @@ def prepare_upload_file_multipart(
|
|
|
433
436
|
return upload_info
|
|
434
437
|
|
|
435
438
|
|
|
439
|
+
def _abort_previous_upload(upload_state: UploadState) -> None:
|
|
440
|
+
if upload_state.upload_info.upload_id:
|
|
441
|
+
try:
|
|
442
|
+
upload_state.upload_info.s3_client.abort_multipart_upload(
|
|
443
|
+
Bucket=upload_state.upload_info.bucket_name,
|
|
444
|
+
Key=upload_state.upload_info.object_name,
|
|
445
|
+
UploadId=upload_state.upload_info.upload_id,
|
|
446
|
+
)
|
|
447
|
+
except Exception as e:
|
|
448
|
+
locked_print(f"Error aborting previous upload: {e}")
|
|
449
|
+
|
|
450
|
+
|
|
436
451
|
def upload_file_multipart(
|
|
437
452
|
s3_client: BaseClient,
|
|
438
453
|
bucket_name: str,
|
|
@@ -488,6 +503,13 @@ def upload_file_multipart(
|
|
|
488
503
|
|
|
489
504
|
filechunks: Queue[FileChunk | None] = Queue(10)
|
|
490
505
|
upload_state = get_upload_state() or make_new_state()
|
|
506
|
+
try:
|
|
507
|
+
upload_state.update_source_file(file_path)
|
|
508
|
+
except ValueError as e:
|
|
509
|
+
locked_print(f"Cannot resume upload: {e}, size changed, starting over")
|
|
510
|
+
_abort_previous_upload(upload_state)
|
|
511
|
+
upload_state = make_new_state()
|
|
512
|
+
upload_state.save()
|
|
491
513
|
if upload_state.is_done():
|
|
492
514
|
return MultiUploadResult.ALREADY_DONE
|
|
493
515
|
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
|