From 87765f797a15db146171747216029816bb853951 Mon Sep 17 00:00:00 2001 From: TG1999 Date: Mon, 3 Aug 2020 17:50:33 +0530 Subject: [PATCH] Add support for git URLs Signed-off-by: TG1999 --- fetchcode/vcs/git.py | 39 +++++++++++++++++++ tests/test_vcs_git.py | 91 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 130 insertions(+) create mode 100644 fetchcode/vcs/git.py create mode 100644 tests/test_vcs_git.py diff --git a/fetchcode/vcs/git.py b/fetchcode/vcs/git.py new file mode 100644 index 00000000..9d9c6cca --- /dev/null +++ b/fetchcode/vcs/git.py @@ -0,0 +1,39 @@ +# fetchcode is a free software tool from nexB Inc. and others. +# Visit https://github.com/nexB/fetchcode for support and download. +# +# Copyright (c) nexB Inc. and others. All rights reserved. +# http://nexb.com and http://aboutcode.org +# +# This software is licensed under the Apache License version 2.0. +# +# You may not use this software except in compliance with the License. +# You may obtain a copy of the License at: +# http://apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software distributed +# under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +# CONDITIONS OF ANY KIND, either express or implied. See the License for the +# specific language governing permissions and limitations under the License. + +import os +import tempfile +from urllib.parse import urlparse + +from fetchcode.vcs.pip._internal.vcs.git import Git +from fetchcode.vcs.pip._internal.utils import misc +from fetchcode.vcs.pip._internal.vcs import vcs +from fetchcode.vcs import VCSResponse + + +def fetch_via_git(url): + parsed_url = urlparse(url) + scheme = parsed_url.scheme + domain = parsed_url.netloc + temp = tempfile.mkdtemp() + os.rmdir(temp) + if scheme not in Git.schemes: + raise Exception("Not a Git based scheme.") + + backend = vcs.get_backend(name="git") + backend.obtain(dest=temp, url=misc.hide_url(url)) + + return VCSResponse(dest_dir=temp, vcs_type="git", domain=domain) diff --git a/tests/test_vcs_git.py b/tests/test_vcs_git.py new file mode 100644 index 00000000..ec7dcdfd --- /dev/null +++ b/tests/test_vcs_git.py @@ -0,0 +1,91 @@ +# fetchcode is a free software tool from nexB Inc. and others. +# Visit https://github.com/nexB/fetchcode for support and download. +# +# Copyright (c) nexB Inc. and others. All rights reserved. +# http://nexb.com and http://aboutcode.org +# +# This software is licensed under the Apache License version 2.0. +# +# You may not use this software except in compliance with the License. +# You may obtain a copy of the License at: +# http://apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software distributed +# under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +# CONDITIONS OF ANY KIND, either express or implied. See the License for the +# specific language governing permissions and limitations under the License. + +from unittest import mock + +import pytest + +from fetchcode.vcs.git import fetch_via_git + + +def obtain(dest, url): + pass + + +@mock.patch("fetchcode.vcs.git.vcs.get_backend") +def test_fetch_with_git_http_url_returns_a_response(mock_backend): + mock_backend.return_value.obtain = obtain + url = "git+http://github.com/jamesor/mongoose-versioner" + response = fetch_via_git(url=url) + assert response.vcs_type == "git" + assert response.domain == "github.com" + + +@mock.patch("fetchcode.vcs.git.vcs.get_backend") +def test_fetch_with_git_url_returns_a_response(mock_backend): + mock_backend.return_value.obtain = obtain + url = "git://github.com/jamesor/mongoose-versioner" + response = fetch_via_git(url=url) + assert response.vcs_type == "git" + assert response.domain == "github.com" + + +@mock.patch("fetchcode.vcs.git.vcs.get_backend") +def test_fetch_with_git_https_url_returns_a_response(mock_backend): + mock_backend.return_value.obtain = obtain + url = "git+https://github.com/jamesor/mongoose-versioner" + response = fetch_via_git(url=url) + assert response.vcs_type == "git" + assert response.domain == "github.com" + + +@mock.patch("fetchcode.vcs.git.vcs.get_backend") +def test_fetch_with_git_ssh_url_returns_a_response(mock_backend): + mock_backend.return_value.obtain = obtain + url = "git+ssh://github.com/jamesor/mongoose-versioner" + response = fetch_via_git(url=url) + assert response.vcs_type == "git" + assert response.domain == "github.com" + + +@mock.patch("fetchcode.vcs.git.vcs.get_backend") +def test_fetch_with_git_file_url_returns_a_response(mock_backend): + mock_backend.return_value.obtain = obtain + url = "git+file://github.com/jamesor/mongoose-versioner" + response = fetch_via_git(url=url) + assert response.vcs_type == "git" + assert response.domain == "github.com" + + +@mock.patch("fetchcode.vcs.git.vcs.get_backend") +def test_fetch_with_git_ssh_url_returns_a_response(mock_backend): + mock_backend.return_value.obtain = obtain + url = "git+git://github.com/jamesor/mongoose-versioner" + response = fetch_via_git(url=url) + assert response.vcs_type == "git" + assert response.domain == "github.com" + + +def test_fetch_with_git_invalid_scheme(): + invalid_urls = [ + "https://github.com/TG1999/fetchcode", + "https://bitbucket.org/TG1999/fetchcode", + "https://gitlab.com/TG1999/fetchcode", + ] + with pytest.raises(Exception) as e_info: + for url in invalid_urls: + fetch_via_git(url) + assert "Not a Git based scheme." == e_info