2
0
mirror of https://github.com/frappe/bench.git synced 2024-09-24 21:19:00 +00:00

Merge pull request #1304 from Aradhya-Tripathi/fixes

fix: removed unnecessary requests while removing apps
This commit is contained in:
gavin 2022-05-10 13:01:49 +05:30 committed by GitHub
commit f6a0471de8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 57 additions and 21 deletions

View File

@ -11,6 +11,7 @@ import typing
from collections import OrderedDict from collections import OrderedDict
from datetime import date from datetime import date
from urllib.parse import urlparse from urllib.parse import urlparse
import os
# imports - third party imports # imports - third party imports
import click import click
@ -66,6 +67,8 @@ class AppMeta:
self.from_apps = False self.from_apps = False
self.is_url = False self.is_url = False
self.branch = branch self.branch = branch
self.app_name = None
self.git_repo = None
self.mount_path = os.path.abspath( self.mount_path = os.path.abspath(
os.path.join(urlparse(self.name).netloc, urlparse(self.name).path) os.path.join(urlparse(self.name).netloc, urlparse(self.name).path)
) )
@ -73,11 +76,10 @@ class AppMeta:
def setup_details(self): def setup_details(self):
# fetch meta from installed apps # fetch meta from installed apps
if ( if self.bench and os.path.exists(
not self.to_clone os.path.join(self.bench.name, "apps", self.name)
and hasattr(self, "bench")
and os.path.exists(self.mount_path)
): ):
self.mount_path = os.path.join(self.bench.name, "apps", self.name)
self.from_apps = True self.from_apps = True
self._setup_details_from_mounted_disk() self._setup_details_from_mounted_disk()
@ -95,6 +97,13 @@ class AppMeta:
else: else:
self._setup_details_from_name_tag() 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): def _setup_details_from_mounted_disk(self):
# If app is a git repo # If app is a git repo
self.git_repo = Repo(self.mount_path) self.git_repo = Repo(self.mount_path)
@ -116,7 +125,7 @@ class AppMeta:
name = url if url else self.name name = url if url else self.name
if name.startswith("git@") or name.startswith("ssh://"): if name.startswith("git@") or name.startswith("ssh://"):
self.use_ssh = True 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.remote_server = _first_part.split("@")[-1]
self.org, _repo = _second_part.rsplit("/", 1) self.org, _repo = _second_part.rsplit("/", 1)
else: else:
@ -187,7 +196,7 @@ class App(AppMeta):
from bench.utils.app import get_app_name from bench.utils.app import get_app_name
verbose = bench.cli.verbose or verbose 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: if not resolved and self.repo != "frappe" and not ignore_resolution:
click.secho( click.secho(
f"Ignoring dependencies of {self.name}. To install dependencies use --resolve-deps", f"Ignoring dependencies of {self.name}. To install dependencies use --resolve-deps",
@ -231,7 +240,9 @@ class App(AppMeta):
def update_app_state(self): def update_app_state(self):
from bench.bench import Bench from bench.bench import Bench
bench = Bench(self.bench.name) 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"): def make_resolution_plan(app: App, bench: "Bench"):
@ -540,7 +551,7 @@ def install_app(
if os.path.exists(os.path.join(app_path, "package.json")): if os.path.exists(os.path.join(app_path, "package.json")):
bench.run("yarn install", cwd=app_path) 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: if not skip_assets:
build_assets(bench_path=bench_path, app=app) build_assets(bench_path=bench_path, app=app)

View File

@ -170,7 +170,13 @@ class BenchApps(MutableSequence):
except FileNotFoundError: except FileNotFoundError:
self.states = {} 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: 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): if self.apps and not os.path.exists(self.states_path):
# idx according to apps listed in apps.txt (backwards compatibility) # idx according to apps listed in apps.txt (backwards compatibility)
# Keeping frappe as the first app. # Keeping frappe as the first app.
@ -200,10 +206,13 @@ class BenchApps(MutableSequence):
for app in apps_to_remove: for app in apps_to_remove:
del self.states[app] 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: if app_name and app_name not in self.states:
version = get_current_version(app_name, self.bench.name) 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: if not branch:
branch = ( branch = (
subprocess subprocess
@ -227,11 +236,24 @@ class BenchApps(MutableSequence):
with open(self.states_path, "w") as f: with open(self.states_path, "w") as f:
f.write(json.dumps(self.states, indent=4)) 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() self.initialize_apps()
with open(self.bench.apps_txt, "w") as f: with open(self.bench.apps_txt, "w") as f:
f.write("\n".join(self.apps)) 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): def initialize_apps(self):
is_installed = lambda app: app in installed_packages is_installed = lambda app: app in installed_packages
@ -413,7 +435,7 @@ class BenchSetup(Base):
for app in apps: for app in apps:
path_to_app = os.path.join(self.bench.name, "apps", app) 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 skip_assets=True, restart_bench=False, ignore_resolution=True
) )

View File

@ -12,6 +12,7 @@ from bench.utils import exec_cmd
from bench.release import get_bumped_version from bench.release import get_bumped_version
from bench.app import App from bench.app import App
from bench.tests.test_base import FRAPPE_BRANCH, TestBenchBase 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, # 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_folders(bench_name)
self.assert_virtual_env(bench_name) self.assert_virtual_env(bench_name)
self.assert_config(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): def basic(self):
try: try:

View File

@ -66,7 +66,7 @@ class TestUtils(unittest.TestCase):
subprocess.run(["git", "add", "."], cwd=frappe_path, capture_output=True, check=True) 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) 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("frappe", fake_bench.apps.states)
self.assertIn("version", fake_bench.apps.states["frappe"]) self.assertIn("version", fake_bench.apps.states["frappe"])

View File

@ -210,25 +210,25 @@ def get_remote(app, bench_path="."):
return contents.splitlines()[0].split()[0] 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 app_name = None
apps_path = os.path.join(os.path.abspath(bench_path), "apps") 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): if os.path.exists(config_path):
config = read_configuration(config_path) config = read_configuration(config_path)
app_name = config.get("metadata", {}).get("name") app_name = config.get("metadata", {}).get("name")
if not app_name: if not app_name:
# retrieve app name from setup.py as fallback # 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: with open(app_path, "rb") as f:
app_name = re.search(r'name\s*=\s*[\'"](.*)[\'"]', f.read().decode("utf-8")).group(1) app_name = re.search(r'name\s*=\s*[\'"](.*)[\'"]', f.read().decode("utf-8")).group(1)
if app_name and repo_name != app_name: if app_name and folder_name != app_name:
os.rename(os.path.join(apps_path, repo_name), os.path.join(apps_path, app_name)) os.rename(os.path.join(apps_path, folder_name), os.path.join(apps_path, app_name))
return app_name return app_name
return repo_name return folder_name
def check_existing_dir(bench_path, repo_name): def check_existing_dir(bench_path, repo_name):
cloned_path = os.path.join(bench_path, "apps", repo_name) cloned_path = os.path.join(bench_path, "apps", repo_name)