Uh oh!
There was an error while loading.Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork939
Quote URLs in Repo.clone_from()#1516
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to ourterms of service andprivacy statement. We’ll occasionally send you account related emails.
Already on GitHub?Sign in to your account
Uh oh!
There was an error while loading.Please reload this page.
Changes fromall commits
File filter
Filter by extension
Conversations
Uh oh!
There was an error while loading.Please reload this page.
Jump to
Uh oh!
There was an error while loading.Please reload this page.
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -21,7 +21,12 @@ | ||
) | ||
from git.config import GitConfigParser | ||
from git.db import GitCmdObjectDB | ||
from git.exc import ( | ||
GitCommandError, | ||
InvalidGitRepositoryError, | ||
NoSuchPathError, | ||
UnsafeOptionsUsedError, | ||
) | ||
from git.index import IndexFile | ||
from git.objects import Submodule, RootModule, Commit | ||
from git.refs import HEAD, Head, Reference, TagReference | ||
@@ -128,6 +133,7 @@ class Repo(object): | ||
re_envvars = re.compile(r"(\$(\{\s?)?[a-zA-Z_]\w*(\}\s?)?|%\s?[a-zA-Z_]\w*\s?%)") | ||
re_author_committer_start = re.compile(r"^(author|committer)") | ||
re_tab_full_line = re.compile(r"^\t(.*)$") | ||
re_config_protocol_option = re.compile(r"-[-]?c(|onfig)\s+protocol\.", re.I) | ||
# invariants | ||
# represents the configuration level of a configuration file | ||
@@ -1214,11 +1220,27 @@ def _clone( | ||
# END handle remote repo | ||
return repo | ||
@classmethod | ||
def unsafe_options( | ||
cls, | ||
url: str, | ||
multi_options: Optional[List[str]] = None, | ||
) -> bool: | ||
if "ext::" in url: | ||
return True | ||
if multi_options is not None: | ||
if any(["--upload-pack" in m for m in multi_options]): | ||
return True | ||
if any([re.match(cls.re_config_protocol_option, m) for m in multi_options]): | ||
return True | ||
return False | ||
def clone( | ||
self, | ||
path: PathLike, | ||
progress: Optional[Callable] = None, | ||
multi_options: Optional[List[str]] = None, | ||
unsafe_protocols: bool = False, | ||
**kwargs: Any, | ||
) -> "Repo": | ||
"""Create a clone from this repository. | ||
@@ -1229,12 +1251,15 @@ def clone( | ||
option per list item which is passed exactly as specified to clone. | ||
For example ['--config core.filemode=false', '--config core.ignorecase', | ||
'--recurse-submodule=repo1_path', '--recurse-submodule=repo2_path'] | ||
:param unsafe_protocols: Allow unsafe protocols to be used, like ext | ||
:param kwargs: | ||
* odbt = ObjectDatabase Type, allowing to determine the object database | ||
implementation used by the returned Repo instance | ||
* All remaining keyword arguments are given to the git-clone command | ||
:return: ``git.Repo`` (the newly cloned repo)""" | ||
if not unsafe_protocols and self.unsafe_options(path, multi_options): | ||
raise UnsafeOptionsUsedError(f"{path} requires unsafe_protocols flag") | ||
return self._clone( | ||
self.git, | ||
self.common_dir, | ||
@@ -1253,6 +1278,7 @@ def clone_from( | ||
progress: Optional[Callable] = None, | ||
env: Optional[Mapping[str, str]] = None, | ||
multi_options: Optional[List[str]] = None, | ||
unsafe_protocols: bool = False, | ||
**kwargs: Any, | ||
) -> "Repo": | ||
"""Create a clone from the given URL | ||
@@ -1267,11 +1293,14 @@ def clone_from( | ||
If you want to unset some variable, consider providing empty string | ||
as its value. | ||
:param multi_options: See ``clone`` method | ||
:param unsafe_protocols: Allow unsafe protocols to be used, like ext | ||
:param kwargs: see the ``clone`` method | ||
:return: Repo instance pointing to the cloned directory""" | ||
git = cls.GitCommandWrapperType(os.getcwd()) | ||
if env is not None: | ||
git.update_environment(**env) | ||
if not unsafe_protocols and cls.unsafe_options(url, multi_options): | ||
raise UnsafeOptionsUsedError(f"{url} requires unsafe_protocols flag") | ||
Comment on lines +1302 to +1303 There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others.Learn more. these checks could probably be moved to the | ||
return cls._clone(git, url, to_path, GitCmdObjectDB, progress, multi_options, **kwargs) | ||
def archive( | ||