From 49900ce74b6dcc109b5d5a2092fc9e35fb211a30 Mon Sep 17 00:00:00 2001 From: Aradhya Date: Wed, 4 May 2022 18:08:13 +0530 Subject: [PATCH 01/10] fix: removed unnecessary requests while removing apps --- bench/bench.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/bench/bench.py b/bench/bench.py index 9d8d23de..75d002f9 100644 --- a/bench/bench.py +++ b/bench/bench.py @@ -123,7 +123,8 @@ class Bench(Base, Validator): from bench.app import App self.validate_app_uninstall(app) - self.apps.remove(App(app, bench=self, to_clone=False)) + path_to_app = os.path.join(self.name, "apps", app) + self.apps.remove(App(path_to_app, bench=self, to_clone=False)) self.apps.sync() # self.build() - removed because it seems unnecessary self.reload() From b36c0723bec3c2a9229a3556151a5be29cc437c0 Mon Sep 17 00:00:00 2001 From: Aradhya Date: Thu, 5 May 2022 19:57:37 +0530 Subject: [PATCH 02/10] feat: Made dynamic mount path if bench attr is passed to App class --- bench/app.py | 7 +++---- bench/bench.py | 3 +-- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/bench/app.py b/bench/app.py index de5b1d92..1acb8b65 100755 --- a/bench/app.py +++ b/bench/app.py @@ -73,11 +73,10 @@ class AppMeta: def setup_details(self): # fetch meta from installed apps - if ( - not self.to_clone - and hasattr(self, "bench") - and os.path.exists(self.mount_path) + if hasattr(self, "bench") and os.path.exists( + os.path.join(self.bench.name, "apps", self.name) ): + self.mount_path = os.path.join(self.bench.name, "apps", self.name) self.from_apps = True self._setup_details_from_mounted_disk() diff --git a/bench/bench.py b/bench/bench.py index 75d002f9..9d8d23de 100644 --- a/bench/bench.py +++ b/bench/bench.py @@ -123,8 +123,7 @@ class Bench(Base, Validator): from bench.app import App self.validate_app_uninstall(app) - path_to_app = os.path.join(self.name, "apps", app) - self.apps.remove(App(path_to_app, bench=self, to_clone=False)) + self.apps.remove(App(app, bench=self, to_clone=False)) self.apps.sync() # self.build() - removed because it seems unnecessary self.reload() From 66157f6c920f6d9c7781e6dea7cbd588258c8ac3 Mon Sep 17 00:00:00 2001 From: Aradhya Date: Thu, 5 May 2022 20:21:39 +0530 Subject: [PATCH 03/10] test: updated tests for App init --- bench/app.py | 2 +- bench/tests/test_init.py | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/bench/app.py b/bench/app.py index 315eec6c..47aef9a3 100755 --- a/bench/app.py +++ b/bench/app.py @@ -73,7 +73,7 @@ class AppMeta: def setup_details(self): # fetch meta from installed apps - if hasattr(self, "bench") and os.path.exists( + if self.bench and os.path.exists( os.path.join(self.bench.name, "apps", self.name) ): self.mount_path = os.path.join(self.bench.name, "apps", self.name) diff --git a/bench/tests/test_init.py b/bench/tests/test_init.py index 329fedae..0e2f1964 100755 --- a/bench/tests/test_init.py +++ b/bench/tests/test_init.py @@ -12,6 +12,7 @@ from bench.utils import exec_cmd from bench.release import get_bumped_version from bench.app import App from bench.tests.test_base import FRAPPE_BRANCH, TestBenchBase +from bench.bench import Bench # changed from frappe_theme because it wasn't maintained and incompatible, @@ -43,7 +44,9 @@ class TestBenchInit(TestBenchBase): self.assert_folders(bench_name) self.assert_virtual_env(bench_name) self.assert_config(bench_name) - + test_bench = Bench(bench_name) + app = App("frappe", bench=test_bench) + self.assertEqual(app.from_apps, True) def basic(self): try: From b8aa00898f47f9400601a5ffdbde14af0844b005 Mon Sep 17 00:00:00 2001 From: Aradhya Date: Fri, 6 May 2022 14:10:09 +0530 Subject: [PATCH 04/10] fix: reverted changes made by erroneous commit --- bench/app.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bench/app.py b/bench/app.py index 47aef9a3..bb23f70c 100755 --- a/bench/app.py +++ b/bench/app.py @@ -115,7 +115,7 @@ class AppMeta: name = url if url else self.name if name.startswith("git@") or name.startswith("ssh://"): self.use_ssh = True - _first_part, _second_part = self.name.rsplit(":", 1) + _first_part, _second_part = name.rsplit(":", 1) self.remote_server = _first_part.split("@")[-1] self.org, _repo = _second_part.rsplit("/", 1) else: From 35504f81b3340b544da87316046086a0134ae5ff Mon Sep 17 00:00:00 2001 From: Aradhya Date: Fri, 6 May 2022 22:31:42 +0530 Subject: [PATCH 05/10] feat: Added app_name attribute to App class --- bench/app.py | 13 ++++++++++++- bench/bench.py | 2 +- bench/utils/app.py | 12 ++++++------ 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/bench/app.py b/bench/app.py index bb23f70c..f00f8acc 100755 --- a/bench/app.py +++ b/bench/app.py @@ -11,6 +11,7 @@ import typing from collections import OrderedDict from datetime import date from urllib.parse import urlparse +import os # imports - third party imports import click @@ -27,6 +28,7 @@ from bench.utils import ( is_valid_frappe_branch, log, run_frappe_cmd, + is_frappe_app, ) from bench.utils.bench import ( build_assets, @@ -66,6 +68,8 @@ class AppMeta: self.from_apps = False self.is_url = False self.branch = branch + self.app_name = None + self.git_repo = None self.mount_path = os.path.abspath( os.path.join(urlparse(self.name).netloc, urlparse(self.name).path) ) @@ -94,6 +98,13 @@ class AppMeta: else: self._setup_details_from_name_tag() + if self.git_repo: + self.app_name = os.path.basename( + os.path.normpath(self.git_repo.working_tree_dir) + ) + else: + self.app_name = self.repo + def _setup_details_from_mounted_disk(self): # If app is a git repo self.git_repo = Repo(self.mount_path) @@ -186,7 +197,7 @@ class App(AppMeta): from bench.utils.app import get_app_name verbose = bench.cli.verbose or verbose - app_name = get_app_name(self.bench.name, self.repo) + app_name = get_app_name(self.bench.name, self.app_name) if not resolved and self.repo != "frappe" and not ignore_resolution: click.secho( f"Ignoring dependencies of {self.name}. To install dependencies use --resolve-deps", diff --git a/bench/bench.py b/bench/bench.py index 9d8d23de..c07fd4f4 100644 --- a/bench/bench.py +++ b/bench/bench.py @@ -413,7 +413,7 @@ class BenchSetup(Base): for app in apps: path_to_app = os.path.join(self.bench.name, "apps", app) - App(path_to_app, bench=self.bench, to_clone=False).install( + 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/utils/app.py b/bench/utils/app.py index d07422e1..158fdf96 100644 --- a/bench/utils/app.py +++ b/bench/utils/app.py @@ -210,25 +210,25 @@ def get_remote(app, bench_path="."): return contents.splitlines()[0].split()[0] -def get_app_name(bench_path, repo_name): +def get_app_name(bench_path, folder_name): app_name = None apps_path = os.path.join(os.path.abspath(bench_path), "apps") - config_path = os.path.join(apps_path, repo_name, "setup.cfg") + config_path = os.path.join(apps_path, folder_name, "setup.cfg") if os.path.exists(config_path): config = read_configuration(config_path) app_name = config.get("metadata", {}).get("name") if not app_name: # retrieve app name from setup.py as fallback - app_path = os.path.join(apps_path, repo_name, "setup.py") + app_path = os.path.join(apps_path, folder_name, "setup.py") with open(app_path, "rb") as f: app_name = re.search(r'name\s*=\s*[\'"](.*)[\'"]', f.read().decode("utf-8")).group(1) - if app_name and repo_name != app_name: - os.rename(os.path.join(apps_path, repo_name), os.path.join(apps_path, app_name)) + if app_name and folder_name != app_name: + os.rename(os.path.join(apps_path, folder_name), os.path.join(apps_path, app_name)) return app_name - return repo_name + return folder_name def check_existing_dir(bench_path, repo_name): cloned_path = os.path.join(bench_path, "apps", repo_name) From 7f374887f494d5982002ca69727a6cbeef62839a Mon Sep 17 00:00:00 2001 From: Aradhya Date: Mon, 9 May 2022 19:42:57 +0530 Subject: [PATCH 06/10] fix: fixed states sync --- bench/app.py | 2 +- bench/bench.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/bench/app.py b/bench/app.py index f00f8acc..e1ce60d1 100755 --- a/bench/app.py +++ b/bench/app.py @@ -550,7 +550,7 @@ def install_app( if os.path.exists(os.path.join(app_path, "package.json")): bench.run("yarn install", cwd=app_path) - bench.apps.sync(app, required=resolution, branch=tag) + bench.apps.sync(app_name=app, required=resolution, branch=tag, app_dir=app_path) if not skip_assets: build_assets(bench_path=bench_path, app=app) diff --git a/bench/bench.py b/bench/bench.py index c07fd4f4..6b8a5798 100644 --- a/bench/bench.py +++ b/bench/bench.py @@ -170,7 +170,7 @@ class BenchApps(MutableSequence): except FileNotFoundError: self.states = {} - def update_apps_states(self, app_name: Union[str, None] = None, branch: Union[str, None] = None, required:List = []): + def update_apps_states(self, app_dir, app_name: Union[str, None] = None, branch: Union[str, None] = None, required:List = []): if self.apps and not os.path.exists(self.states_path): # idx according to apps listed in apps.txt (backwards compatibility) # Keeping frappe as the first app. @@ -203,7 +203,7 @@ class BenchApps(MutableSequence): if app_name and app_name not in self.states: version = get_current_version(app_name, self.bench.name) - app_dir = os.path.join(self.apps_path, app_name) + app_dir = os.path.join(self.apps_path, app_dir) if not branch: branch = ( subprocess From c667be90238585cedbf36ecc61e3ba938d2076cf Mon Sep 17 00:00:00 2001 From: Aradhya Date: Mon, 9 May 2022 22:53:20 +0530 Subject: [PATCH 07/10] fix: fixed args to sync-states --- bench/app.py | 4 +++- bench/bench.py | 11 ++++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/bench/app.py b/bench/app.py index e1ce60d1..cf33a8bc 100755 --- a/bench/app.py +++ b/bench/app.py @@ -241,7 +241,9 @@ class App(AppMeta): def update_app_state(self): from bench.bench import Bench bench = Bench(self.bench.name) - bench.apps.sync(self.name, self.tag, self.local_resolution) + bench.apps.sync(app_dir=self.app_name, app_name=self.name, + branch=self.tag, required_list=self.local_resolution) + def make_resolution_plan(app: App, bench: "Bench"): diff --git a/bench/bench.py b/bench/bench.py index 6b8a5798..19728151 100644 --- a/bench/bench.py +++ b/bench/bench.py @@ -170,7 +170,13 @@ class BenchApps(MutableSequence): except FileNotFoundError: self.states = {} - def update_apps_states(self, app_dir, app_name: Union[str, None] = None, branch: Union[str, None] = None, required:List = []): + def update_apps_states( + self, + app_dir: str = None, + app_name: Union[str, None] = None, + branch: Union[str, None] = None, + required: List = [], + ): if self.apps and not os.path.exists(self.states_path): # idx according to apps listed in apps.txt (backwards compatibility) # Keeping frappe as the first app. @@ -200,6 +206,9 @@ class BenchApps(MutableSequence): for app in apps_to_remove: del self.states[app] + if app_name and not app_dir: + app_dir = app_name + if app_name and app_name not in self.states: version = get_current_version(app_name, self.bench.name) From 1cc961ea55ee22099a6f6df31f4435d1e667a8f9 Mon Sep 17 00:00:00 2001 From: Aradhya Date: Tue, 10 May 2022 02:05:25 +0530 Subject: [PATCH 08/10] style: removed unused imports --- bench/app.py | 1 - 1 file changed, 1 deletion(-) diff --git a/bench/app.py b/bench/app.py index cf33a8bc..3cc35631 100755 --- a/bench/app.py +++ b/bench/app.py @@ -28,7 +28,6 @@ from bench.utils import ( is_valid_frappe_branch, log, run_frappe_cmd, - is_frappe_app, ) from bench.utils.bench import ( build_assets, From 7980709a2075c606f894454ee15673cddd639203 Mon Sep 17 00:00:00 2001 From: Aradhya Date: Tue, 10 May 2022 02:58:30 +0530 Subject: [PATCH 09/10] fix: updated apps.sync to support new app_name parameter --- bench/bench.py | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/bench/bench.py b/bench/bench.py index 19728151..0f8d8f62 100644 --- a/bench/bench.py +++ b/bench/bench.py @@ -236,11 +236,24 @@ class BenchApps(MutableSequence): with open(self.states_path, "w") as f: f.write(json.dumps(self.states, indent=4)) - def sync(self,app_name: Union[str, None] = None, branch: Union[str, None] = None, required:List = []): + def sync( + self, + app_name: Union[str, None] = None, + app_dir: Union[str, None] = None, + branch: Union[str, None] = None, + required: List = [] + ): self.initialize_apps() + with open(self.bench.apps_txt, "w") as f: f.write("\n".join(self.apps)) - self.update_apps_states(app_name, branch, required) + + self.update_apps_states( + app_name=app_name, + app_dir=app_dir, + branch=branch, + required=required + ) def initialize_apps(self): is_installed = lambda app: app in installed_packages From 2c77dda3c02b3620007b52257c28a9c8573aafba Mon Sep 17 00:00:00 2001 From: Aradhya Date: Tue, 10 May 2022 03:03:15 +0530 Subject: [PATCH 10/10] test: updated tests --- bench/tests/test_utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bench/tests/test_utils.py b/bench/tests/test_utils.py index f91e8785..b873131d 100644 --- a/bench/tests/test_utils.py +++ b/bench/tests/test_utils.py @@ -66,7 +66,7 @@ class TestUtils(unittest.TestCase): subprocess.run(["git", "add", "."], cwd=frappe_path, capture_output=True, check=True) subprocess.run(["git", "commit", "-m", "temp"], cwd=frappe_path, capture_output=True, check=True) - fake_bench.apps.update_apps_states("frappe") + fake_bench.apps.update_apps_states(app_name="frappe") self.assertIn("frappe", fake_bench.apps.states) self.assertIn("version", fake_bench.apps.states["frappe"])