def main(options: argparse.Namespace) -> int: setup_bash_profile() setup_shell_profile('~/.zprofile') # This needs to happen before anything that imports zproject.settings. run(["scripts/setup/generate_secrets.py", "--development"]) create_var_directories() # The `build_emoji` script requires `emoji-datasource` package # which we install via npm; thus this step is after installing npm # packages. run(["tools/setup/emoji/build_emoji"]) # copy over static files from the zulip_bots package generate_zulip_bots_static_files() if options.is_force or need_to_run_build_pygments_data(): run(["tools/setup/build_pygments_data"]) write_new_digest( 'build_pygments_data_hash', build_pygments_data_paths(), [pygments_version], ) else: print("No need to run `tools/setup/build_pygments_data`.") if options.is_force or need_to_run_inline_email_css(): run(["scripts/setup/inline_email_css.py"]) write_new_digest( "last_email_source_files_hash", inline_email_css_paths(), ) else: print("No need to run `scripts/setup/inline_email_css.py`.") if not options.is_build_release_tarball_only: # The following block is skipped when we just need the development # environment to build a release tarball. # Need to set up Django before using template_status os.environ.setdefault("DJANGO_SETTINGS_MODULE", "zproject.settings") import django django.setup() from django.conf import settings from zerver.lib.test_fixtures import ( DEV_DATABASE, TEST_DATABASE, destroy_leaked_test_databases, ) if options.is_force or need_to_run_configure_rabbitmq( [settings.RABBITMQ_PASSWORD]): run(["scripts/setup/configure-rabbitmq"]) write_new_digest( 'last_configure_rabbitmq_hash', configure_rabbitmq_paths(), [settings.RABBITMQ_PASSWORD], ) else: print("No need to run `scripts/setup/configure-rabbitmq.") dev_template_db_status = DEV_DATABASE.template_status() if options.is_force or dev_template_db_status == 'needs_rebuild': run(["tools/setup/postgres-init-dev-db"]) run(["tools/rebuild-dev-database"]) DEV_DATABASE.write_new_db_digest() elif dev_template_db_status == 'run_migrations': DEV_DATABASE.run_db_migrations() elif dev_template_db_status == 'current': print("No need to regenerate the dev DB.") test_template_db_status = TEST_DATABASE.template_status() if options.is_force or test_template_db_status == 'needs_rebuild': run(["tools/setup/postgres-init-test-db"]) run(["tools/rebuild-test-database"]) TEST_DATABASE.write_new_db_digest() elif test_template_db_status == 'run_migrations': TEST_DATABASE.run_db_migrations() elif test_template_db_status == 'current': print("No need to regenerate the test DB.") if options.is_force or need_to_run_compilemessages(): run(["./manage.py", "compilemessages"]) write_new_digest( "last_compilemessages_hash", compilemessages_paths(), ) else: print("No need to run `manage.py compilemessages`.") destroyed = destroy_leaked_test_databases() if destroyed: print(f"Dropped {destroyed} stale test databases!") clean_unused_caches() # Keeping this cache file around can cause eslint to throw # random TypeErrors when new/updated dependencies are added if os.path.isfile('.eslintcache'): # Remove this block when # https://github.com/eslint/eslint/issues/11639 is fixed # upstream. os.remove('.eslintcache') # Clean up the root of the `var/` directory for various # testing-related files that we have migrated to # `var/<uuid>/test-backend`. print("Cleaning var/ directory files...") var_paths = glob.glob('var/test*') var_paths.append('var/bot_avatar') for path in var_paths: try: if os.path.isdir(path): shutil.rmtree(path) else: os.remove(path) except FileNotFoundError: pass version_file = os.path.join(UUID_VAR_PATH, 'provision_version') print(f'writing to {version_file}\n') open(version_file, 'w').write(PROVISION_VERSION + '\n') print() print(OKBLUE + "Zulip development environment setup succeeded!" + ENDC) return 0
def main(options: argparse.Namespace) -> int: setup_bash_profile() setup_shell_profile("~/.zprofile") # This needs to happen before anything that imports zproject.settings. run(["scripts/setup/generate_secrets.py", "--development"]) create_var_directories() # The `build_emoji` script requires `emoji-datasource` package # which we install via npm; thus this step is after installing npm # packages. run(["tools/setup/emoji/build_emoji"]) # copy over static files from the zulip_bots package generate_zulip_bots_static_files() if options.is_force or need_to_run_build_pygments_data(): run(["tools/setup/build_pygments_data"]) write_new_digest( "build_pygments_data_hash", build_pygments_data_paths(), [pygments_version], ) else: print("No need to run `tools/setup/build_pygments_data`.") if options.is_force or need_to_run_build_timezone_data(): run(["tools/setup/build_timezone_values"]) write_new_digest( "build_timezones_data_hash", build_timezones_data_paths(), [timezones_version], ) else: print("No need to run `tools/setup/build_timezone_values`.") if options.is_force or need_to_run_inline_email_css(): run(["scripts/setup/inline_email_css.py"]) write_new_digest( "last_email_source_files_hash", inline_email_css_paths(), ) else: print("No need to run `scripts/setup/inline_email_css.py`.") if not options.is_build_release_tarball_only: # The following block is skipped when we just need the development # environment to build a release tarball. # Need to set up Django before using template_status os.environ.setdefault("DJANGO_SETTINGS_MODULE", "zproject.settings") import django django.setup() from django.conf import settings from zerver.lib.test_fixtures import ( DEV_DATABASE, TEST_DATABASE, destroy_leaked_test_databases, ) if options.is_force or need_to_run_configure_rabbitmq( [settings.RABBITMQ_PASSWORD]): run_as_root(["scripts/setup/configure-rabbitmq"]) write_new_digest( "last_configure_rabbitmq_hash", configure_rabbitmq_paths(), [settings.RABBITMQ_PASSWORD], ) else: print("No need to run `scripts/setup/configure-rabbitmq.") dev_template_db_status = DEV_DATABASE.template_status() if options.is_force or dev_template_db_status == "needs_rebuild": run(["tools/setup/postgresql-init-dev-db"]) if options.skip_dev_db_build: # We don't need to build the manual development # database on continuous integration for running tests, so we can # just leave it as a template db and save a minute. # # Important: We don't write a digest as that would # incorrectly claim that we ran migrations. pass else: run(["tools/rebuild-dev-database"]) DEV_DATABASE.write_new_db_digest() elif dev_template_db_status == "run_migrations": DEV_DATABASE.run_db_migrations() elif dev_template_db_status == "current": print("No need to regenerate the dev DB.") test_template_db_status = TEST_DATABASE.template_status() if options.is_force or test_template_db_status == "needs_rebuild": run(["tools/setup/postgresql-init-test-db"]) run(["tools/rebuild-test-database"]) TEST_DATABASE.write_new_db_digest() elif test_template_db_status == "run_migrations": TEST_DATABASE.run_db_migrations() elif test_template_db_status == "current": print("No need to regenerate the test DB.") if options.is_force or need_to_run_compilemessages(): run(["./manage.py", "compilemessages"]) write_new_digest( "last_compilemessages_hash", compilemessages_paths(), ) else: print("No need to run `manage.py compilemessages`.") destroyed = destroy_leaked_test_databases() if destroyed: print(f"Dropped {destroyed} stale test databases!") clean_unused_caches.main( argparse.Namespace( threshold_days=6, # The defaults here should match parse_cache_script_args in zulip_tools.py dry_run=False, verbose=False, no_headings=True, )) # Keeping this cache file around can cause eslint to throw # random TypeErrors when new/updated dependencies are added if os.path.isfile(".eslintcache"): # Remove this block when # https://github.com/eslint/eslint/issues/11639 is fixed # upstream. os.remove(".eslintcache") # Clean up the root of the `var/` directory for various # testing-related files that we have migrated to # `var/<uuid>/test-backend`. print("Cleaning var/ directory files...") var_paths = glob.glob("var/test*") var_paths.append("var/bot_avatar") for path in var_paths: try: if os.path.isdir(path): shutil.rmtree(path) else: os.remove(path) except FileNotFoundError: pass version_file = os.path.join(UUID_VAR_PATH, "provision_version") print(f"writing to {version_file}\n") with open(version_file, "w") as f: f.write(PROVISION_VERSION + "\n") print() print(OKBLUE + "Zulip development environment setup succeeded!" + ENDC) return 0