Skip to content

Commit 46508af

Browse files
authored
feat(cli): show spinner when cloning repo for dataset import/update (#2914)
1 parent 482fff0 commit 46508af

File tree

5 files changed

+56
-23
lines changed

5 files changed

+56
-23
lines changed

renku/core/dataset/dataset.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1023,9 +1023,10 @@ def update_dataset_git_files(
10231023
if url in visited_repos:
10241024
remote_repository, remote_client = visited_repos[url]
10251025
else:
1026-
remote_repository = clone_repository(
1027-
url=url, path=get_cache_directory_for_repository(client=client, url=url), checkout_revision=ref
1028-
)
1026+
with communication.busy(msg="Cloning remote repository..."):
1027+
remote_repository = clone_repository(
1028+
url=url, path=get_cache_directory_for_repository(client=client, url=url), checkout_revision=ref
1029+
)
10291030
remote_client = LocalClient(path=remote_repository.path)
10301031
visited_repos[url] = remote_repository, remote_client
10311032

renku/core/dataset/providers/renku.py

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -359,22 +359,23 @@ def _fetch_dataset(self, client_dispatcher: IClientDispatcher, database_dispatch
359359

360360
urls = (self._project_url_ssh, self._project_url_http)
361361
# Clone the project
362-
for url in urls:
363-
try:
364-
repository = clone_renku_repository(
365-
url=url,
366-
path=get_cache_directory_for_repository(client=client, url=url),
367-
gitlab_token=self._gitlab_token,
368-
deployment_hostname=parsed_uri.netloc,
369-
depth=None,
370-
reuse_existing_repository=True,
371-
use_renku_credentials=True,
372-
)
373-
except errors.GitError:
374-
pass
375-
else:
376-
self._project_url = url
377-
break
362+
with communication.busy(msg="Cloning remote repository..."):
363+
for url in urls:
364+
try:
365+
repository = clone_renku_repository(
366+
url=url,
367+
path=get_cache_directory_for_repository(client=client, url=url),
368+
gitlab_token=self._gitlab_token,
369+
deployment_hostname=parsed_uri.netloc,
370+
depth=None,
371+
reuse_existing_repository=True,
372+
use_renku_credentials=True,
373+
)
374+
except errors.GitError:
375+
pass
376+
else:
377+
self._project_url = url
378+
break
378379

379380
if self._project_url is None or repository is None:
380381
raise errors.ParameterError("Cannot clone remote projects:\n\t" + "\n\t".join(urls), param_hint=self._uri)

renku/core/session/session.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,6 @@
2121
from itertools import chain
2222
from typing import Optional
2323

24-
from yaspin import yaspin
25-
2624
from renku.command.command_builder import inject
2725
from renku.core import errors
2826
from renku.core.interface.client_dispatcher import IClientDispatcher
@@ -94,7 +92,7 @@ def session_start(
9492
abort=True,
9593
)
9694

97-
with yaspin(text="Building image"):
95+
with communication.busy(msg="Building image"):
9896
_ = provider_api.build_image(client.docker_path.parent, image_name, config)
9997
else:
10098
if not provider_api.find_image(image_name, config):

renku/core/util/communication.py

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
# limitations under the License.
1818
"""Communicator classes for printing output."""
1919

20+
from contextlib import ExitStack, contextmanager
2021
from functools import wraps
2122
from threading import RLock
2223

@@ -56,6 +57,14 @@ def has_prompt(self):
5657
def prompt(self, msg, type=None, default=None, **kwargs):
5758
"""Show a message prompt."""
5859

60+
@contextmanager
61+
def busy(self, msg):
62+
"""Indicate a busy status.
63+
64+
For instance, show a spinner in the CLI.
65+
"""
66+
yield
67+
5968

6069
def lock_communication(method):
6170
"""Ensure communicator is locked."""
@@ -177,6 +186,14 @@ def finalize_progress(self, name):
177186
for listener in self._listeners:
178187
listener.finalize_progress(name)
179188

189+
@contextmanager
190+
def busy(self, msg):
191+
"""Show busy indicators."""
192+
with ExitStack() as stack:
193+
for listener in self._listeners:
194+
stack.enter_context(listener.busy(msg))
195+
yield
196+
180197
@lock_communication
181198
def disable(self):
182199
"""Disable all outputs; by default everything is enabled."""
@@ -243,7 +260,7 @@ def warn(msg):
243260

244261
@ensure_manager
245262
def error(msg):
246-
"""Write an info message to all listeners."""
263+
"""Write an error message to all listeners."""
247264
_thread_local.communication_manager.error(msg)
248265

249266

@@ -283,6 +300,14 @@ def finalize_progress(name):
283300
_thread_local.communication_manager.finalize_progress(name)
284301

285302

303+
@ensure_manager
304+
@contextmanager
305+
def busy(msg):
306+
"""Indicate busy status to all listeners."""
307+
with _thread_local.communication_manager.busy(msg):
308+
yield
309+
310+
286311
@ensure_manager
287312
def get_listeners():
288313
"""Return a list of subscribed listeners."""

renku/ui/cli/utils/callback.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,11 @@
1818
"""Communicator class for printing click output."""
1919

2020
import sys
21+
from contextlib import contextmanager
2122

2223
import click
2324
from tqdm import tqdm
25+
from yaspin import yaspin
2426

2527
import renku.ui.cli.utils.color as color
2628
from renku.core.util.communication import CommunicationCallback
@@ -93,6 +95,12 @@ def finalize_progress(self, name):
9395
self._progress_bars[name].close()
9496
del self._progress_bars[name]
9597

98+
@contextmanager
99+
def busy(self, msg):
100+
"""Indicate busy status using a spinner."""
101+
with yaspin(text=msg):
102+
yield
103+
96104

97105
class ClickCallback(StandardOutput):
98106
"""CommunicationCallback implementation for ``click`` messages."""

0 commit comments

Comments
 (0)