rclone-api 1.1.12__tar.gz → 1.1.14__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.12 → rclone_api-1.1.14}/PKG-INFO +1 -1
- {rclone_api-1.1.12 → rclone_api-1.1.14}/pyproject.toml +1 -1
- {rclone_api-1.1.12 → rclone_api-1.1.14}/src/rclone_api/mount.py +1 -0
- {rclone_api-1.1.12 → rclone_api-1.1.14}/src/rclone_api/rclone.py +3 -2
- {rclone_api-1.1.12 → rclone_api-1.1.14}/src/rclone_api/s3/chunk_types.py +33 -5
- {rclone_api-1.1.12 → rclone_api-1.1.14}/src/rclone_api.egg-info/PKG-INFO +1 -1
- {rclone_api-1.1.12 → rclone_api-1.1.14}/.aiderignore +0 -0
- {rclone_api-1.1.12 → rclone_api-1.1.14}/.github/workflows/lint.yml +0 -0
- {rclone_api-1.1.12 → rclone_api-1.1.14}/.github/workflows/push_macos.yml +0 -0
- {rclone_api-1.1.12 → rclone_api-1.1.14}/.github/workflows/push_ubuntu.yml +0 -0
- {rclone_api-1.1.12 → rclone_api-1.1.14}/.github/workflows/push_win.yml +0 -0
- {rclone_api-1.1.12 → rclone_api-1.1.14}/.gitignore +0 -0
- {rclone_api-1.1.12 → rclone_api-1.1.14}/.pylintrc +0 -0
- {rclone_api-1.1.12 → rclone_api-1.1.14}/.vscode/launch.json +0 -0
- {rclone_api-1.1.12 → rclone_api-1.1.14}/.vscode/settings.json +0 -0
- {rclone_api-1.1.12 → rclone_api-1.1.14}/.vscode/tasks.json +0 -0
- {rclone_api-1.1.12 → rclone_api-1.1.14}/LICENSE +0 -0
- {rclone_api-1.1.12 → rclone_api-1.1.14}/MANIFEST.in +0 -0
- {rclone_api-1.1.12 → rclone_api-1.1.14}/README.md +0 -0
- {rclone_api-1.1.12 → rclone_api-1.1.14}/clean +0 -0
- {rclone_api-1.1.12 → rclone_api-1.1.14}/install +0 -0
- {rclone_api-1.1.12 → rclone_api-1.1.14}/lint +0 -0
- {rclone_api-1.1.12 → rclone_api-1.1.14}/requirements.testing.txt +0 -0
- {rclone_api-1.1.12 → rclone_api-1.1.14}/setup.cfg +0 -0
- {rclone_api-1.1.12 → rclone_api-1.1.14}/setup.py +0 -0
- {rclone_api-1.1.12 → rclone_api-1.1.14}/src/rclone_api/__init__.py +0 -0
- {rclone_api-1.1.12 → rclone_api-1.1.14}/src/rclone_api/assets/example.txt +0 -0
- {rclone_api-1.1.12 → rclone_api-1.1.14}/src/rclone_api/cli.py +0 -0
- {rclone_api-1.1.12 → rclone_api-1.1.14}/src/rclone_api/cmd/copy_large_s3.py +0 -0
- {rclone_api-1.1.12 → rclone_api-1.1.14}/src/rclone_api/cmd/list_files.py +0 -0
- {rclone_api-1.1.12 → rclone_api-1.1.14}/src/rclone_api/completed_process.py +0 -0
- {rclone_api-1.1.12 → rclone_api-1.1.14}/src/rclone_api/config.py +0 -0
- {rclone_api-1.1.12 → rclone_api-1.1.14}/src/rclone_api/convert.py +0 -0
- {rclone_api-1.1.12 → rclone_api-1.1.14}/src/rclone_api/deprecated.py +0 -0
- {rclone_api-1.1.12 → rclone_api-1.1.14}/src/rclone_api/diff.py +0 -0
- {rclone_api-1.1.12 → rclone_api-1.1.14}/src/rclone_api/dir.py +0 -0
- {rclone_api-1.1.12 → rclone_api-1.1.14}/src/rclone_api/dir_listing.py +0 -0
- {rclone_api-1.1.12 → rclone_api-1.1.14}/src/rclone_api/exec.py +0 -0
- {rclone_api-1.1.12 → rclone_api-1.1.14}/src/rclone_api/experimental/flags.py +0 -0
- {rclone_api-1.1.12 → rclone_api-1.1.14}/src/rclone_api/experimental/flags_base.py +0 -0
- {rclone_api-1.1.12 → rclone_api-1.1.14}/src/rclone_api/file.py +0 -0
- {rclone_api-1.1.12 → rclone_api-1.1.14}/src/rclone_api/filelist.py +0 -0
- {rclone_api-1.1.12 → rclone_api-1.1.14}/src/rclone_api/group_files.py +0 -0
- {rclone_api-1.1.12 → rclone_api-1.1.14}/src/rclone_api/process.py +0 -0
- {rclone_api-1.1.12 → rclone_api-1.1.14}/src/rclone_api/remote.py +0 -0
- {rclone_api-1.1.12 → rclone_api-1.1.14}/src/rclone_api/rpath.py +0 -0
- {rclone_api-1.1.12 → rclone_api-1.1.14}/src/rclone_api/s3/api.py +0 -0
- {rclone_api-1.1.12 → rclone_api-1.1.14}/src/rclone_api/s3/basic_ops.py +0 -0
- {rclone_api-1.1.12 → rclone_api-1.1.14}/src/rclone_api/s3/chunk_file.py +0 -0
- {rclone_api-1.1.12 → rclone_api-1.1.14}/src/rclone_api/s3/chunk_uploader.py +0 -0
- {rclone_api-1.1.12 → rclone_api-1.1.14}/src/rclone_api/s3/create.py +0 -0
- {rclone_api-1.1.12 → rclone_api-1.1.14}/src/rclone_api/s3/types.py +0 -0
- {rclone_api-1.1.12 → rclone_api-1.1.14}/src/rclone_api/scan_missing_folders.py +0 -0
- {rclone_api-1.1.12 → rclone_api-1.1.14}/src/rclone_api/types.py +0 -0
- {rclone_api-1.1.12 → rclone_api-1.1.14}/src/rclone_api/util.py +0 -0
- {rclone_api-1.1.12 → rclone_api-1.1.14}/src/rclone_api/walk.py +0 -0
- {rclone_api-1.1.12 → rclone_api-1.1.14}/src/rclone_api.egg-info/SOURCES.txt +0 -0
- {rclone_api-1.1.12 → rclone_api-1.1.14}/src/rclone_api.egg-info/dependency_links.txt +0 -0
- {rclone_api-1.1.12 → rclone_api-1.1.14}/src/rclone_api.egg-info/entry_points.txt +0 -0
- {rclone_api-1.1.12 → rclone_api-1.1.14}/src/rclone_api.egg-info/requires.txt +0 -0
- {rclone_api-1.1.12 → rclone_api-1.1.14}/src/rclone_api.egg-info/top_level.txt +0 -0
- {rclone_api-1.1.12 → rclone_api-1.1.14}/test +0 -0
- {rclone_api-1.1.12 → rclone_api-1.1.14}/tests/archive/test_paramiko.py.disabled +0 -0
- {rclone_api-1.1.12 → rclone_api-1.1.14}/tests/test_cmd_list_files.py +0 -0
- {rclone_api-1.1.12 → rclone_api-1.1.14}/tests/test_copy.py +0 -0
- {rclone_api-1.1.12 → rclone_api-1.1.14}/tests/test_copy_files.py +0 -0
- {rclone_api-1.1.12 → rclone_api-1.1.14}/tests/test_diff.py +0 -0
- {rclone_api-1.1.12 → rclone_api-1.1.14}/tests/test_group_files.py +0 -0
- {rclone_api-1.1.12 → rclone_api-1.1.14}/tests/test_is_synced.py +0 -0
- {rclone_api-1.1.12 → rclone_api-1.1.14}/tests/test_ls.py +0 -0
- {rclone_api-1.1.12 → rclone_api-1.1.14}/tests/test_mount.py +0 -0
- {rclone_api-1.1.12 → rclone_api-1.1.14}/tests/test_mount_s3.py +0 -0
- {rclone_api-1.1.12 → rclone_api-1.1.14}/tests/test_mounted_ranged_download.py +0 -0
- {rclone_api-1.1.12 → rclone_api-1.1.14}/tests/test_obscure.py +0 -0
- {rclone_api-1.1.12 → rclone_api-1.1.14}/tests/test_rclone_config.py +0 -0
- {rclone_api-1.1.12 → rclone_api-1.1.14}/tests/test_remote_control.py +0 -0
- {rclone_api-1.1.12 → rclone_api-1.1.14}/tests/test_remotes.py +0 -0
- {rclone_api-1.1.12 → rclone_api-1.1.14}/tests/test_s3.py +0 -0
- {rclone_api-1.1.12 → rclone_api-1.1.14}/tests/test_scan_missing_folders.py +0 -0
- {rclone_api-1.1.12 → rclone_api-1.1.14}/tests/test_size_files.py +0 -0
- {rclone_api-1.1.12 → rclone_api-1.1.14}/tests/test_size_suffix.py +0 -0
- {rclone_api-1.1.12 → rclone_api-1.1.14}/tests/test_walk.py +0 -0
- {rclone_api-1.1.12 → rclone_api-1.1.14}/tox.ini +0 -0
- {rclone_api-1.1.12 → rclone_api-1.1.14}/upload_package.sh +0 -0
|
@@ -710,6 +710,7 @@ class Rclone:
|
|
|
710
710
|
"--vfs-disk-space-total-size",
|
|
711
711
|
vfs_disk_space_total_size.as_str(),
|
|
712
712
|
]
|
|
713
|
+
other_args += ["--read-only"]
|
|
713
714
|
mount_path = mount_path or Path("tmp_mnts") / random_str(12)
|
|
714
715
|
src_path = Path(src)
|
|
715
716
|
name = src_path.name
|
|
@@ -876,8 +877,8 @@ class Rclone:
|
|
|
876
877
|
if other_args:
|
|
877
878
|
cmd_list += other_args
|
|
878
879
|
proc = self._launch_process(cmd_list)
|
|
879
|
-
|
|
880
|
-
mount: Mount = Mount(mount_path=outdir, process=proc)
|
|
880
|
+
mount_read_only = "--read-only" in cmd_list # hint to allow fast teardown
|
|
881
|
+
mount: Mount = Mount(mount_path=outdir, process=proc, read_only=mount_read_only)
|
|
881
882
|
return mount
|
|
882
883
|
|
|
883
884
|
@contextmanager
|
|
@@ -184,6 +184,9 @@ class UploadState:
|
|
|
184
184
|
def is_done(self) -> bool:
|
|
185
185
|
return self.remaining() == 0
|
|
186
186
|
|
|
187
|
+
def fingerprint(self) -> str:
|
|
188
|
+
return self.upload_info.fingerprint()
|
|
189
|
+
|
|
187
190
|
def count(self) -> tuple[int, int]: # count, num_chunks
|
|
188
191
|
num_chunks = self.upload_info.total_chunks()
|
|
189
192
|
count = 0
|
|
@@ -218,8 +221,31 @@ class UploadState:
|
|
|
218
221
|
|
|
219
222
|
def save(self) -> None:
|
|
220
223
|
with _SAVE_STATE_LOCK:
|
|
224
|
+
|
|
225
|
+
self._check_fingerprint_no_lock()
|
|
226
|
+
|
|
221
227
|
self._save_no_lock()
|
|
222
228
|
|
|
229
|
+
def _check_fingerprint_no_lock(self) -> None:
|
|
230
|
+
if self.peristant is None:
|
|
231
|
+
raise ValueError("No path to save to")
|
|
232
|
+
s3_client = self.upload_info.s3_client
|
|
233
|
+
path = self.peristant
|
|
234
|
+
last_upload_state: UploadState | None = None
|
|
235
|
+
if path.exists():
|
|
236
|
+
try:
|
|
237
|
+
last_upload_state = UploadState.from_json(s3_client, path)
|
|
238
|
+
except Exception as e:
|
|
239
|
+
locked_print(f"Error loading state: {e}")
|
|
240
|
+
last_upload_state = None
|
|
241
|
+
# now check that the fingerprint is the same
|
|
242
|
+
if last_upload_state is not None:
|
|
243
|
+
curr_fingerprint = self.fingerprint()
|
|
244
|
+
if curr_fingerprint != last_upload_state.fingerprint():
|
|
245
|
+
raise ValueError(
|
|
246
|
+
f"Cannot save state, fingerprint changed from {curr_fingerprint} to {self.upload_info.fingerprint()}"
|
|
247
|
+
)
|
|
248
|
+
|
|
223
249
|
def _save_no_lock(self) -> None:
|
|
224
250
|
assert self.peristant is not None, "No path to save to"
|
|
225
251
|
self.peristant.write_text(self.to_json_str(), encoding="utf-8")
|
|
@@ -241,13 +267,15 @@ class UploadState:
|
|
|
241
267
|
if p is not None:
|
|
242
268
|
count_non_none += 1
|
|
243
269
|
|
|
244
|
-
|
|
270
|
+
file_size_bytes = self.upload_info.file_size
|
|
245
271
|
finished_count, total = self.count()
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
272
|
+
|
|
273
|
+
total_finished_size_bytes = finished_count * self.upload_info.chunk_size
|
|
274
|
+
if finished_count == total:
|
|
275
|
+
total_finished_size_bytes = file_size_bytes
|
|
276
|
+
total_finished: SizeSuffix = SizeSuffix(total_finished_size_bytes)
|
|
249
277
|
total_remaining: SizeSuffix = SizeSuffix(
|
|
250
|
-
|
|
278
|
+
file_size_bytes - total_finished_size_bytes
|
|
251
279
|
)
|
|
252
280
|
|
|
253
281
|
# parts.sort(key=lambda x: x.part_number) # Some backends need this.
|
|
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
|
|
File without changes
|