rclone-api 1.1.47__tar.gz → 1.1.49__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.47 → rclone_api-1.1.49}/PKG-INFO +1 -1
- {rclone_api-1.1.47 → rclone_api-1.1.49}/pyproject.toml +1 -1
- {rclone_api-1.1.47 → rclone_api-1.1.49}/src/rclone_api/mount.py +69 -10
- {rclone_api-1.1.47 → rclone_api-1.1.49}/src/rclone_api.egg-info/PKG-INFO +1 -1
- {rclone_api-1.1.47 → rclone_api-1.1.49}/.aiderignore +0 -0
- {rclone_api-1.1.47 → rclone_api-1.1.49}/.github/workflows/lint.yml +0 -0
- {rclone_api-1.1.47 → rclone_api-1.1.49}/.github/workflows/push_macos.yml +0 -0
- {rclone_api-1.1.47 → rclone_api-1.1.49}/.github/workflows/push_ubuntu.yml +0 -0
- {rclone_api-1.1.47 → rclone_api-1.1.49}/.github/workflows/push_win.yml +0 -0
- {rclone_api-1.1.47 → rclone_api-1.1.49}/.gitignore +0 -0
- {rclone_api-1.1.47 → rclone_api-1.1.49}/.pylintrc +0 -0
- {rclone_api-1.1.47 → rclone_api-1.1.49}/.vscode/launch.json +0 -0
- {rclone_api-1.1.47 → rclone_api-1.1.49}/.vscode/settings.json +0 -0
- {rclone_api-1.1.47 → rclone_api-1.1.49}/.vscode/tasks.json +0 -0
- {rclone_api-1.1.47 → rclone_api-1.1.49}/LICENSE +0 -0
- {rclone_api-1.1.47 → rclone_api-1.1.49}/MANIFEST.in +0 -0
- {rclone_api-1.1.47 → rclone_api-1.1.49}/README.md +0 -0
- {rclone_api-1.1.47 → rclone_api-1.1.49}/clean +0 -0
- {rclone_api-1.1.47 → rclone_api-1.1.49}/install +0 -0
- {rclone_api-1.1.47 → rclone_api-1.1.49}/lint +0 -0
- {rclone_api-1.1.47 → rclone_api-1.1.49}/requirements.testing.txt +0 -0
- {rclone_api-1.1.47 → rclone_api-1.1.49}/setup.cfg +0 -0
- {rclone_api-1.1.47 → rclone_api-1.1.49}/setup.py +0 -0
- {rclone_api-1.1.47 → rclone_api-1.1.49}/src/rclone_api/__init__.py +0 -0
- {rclone_api-1.1.47 → rclone_api-1.1.49}/src/rclone_api/assets/example.txt +0 -0
- {rclone_api-1.1.47 → rclone_api-1.1.49}/src/rclone_api/cli.py +0 -0
- {rclone_api-1.1.47 → rclone_api-1.1.49}/src/rclone_api/cmd/copy_large_s3.py +0 -0
- {rclone_api-1.1.47 → rclone_api-1.1.49}/src/rclone_api/cmd/list_files.py +0 -0
- {rclone_api-1.1.47 → rclone_api-1.1.49}/src/rclone_api/completed_process.py +0 -0
- {rclone_api-1.1.47 → rclone_api-1.1.49}/src/rclone_api/config.py +0 -0
- {rclone_api-1.1.47 → rclone_api-1.1.49}/src/rclone_api/convert.py +0 -0
- {rclone_api-1.1.47 → rclone_api-1.1.49}/src/rclone_api/deprecated.py +0 -0
- {rclone_api-1.1.47 → rclone_api-1.1.49}/src/rclone_api/diff.py +0 -0
- {rclone_api-1.1.47 → rclone_api-1.1.49}/src/rclone_api/dir.py +0 -0
- {rclone_api-1.1.47 → rclone_api-1.1.49}/src/rclone_api/dir_listing.py +0 -0
- {rclone_api-1.1.47 → rclone_api-1.1.49}/src/rclone_api/exec.py +0 -0
- {rclone_api-1.1.47 → rclone_api-1.1.49}/src/rclone_api/experimental/flags.py +0 -0
- {rclone_api-1.1.47 → rclone_api-1.1.49}/src/rclone_api/experimental/flags_base.py +0 -0
- {rclone_api-1.1.47 → rclone_api-1.1.49}/src/rclone_api/file.py +0 -0
- {rclone_api-1.1.47 → rclone_api-1.1.49}/src/rclone_api/filelist.py +0 -0
- {rclone_api-1.1.47 → rclone_api-1.1.49}/src/rclone_api/group_files.py +0 -0
- {rclone_api-1.1.47 → rclone_api-1.1.49}/src/rclone_api/process.py +0 -0
- {rclone_api-1.1.47 → rclone_api-1.1.49}/src/rclone_api/profile/mount_copy_bytes.py +0 -0
- {rclone_api-1.1.47 → rclone_api-1.1.49}/src/rclone_api/rclone.py +0 -0
- {rclone_api-1.1.47 → rclone_api-1.1.49}/src/rclone_api/remote.py +0 -0
- {rclone_api-1.1.47 → rclone_api-1.1.49}/src/rclone_api/rpath.py +0 -0
- {rclone_api-1.1.47 → rclone_api-1.1.49}/src/rclone_api/s3/api.py +0 -0
- {rclone_api-1.1.47 → rclone_api-1.1.49}/src/rclone_api/s3/basic_ops.py +0 -0
- {rclone_api-1.1.47 → rclone_api-1.1.49}/src/rclone_api/s3/chunk_file.py +0 -0
- {rclone_api-1.1.47 → rclone_api-1.1.49}/src/rclone_api/s3/chunk_types.py +0 -0
- {rclone_api-1.1.47 → rclone_api-1.1.49}/src/rclone_api/s3/create.py +0 -0
- {rclone_api-1.1.47 → rclone_api-1.1.49}/src/rclone_api/s3/types.py +0 -0
- {rclone_api-1.1.47 → rclone_api-1.1.49}/src/rclone_api/s3/upload_file_multipart.py +0 -0
- {rclone_api-1.1.47 → rclone_api-1.1.49}/src/rclone_api/scan_missing_folders.py +0 -0
- {rclone_api-1.1.47 → rclone_api-1.1.49}/src/rclone_api/types.py +0 -0
- {rclone_api-1.1.47 → rclone_api-1.1.49}/src/rclone_api/util.py +0 -0
- {rclone_api-1.1.47 → rclone_api-1.1.49}/src/rclone_api/walk.py +0 -0
- {rclone_api-1.1.47 → rclone_api-1.1.49}/src/rclone_api.egg-info/SOURCES.txt +0 -0
- {rclone_api-1.1.47 → rclone_api-1.1.49}/src/rclone_api.egg-info/dependency_links.txt +0 -0
- {rclone_api-1.1.47 → rclone_api-1.1.49}/src/rclone_api.egg-info/entry_points.txt +0 -0
- {rclone_api-1.1.47 → rclone_api-1.1.49}/src/rclone_api.egg-info/requires.txt +0 -0
- {rclone_api-1.1.47 → rclone_api-1.1.49}/src/rclone_api.egg-info/top_level.txt +0 -0
- {rclone_api-1.1.47 → rclone_api-1.1.49}/test +0 -0
- {rclone_api-1.1.47 → rclone_api-1.1.49}/tests/archive/test_paramiko.py.disabled +0 -0
- {rclone_api-1.1.47 → rclone_api-1.1.49}/tests/test_cmd_list_files.py +0 -0
- {rclone_api-1.1.47 → rclone_api-1.1.49}/tests/test_copy.py +0 -0
- {rclone_api-1.1.47 → rclone_api-1.1.49}/tests/test_copy_bytes.py +0 -0
- {rclone_api-1.1.47 → rclone_api-1.1.49}/tests/test_copy_file_resumable_s3.py +0 -0
- {rclone_api-1.1.47 → rclone_api-1.1.49}/tests/test_copy_files.py +0 -0
- {rclone_api-1.1.47 → rclone_api-1.1.49}/tests/test_diff.py +0 -0
- {rclone_api-1.1.47 → rclone_api-1.1.49}/tests/test_group_files.py +0 -0
- {rclone_api-1.1.47 → rclone_api-1.1.49}/tests/test_is_synced.py +0 -0
- {rclone_api-1.1.47 → rclone_api-1.1.49}/tests/test_ls.py +0 -0
- {rclone_api-1.1.47 → rclone_api-1.1.49}/tests/test_mount.py +0 -0
- {rclone_api-1.1.47 → rclone_api-1.1.49}/tests/test_mount_s3.py +0 -0
- {rclone_api-1.1.47 → rclone_api-1.1.49}/tests/test_obscure.py +0 -0
- {rclone_api-1.1.47 → rclone_api-1.1.49}/tests/test_rclone_config.py +0 -0
- {rclone_api-1.1.47 → rclone_api-1.1.49}/tests/test_remote_control.py +0 -0
- {rclone_api-1.1.47 → rclone_api-1.1.49}/tests/test_remotes.py +0 -0
- {rclone_api-1.1.47 → rclone_api-1.1.49}/tests/test_s3.py +0 -0
- {rclone_api-1.1.47 → rclone_api-1.1.49}/tests/test_scan_missing_folders.py +0 -0
- {rclone_api-1.1.47 → rclone_api-1.1.49}/tests/test_size_files.py +0 -0
- {rclone_api-1.1.47 → rclone_api-1.1.49}/tests/test_size_suffix.py +0 -0
- {rclone_api-1.1.47 → rclone_api-1.1.49}/tests/test_walk.py +0 -0
- {rclone_api-1.1.47 → rclone_api-1.1.49}/tox.ini +0 -0
- {rclone_api-1.1.47 → rclone_api-1.1.49}/upload_package.sh +0 -0
|
@@ -77,24 +77,83 @@ def prepare_mount(outdir: Path, verbose: bool) -> None:
|
|
|
77
77
|
outdir.mkdir(parents=True, exist_ok=True)
|
|
78
78
|
|
|
79
79
|
|
|
80
|
-
def wait_for_mount(
|
|
81
|
-
|
|
80
|
+
def wait_for_mount(
|
|
81
|
+
path: Path,
|
|
82
|
+
mount_process: Any,
|
|
83
|
+
timeout: int = 10,
|
|
84
|
+
post_mount_delay: int = 5,
|
|
85
|
+
poll_interval: float = 1.0,
|
|
86
|
+
check_mount_flag: bool = False,
|
|
87
|
+
) -> None:
|
|
88
|
+
"""
|
|
89
|
+
Wait for a mount point to become available by checking if the directory exists,
|
|
90
|
+
optionally verifying that it is a mount point, and confirming that it contains files.
|
|
91
|
+
This function periodically polls for the mount status, ensures the mount process
|
|
92
|
+
is still running, and applies an extra delay after detecting content for stabilization.
|
|
93
|
+
|
|
94
|
+
Args:
|
|
95
|
+
path (Path): The mount point directory to check.
|
|
96
|
+
mount_process (Any): A Process instance handling the mount (must be an instance of Process).
|
|
97
|
+
timeout (int): Maximum time in seconds to wait for the mount to become available.
|
|
98
|
+
post_mount_delay (int): Additional seconds to wait after detecting files.
|
|
99
|
+
poll_interval (float): Seconds between each poll iteration.
|
|
100
|
+
check_mount_flag (bool): If True, verifies that the path is recognized as a mount point.
|
|
101
|
+
|
|
102
|
+
Raises:
|
|
103
|
+
subprocess.CalledProcessError: If the mount_process exits unexpectedly.
|
|
104
|
+
TimeoutError: If the mount is not available within the timeout period.
|
|
105
|
+
TypeError: If mount_process is not an instance of Process.
|
|
106
|
+
"""
|
|
107
|
+
|
|
108
|
+
if not isinstance(mount_process, Process):
|
|
109
|
+
raise TypeError("mount_process must be an instance of Process")
|
|
82
110
|
|
|
83
|
-
assert isinstance(mount_process, Process)
|
|
84
111
|
expire_time = time.time() + timeout
|
|
112
|
+
last_error = None
|
|
113
|
+
|
|
85
114
|
while time.time() < expire_time:
|
|
115
|
+
# Check if the mount process has terminated unexpectedly.
|
|
86
116
|
rtn = mount_process.poll()
|
|
87
117
|
if rtn is not None:
|
|
88
118
|
cmd_str = subprocess.list2cmdline(mount_process.cmd)
|
|
119
|
+
print(f"Mount process terminated unexpectedly: {cmd_str}")
|
|
89
120
|
raise subprocess.CalledProcessError(rtn, cmd_str)
|
|
121
|
+
|
|
122
|
+
# Check if the mount path exists.
|
|
90
123
|
if path.exists():
|
|
91
|
-
#
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
124
|
+
# Optionally check if path is a mount point.
|
|
125
|
+
if check_mount_flag:
|
|
126
|
+
try:
|
|
127
|
+
if not os.path.ismount(str(path)):
|
|
128
|
+
print(
|
|
129
|
+
f"{path} exists but is not recognized as a mount point yet."
|
|
130
|
+
)
|
|
131
|
+
time.sleep(poll_interval)
|
|
132
|
+
continue
|
|
133
|
+
except Exception as e:
|
|
134
|
+
print(f"Could not verify mount point status for {path}: {e}")
|
|
135
|
+
|
|
136
|
+
try:
|
|
137
|
+
# Check for at least one entry in the directory.
|
|
138
|
+
if any(path.iterdir()):
|
|
139
|
+
print(
|
|
140
|
+
f"Mount point {path} appears available with files. Waiting {post_mount_delay} seconds for stabilization."
|
|
141
|
+
)
|
|
142
|
+
time.sleep(post_mount_delay)
|
|
143
|
+
return
|
|
144
|
+
else:
|
|
145
|
+
print(f"Mount point {path} is empty. Waiting for files to appear.")
|
|
146
|
+
except Exception as e:
|
|
147
|
+
last_error = e
|
|
148
|
+
print(f"Error accessing {path}: {e}")
|
|
149
|
+
else:
|
|
150
|
+
print(f"Mount point {path} does not exist yet.")
|
|
151
|
+
|
|
152
|
+
time.sleep(poll_interval)
|
|
153
|
+
|
|
154
|
+
raise TimeoutError(
|
|
155
|
+
f"Mount point {path} did not become available within {timeout} seconds. Last error: {last_error}"
|
|
156
|
+
)
|
|
98
157
|
|
|
99
158
|
|
|
100
159
|
def clean_mount(mount: Mount | Path, verbose: bool = False, wait=True) -> None:
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|