diff --git a/swh/loader/bzr/loader.py b/swh/loader/bzr/loader.py --- a/swh/loader/bzr/loader.py +++ b/swh/loader/bzr/loader.py @@ -10,11 +10,10 @@ from functools import lru_cache, partial import os from tempfile import mkdtemp -from typing import Dict, Iterator, List, NewType, Optional, Set, TypeVar, Union +from typing import Callable, Dict, Iterator, List, NewType, Optional, Set, TypeVar, Union from breezy import errors as bzr_errors from breezy import repository, tsort -from breezy.builtins import cmd_clone from breezy.bzr import bzrdir from breezy.bzr.branch import Branch as BzrBranch from breezy.bzr.inventory import Inventory, InventoryEntry @@ -86,6 +85,21 @@ check before dismissing the repository as broken or unsupported.""" +def bzr_clone(origin_url: str, repo_directory: str) -> Callable: + """Bazaar clone function""" + try: + from breezy.builtins import cmd_clone + closure_clone = partial(cmd_clone().run, origin_url, repo_directory) + except ImportError: + # stable python3.breezy does not define the cmd_clone yet + # fallback + def closure_clone(): + from subprocess import run + run(["bzr", "clone", origin_url, repo_directory]) + + return closure_clone + + class BzrDirectory(from_disk.Directory): """A more practical directory. @@ -263,9 +277,9 @@ self.log.debug( msg, self.origin_url, self._repo_directory, self._clone_timeout ) - closure = partial(cmd_clone().run, self.origin_url, self._repo_directory) + closure_clone = bzr_clone(self.origin_url, self._repo_directory) clone_with_timeout( - self.origin_url, self._repo_directory, closure, self._clone_timeout + self.origin_url, self._repo_directory, closure_clone, self._clone_timeout ) else: # existing local repository # Allow to load on disk repository without cloning