mirror of
https://github.com/frappe/bench.git
synced 2025-01-27 08:18:25 +00:00
128 lines
4.9 KiB
Python
Executable File
128 lines
4.9 KiB
Python
Executable File
# imports - third party imports
|
|
import click
|
|
|
|
|
|
@click.command('init', help='Initialize a new bench instance in the specified path')
|
|
@click.argument('path')
|
|
@click.option('--version', '--frappe-branch', 'frappe_branch', default=None, help="Clone a particular branch of frappe")
|
|
@click.option('--ignore-exist', is_flag = True, default = False, help = "Ignore if Bench instance exists.")
|
|
@click.option('--python', type = str, default = 'python3', help = 'Path to Python Executable.')
|
|
@click.option('--apps_path', default=None, help="path to json files with apps to install after init")
|
|
@click.option('--frappe-path', default=None, help="path to frappe repo")
|
|
@click.option('--clone-from', default=None, help="copy repos from path")
|
|
@click.option('--clone-without-update', is_flag=True, help="copy repos from path without update")
|
|
@click.option('--no-procfile', is_flag=True, help="Do not create a Procfile")
|
|
@click.option('--no-backups',is_flag=True, help="Do not set up automatic periodic backups for all sites on this bench")
|
|
@click.option('--skip-redis-config-generation', is_flag=True, help="Skip redis config generation if already specifying the common-site-config file")
|
|
@click.option('--skip-assets',is_flag=True, default=False, help="Do not build assets")
|
|
@click.option('--verbose',is_flag=True, help="Verbose output during install")
|
|
def init(path, apps_path, frappe_path, frappe_branch, no_procfile, no_backups, clone_from, verbose, skip_redis_config_generation, clone_without_update, ignore_exist=False, skip_assets=False, python='python3'):
|
|
import os
|
|
from bench.utils import init, log
|
|
|
|
if not ignore_exist and os.path.exists(path):
|
|
log(f"Bench instance already exists at {path}", level=2)
|
|
return
|
|
|
|
try:
|
|
init(
|
|
path,
|
|
apps_path=apps_path, # can be used from --config flag? Maybe config file could have more info?
|
|
no_procfile=no_procfile,
|
|
no_backups=no_backups,
|
|
frappe_path=frappe_path,
|
|
frappe_branch=frappe_branch,
|
|
clone_from=clone_from,
|
|
skip_redis_config_generation=skip_redis_config_generation,
|
|
clone_without_update=clone_without_update,
|
|
skip_assets=skip_assets,
|
|
python=python,
|
|
verbose=verbose,
|
|
)
|
|
log(f'Bench {path} initialized', level=1)
|
|
except SystemExit:
|
|
raise
|
|
except Exception as e:
|
|
import os, shutil, time
|
|
# add a sleep here so that the traceback of other processes doesnt overlap with the prompts
|
|
time.sleep(1)
|
|
print(e)
|
|
log(f"There was a problem while creating {path}", level=2)
|
|
if click.confirm("Do you want to rollback these changes?"):
|
|
print(f'Rolling back Bench "{path}"')
|
|
if os.path.exists(path):
|
|
shutil.rmtree(path)
|
|
|
|
|
|
@click.command('drop')
|
|
@click.argument('path')
|
|
def drop(path):
|
|
from bench.bench import Bench
|
|
from bench.exceptions import BenchNotFoundError, ValidationError
|
|
|
|
bench = Bench(path)
|
|
|
|
if not bench.exists:
|
|
raise BenchNotFoundError(f"Bench {bench.name} does not exist")
|
|
|
|
if bench.sites:
|
|
raise ValidationError("Cannot remove non-empty bench directory")
|
|
|
|
bench.drop()
|
|
|
|
print('Bench dropped')
|
|
|
|
|
|
|
|
@click.command(['get', 'get-app'], help='Clone an app from the internet or filesystem and set it up in your bench')
|
|
@click.argument('name', nargs=-1) # Dummy argument for backward compatibility
|
|
@click.argument('git-url')
|
|
@click.option('--branch', default=None, help="branch to checkout")
|
|
@click.option('--overwrite', is_flag=True, default=False)
|
|
@click.option('--skip-assets', is_flag=True, default=False, help="Do not build assets")
|
|
def get_app(git_url, branch, name=None, overwrite=False, skip_assets=False):
|
|
"clone an app from the internet and set it up in your bench"
|
|
from bench.app import get_app
|
|
get_app(git_url, branch=branch, skip_assets=skip_assets, overwrite=overwrite)
|
|
|
|
|
|
@click.command('new-app', help='Create a new Frappe application under apps folder')
|
|
@click.argument('app-name')
|
|
def new_app(app_name):
|
|
from bench.app import new_app
|
|
new_app(app_name)
|
|
|
|
|
|
@click.command('remove-app', help='Completely remove app from bench and re-build assets if not installed on any site')
|
|
@click.argument('app-name')
|
|
def remove_app(app_name):
|
|
from bench.bench import Bench
|
|
bench = Bench(".")
|
|
bench.uninstall(app_name)
|
|
|
|
|
|
@click.command('exclude-app', help='Exclude app from updating')
|
|
@click.argument('app_name')
|
|
def exclude_app_for_update(app_name):
|
|
from bench.app import add_to_excluded_apps_txt
|
|
add_to_excluded_apps_txt(app_name)
|
|
|
|
|
|
@click.command('include-app', help='Include app for updating')
|
|
@click.argument('app_name')
|
|
def include_app_for_update(app_name):
|
|
"Include app from updating"
|
|
from bench.app import remove_from_excluded_apps_txt
|
|
remove_from_excluded_apps_txt(app_name)
|
|
|
|
|
|
@click.command('pip', context_settings={"ignore_unknown_options": True}, help="For pip help use `bench pip help [COMMAND]` or `bench pip [COMMAND] -h`")
|
|
@click.argument('args', nargs=-1)
|
|
@click.pass_context
|
|
def pip(ctx, args):
|
|
"Run pip commands in bench env"
|
|
import os
|
|
from bench.utils import get_env_cmd
|
|
env_py = get_env_cmd('python')
|
|
os.execv(env_py, (env_py, '-m', 'pip') + args)
|