rclone-api 1.1.49__py2.py3-none-any.whl → 1.1.51__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.
- rclone_api/mount.py +32 -0
- rclone_api/rclone.py +1 -0
- {rclone_api-1.1.49.dist-info → rclone_api-1.1.51.dist-info}/METADATA +1 -1
- {rclone_api-1.1.49.dist-info → rclone_api-1.1.51.dist-info}/RECORD +8 -8
- {rclone_api-1.1.49.dist-info → rclone_api-1.1.51.dist-info}/LICENSE +0 -0
- {rclone_api-1.1.49.dist-info → rclone_api-1.1.51.dist-info}/WHEEL +0 -0
- {rclone_api-1.1.49.dist-info → rclone_api-1.1.51.dist-info}/entry_points.txt +0 -0
- {rclone_api-1.1.49.dist-info → rclone_api-1.1.51.dist-info}/top_level.txt +0 -0
rclone_api/mount.py
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
|
+
import atexit
|
|
1
2
|
import os
|
|
2
3
|
import platform
|
|
3
4
|
import shutil
|
|
4
5
|
import subprocess
|
|
5
6
|
import time
|
|
6
7
|
import warnings
|
|
8
|
+
import weakref
|
|
9
|
+
from concurrent.futures import ThreadPoolExecutor
|
|
7
10
|
from dataclasses import dataclass
|
|
8
11
|
from pathlib import Path
|
|
9
12
|
from typing import Any
|
|
@@ -12,11 +15,33 @@ from rclone_api.process import Process
|
|
|
12
15
|
|
|
13
16
|
_SYSTEM = platform.system() # "Linux", "Darwin", "Windows", etc.
|
|
14
17
|
|
|
18
|
+
_MOUNTS_FOR_GC: weakref.WeakSet = weakref.WeakSet()
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def _add_mount_for_gc(mount: "Mount") -> None:
|
|
22
|
+
# weak reference to avoid circular references
|
|
23
|
+
_MOUNTS_FOR_GC.add(mount)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def _remove_mount_for_gc(mount: "Mount") -> None:
|
|
27
|
+
_MOUNTS_FOR_GC.discard(mount)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def _cleanup_mounts() -> None:
|
|
31
|
+
with ThreadPoolExecutor() as executor:
|
|
32
|
+
mount: Mount
|
|
33
|
+
for mount in _MOUNTS_FOR_GC:
|
|
34
|
+
executor.submit(mount.close, wait=False)
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
atexit.register(_cleanup_mounts)
|
|
38
|
+
|
|
15
39
|
|
|
16
40
|
@dataclass
|
|
17
41
|
class Mount:
|
|
18
42
|
"""Mount information."""
|
|
19
43
|
|
|
44
|
+
src: str
|
|
20
45
|
mount_path: Path
|
|
21
46
|
process: Process
|
|
22
47
|
read_only: bool
|
|
@@ -28,15 +53,18 @@ class Mount:
|
|
|
28
53
|
assert isinstance(self.mount_path, Path)
|
|
29
54
|
assert self.process is not None
|
|
30
55
|
wait_for_mount(self.mount_path, self.process)
|
|
56
|
+
_add_mount_for_gc(self)
|
|
31
57
|
|
|
32
58
|
def close(self, wait=True) -> None:
|
|
33
59
|
"""Clean up the mount."""
|
|
34
60
|
if self._closed:
|
|
35
61
|
return
|
|
36
62
|
self._closed = True
|
|
63
|
+
self.process.terminate()
|
|
37
64
|
clean_mount(self, verbose=False, wait=wait)
|
|
38
65
|
if self.cache_dir and self.cache_dir_delete_on_exit:
|
|
39
66
|
_cache_dir_delete_on_exit(self.cache_dir)
|
|
67
|
+
_remove_mount_for_gc(self)
|
|
40
68
|
|
|
41
69
|
def __enter__(self) -> "Mount":
|
|
42
70
|
return self
|
|
@@ -47,6 +75,10 @@ class Mount:
|
|
|
47
75
|
def __del__(self):
|
|
48
76
|
self.close(wait=False)
|
|
49
77
|
|
|
78
|
+
# make this a hashable object
|
|
79
|
+
def __hash__(self):
|
|
80
|
+
return hash(self.mount_path)
|
|
81
|
+
|
|
50
82
|
|
|
51
83
|
def run_command(cmd: str, verbose: bool) -> int:
|
|
52
84
|
"""Run a shell command and print its output if verbose is True."""
|
rclone_api/rclone.py
CHANGED
|
@@ -11,9 +11,9 @@ rclone_api/exec.py,sha256=Pd7pUBd8ib5MzqvMybG2DQISPRbDRu20VjVRL2mLAVY,1076
|
|
|
11
11
|
rclone_api/file.py,sha256=EP5yT2dZ0H2p7CY5n0y5k5pHhIliV25pm8KOwBklUTk,1863
|
|
12
12
|
rclone_api/filelist.py,sha256=xbiusvNgaB_b_kQOZoHMJJxn6TWGtPrWd2J042BI28o,767
|
|
13
13
|
rclone_api/group_files.py,sha256=H92xPW9lQnbNw5KbtZCl00bD6iRh9yRbCuxku4j_3dg,8036
|
|
14
|
-
rclone_api/mount.py,sha256=
|
|
14
|
+
rclone_api/mount.py,sha256=5XiFwP7tst4h8cGQstZMJ0u5VzqFQ4YehnDl2AFP11A,10057
|
|
15
15
|
rclone_api/process.py,sha256=rBj_S86jC6nqCYop-jq8r9eMSteKeObxUrJMgH8LZvI,5084
|
|
16
|
-
rclone_api/rclone.py,sha256=
|
|
16
|
+
rclone_api/rclone.py,sha256=ye_Qdn9dC-PVXySskjrrtPljDQZz1SnvKmGkAn7rcAI,43848
|
|
17
17
|
rclone_api/remote.py,sha256=O9WDUFQy9f6oT1HdUbTixK2eg0xtBBm8k4Xl6aa6K00,431
|
|
18
18
|
rclone_api/rpath.py,sha256=8ZA_1wxWtskwcy0I8V2VbjKDmzPkiWd8Q2JQSvh-sYE,2586
|
|
19
19
|
rclone_api/scan_missing_folders.py,sha256=Kulca2Q6WZodt00ATFHkmqqInuoPvBkhTcS9703y6po,4740
|
|
@@ -33,9 +33,9 @@ rclone_api/s3/chunk_types.py,sha256=LbXayXY1KgVU1LkdbASD_BQ7TpVpwVnzMjtz--8LBaE,
|
|
|
33
33
|
rclone_api/s3/create.py,sha256=wgfkapv_j904CfKuWyiBIWJVxfAx_ftemFSUV14aT68,3149
|
|
34
34
|
rclone_api/s3/types.py,sha256=yBnJ38Tjk6RlydJ-sqZ7DSfyFloy8KDYJ0mv3vlOzLE,1388
|
|
35
35
|
rclone_api/s3/upload_file_multipart.py,sha256=y9azNAU8QH5Ovwz33V2HZwNmJdlFjJg-jrXLZ1gtMds,10364
|
|
36
|
-
rclone_api-1.1.
|
|
37
|
-
rclone_api-1.1.
|
|
38
|
-
rclone_api-1.1.
|
|
39
|
-
rclone_api-1.1.
|
|
40
|
-
rclone_api-1.1.
|
|
41
|
-
rclone_api-1.1.
|
|
36
|
+
rclone_api-1.1.51.dist-info/LICENSE,sha256=b6pOoifSXiUaz_lDS84vWlG3fr4yUKwB8fzkrH9R8bQ,1064
|
|
37
|
+
rclone_api-1.1.51.dist-info/METADATA,sha256=4bJ5zwCZ1RpMpTjmkuPrXxgdIU3aXJqyLOuhRvnd_Cg,4537
|
|
38
|
+
rclone_api-1.1.51.dist-info/WHEEL,sha256=rF4EZyR2XVS6irmOHQIJx2SUqXLZKRMUrjsg8UwN-XQ,109
|
|
39
|
+
rclone_api-1.1.51.dist-info/entry_points.txt,sha256=TV8kwP3FRzYwUEr0RLC7aJh0W03SAefIJNXTJ-FdMIQ,200
|
|
40
|
+
rclone_api-1.1.51.dist-info/top_level.txt,sha256=EvZ7uuruUpe9RiUyEp25d1Keq7PWYNT0O_-mr8FCG5g,11
|
|
41
|
+
rclone_api-1.1.51.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|