From c8ef8224d473b6b087fce2343f87e90acbdb5a93 Mon Sep 17 00:00:00 2001 From: Aradhya Tripathi <67282231+Aradhya-Tripathi@users.noreply.github.com> Date: Tue, 19 Apr 2022 22:31:51 +0530 Subject: [PATCH] fix: fixed org, branch for apps mounted on disk (#1293) * fix: fixed org, branch for apps mounted on disk * fix: DRY-er code * fix: fixed loading apps when use_ssh is true * fix: removed flaky tests to test dependencies * fix: removed exception if app not found in frappe or erpnext org * fix: remote server * test: Updated tests fix: tests * fix: raise when org is not found * fix: setup requirements * fix: falling back to original method of mounted app initialization if git repo isn't found --- bench/app.py | 42 +++++++++++++++++++-------------------- bench/bench.py | 3 ++- bench/tests/test_init.py | 3 ++- bench/tests/test_utils.py | 9 --------- bench/utils/__init__.py | 2 +- 5 files changed, 25 insertions(+), 34 deletions(-) diff --git a/bench/app.py b/bench/app.py index 3321fab9..de5b1d92 100755 --- a/bench/app.py +++ b/bench/app.py @@ -14,6 +14,7 @@ from urllib.parse import urlparse # imports - third party imports import click +from git import Repo # imports - module imports import bench @@ -75,10 +76,10 @@ class AppMeta: if ( not self.to_clone and hasattr(self, "bench") - and os.path.exists(os.path.join(self.bench.name, "apps", self.name)) + and os.path.exists(self.mount_path) ): self.from_apps = True - self._setup_details_from_installed_apps() + self._setup_details_from_mounted_disk() # fetch meta for repo on mounted disk elif os.path.exists(self.mount_path): @@ -88,8 +89,6 @@ class AppMeta: # fetch meta for repo from remote git server - traditional get-app url elif is_git_url(self.name): self.is_url = True - if self.name.startswith("git@") or self.name.startswith("ssh://"): - self.use_ssh = True self._setup_details_from_git_url() # fetch meta from new styled name tags & first party apps on github @@ -97,39 +96,38 @@ class AppMeta: self._setup_details_from_name_tag() def _setup_details_from_mounted_disk(self): - self.org, self.repo, self.tag = os.path.split(self.mount_path)[-2:] + (self.branch,) + # If app is a git repo + self.git_repo = Repo(self.mount_path) + try: + self._setup_details_from_git_url(self.git_repo.remotes[0].url) + if not (self.branch or self.tag): + self.tag = self.branch = self.git_repo.active_branch.name + except IndexError: + self.org, self.repo, self.tag = os.path.split(self.mount_path)[-2:] + (self.branch,) def _setup_details_from_name_tag(self): self.org, self.repo, self.tag = fetch_details_from_tag(self.name) self.tag = self.tag or self.branch - def _setup_details_from_installed_apps(self): - self.org, self.repo, self.tag = os.path.split( - os.path.join(self.bench.name, "apps", self.name) - )[-2:] + (self.branch,) + def _setup_details_from_git_url(self, url=None): + return self.__setup_details_from_git(url) - def _setup_details_from_git_url(self): - return self.__setup_details_from_git() - - def __setup_details_from_git(self): - if self.use_ssh: - _first_part, _second_part = self.name.split(":") + def __setup_details_from_git(self, url=None): + name = url if url else self.name + if name.startswith("git@") or name.startswith("ssh://"): + self.use_ssh = True + _first_part, _second_part = name.split(":") self.remote_server = _first_part.split("@")[-1] self.org, _repo = _second_part.rsplit("/", 1) else: - self.remote_server, self.org, _repo = self.name.rsplit("/", 2) + protocal = "https://" if "https://" in name else "http://" + self.remote_server, self.org, _repo = name.replace(protocal, "").rsplit("/", 2) self.tag = self.branch self.repo = _repo.split(".")[0] @property def url(self): - if self.from_apps: - return os.path.abspath(os.path.join("apps", self.name)) - - if self.on_disk: - return self.mount_path - if self.is_url: return self.name diff --git a/bench/bench.py b/bench/bench.py index 110d2859..9d8d23de 100644 --- a/bench/bench.py +++ b/bench/bench.py @@ -412,7 +412,8 @@ class BenchSetup(Base): print(f"Installing {len(apps)} applications...") for app in apps: - App(app, bench=self.bench, to_clone=False).install( + path_to_app = os.path.join(self.bench.name, "apps", app) + App(path_to_app, bench=self.bench, to_clone=False).install( skip_assets=True, restart_bench=False, ignore_resolution=True ) diff --git a/bench/tests/test_init.py b/bench/tests/test_init.py index e3002307..329fedae 100755 --- a/bench/tests/test_init.py +++ b/bench/tests/test_init.py @@ -38,7 +38,8 @@ class TestBenchInit(TestBenchBase): def test_init(self, bench_name="test-bench", **kwargs): self.init_bench(bench_name, **kwargs) app = App("file:///tmp/frappe") - self.assertEqual(app.url, "/tmp/frappe") + self.assertEqual(app.mount_path, "/tmp/frappe") + self.assertEqual(app.url, "https://github.com/frappe/frappe.git") self.assert_folders(bench_name) self.assert_virtual_env(bench_name) self.assert_config(bench_name) diff --git a/bench/tests/test_utils.py b/bench/tests/test_utils.py index d61e714b..3c2b3307 100644 --- a/bench/tests/test_utils.py +++ b/bench/tests/test_utils.py @@ -73,12 +73,3 @@ class TestUtils(unittest.TestCase): self.assertEqual("11.0", fake_bench.apps.states["frappe"]["version"]) shutil.rmtree(bench_dir) - - def test_get_dependencies(self): - git_url = "https://github.com/frappe/healthcare" - branch = "develop" - fake_app = App(git_url, branch=branch) - self.assertIn("erpnext", fake_app._get_dependencies()) - git_url = git_url.replace("healthcare", "erpnext") - fake_app = App(git_url) - self.assertTrue(len(fake_app._get_dependencies()) == 0) diff --git a/bench/utils/__init__.py b/bench/utils/__init__.py index 169ba04a..45cd1dce 100644 --- a/bench/utils/__init__.py +++ b/bench/utils/__init__.py @@ -434,7 +434,7 @@ def find_org(org_repo): if res.ok: return org, org_repo - raise InvalidRemoteException(f"{org_repo} Not foung in frappe or erpnext") + raise InvalidRemoteException(f"{org_repo} not found in frappe or erpnext") def fetch_details_from_tag(_tag: str) -> Tuple[str, str, str]: