rclone-api 1.1.2__py2.py3-none-any.whl → 1.1.4__py2.py3-none-any.whl

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.
@@ -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
- if not_windows:
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()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: rclone_api
3
- Version: 1.1.2
3
+ Version: 1.1.4
4
4
  Summary: rclone api in python
5
5
  Home-page: https://github.com/zackees/rclone-api
6
6
  License: BSD 3-Clause License
@@ -26,12 +26,12 @@ rclone_api/experimental/flags.py,sha256=0-mtXg9J4MoMm2uBKbsMLj4pSGRLQUAqNRDJWGtt
26
26
  rclone_api/experimental/flags_base.py,sha256=ajU_czkTcAxXYU-SlmiCfHY7aCQGHvpCLqJ-Z8uZLk0,2102
27
27
  rclone_api/s3/api.py,sha256=VstlaEnBjO2JDQuCRLdTfUGvQLbfshlXXhAzimFv4Vc,3763
28
28
  rclone_api/s3/basic_ops.py,sha256=hK3366xhVEzEcjz9Gk_8lFx6MRceAk72cax6mUrr6ko,2104
29
- rclone_api/s3/chunk_uploader.py,sha256=6EB7FH4HftkQRyHijOU8O8CWShFE0qQY-lDo5oU-xIw,18843
29
+ rclone_api/s3/chunk_uploader.py,sha256=k7491vxvCX2KDz-nMQ45PDeHpaKPKmDtxl-URynLdeo,19736
30
30
  rclone_api/s3/create.py,sha256=SK3IGHZwsSkoG4Zb4NCphcVg9_f7VifDKng-tExMS2s,3088
31
31
  rclone_api/s3/types.py,sha256=81_3jwg6MGIxC-GxL-6zANzKO6au9C0BWvAqRyODxOM,1361
32
- rclone_api-1.1.2.dist-info/LICENSE,sha256=b6pOoifSXiUaz_lDS84vWlG3fr4yUKwB8fzkrH9R8bQ,1064
33
- rclone_api-1.1.2.dist-info/METADATA,sha256=gcug-ENlJLW8DD1HdmG1eeyb6ajIVVVO_luxxZqk2pc,4478
34
- rclone_api-1.1.2.dist-info/WHEEL,sha256=rF4EZyR2XVS6irmOHQIJx2SUqXLZKRMUrjsg8UwN-XQ,109
35
- rclone_api-1.1.2.dist-info/entry_points.txt,sha256=6eNqTRXKhVf8CpWNjXiOa_0Du9tHiW_HD2iQSXRsUg8,132
36
- rclone_api-1.1.2.dist-info/top_level.txt,sha256=EvZ7uuruUpe9RiUyEp25d1Keq7PWYNT0O_-mr8FCG5g,11
37
- rclone_api-1.1.2.dist-info/RECORD,,
32
+ rclone_api-1.1.4.dist-info/LICENSE,sha256=b6pOoifSXiUaz_lDS84vWlG3fr4yUKwB8fzkrH9R8bQ,1064
33
+ rclone_api-1.1.4.dist-info/METADATA,sha256=DTOOicQKR2vGSu2zZCKLOwj8uR1u7jh8sst9VOevGQ0,4478
34
+ rclone_api-1.1.4.dist-info/WHEEL,sha256=rF4EZyR2XVS6irmOHQIJx2SUqXLZKRMUrjsg8UwN-XQ,109
35
+ rclone_api-1.1.4.dist-info/entry_points.txt,sha256=6eNqTRXKhVf8CpWNjXiOa_0Du9tHiW_HD2iQSXRsUg8,132
36
+ rclone_api-1.1.4.dist-info/top_level.txt,sha256=EvZ7uuruUpe9RiUyEp25d1Keq7PWYNT0O_-mr8FCG5g,11
37
+ rclone_api-1.1.4.dist-info/RECORD,,