changeset 8621:3070f9bc6ebe

cli: refactor db_create to avoid app initialization in multiple places Make sure kallithea.config.application.make_app only is invoked at a high level ... and avoid references to kallithea.CONFIG.global_conf right before kallithea.CONFIG is set to a plain dict again. Click commands that have both needs_config_file=True and config_file_initialize_app=True will now be called twice - first time before setting kallithea.CONFIG but with the config dict as parameter. That seems kind of intuitive and will simplify the code and allow cleanup of config handling. Mute pytype warning: File "kallithea/bin/kallithea_cli_db.py", line 73, in db_create: No attribute 'global_conf' on Dict[nothing, nothing] [attribute-error] File "kallithea/bin/kallithea_cli_db.py", line 73, in db_create: No attribute 'local_conf' on Dict[nothing, nothing] [attribute-error]
author Mads Kiilerich <mads@kiilerich.com>
date Mon, 24 Aug 2020 13:07:08 +0200
parents a2d8c1f61657
children cd8d45d4c3cd
files kallithea/bin/kallithea_cli_base.py kallithea/bin/kallithea_cli_db.py
diffstat 2 files changed, 40 insertions(+), 39 deletions(-) [+]
line wrap: on
line diff
--- a/kallithea/bin/kallithea_cli_base.py	Mon Aug 03 20:29:20 2020 +0200
+++ b/kallithea/bin/kallithea_cli_base.py	Mon Aug 24 13:07:08 2020 +0200
@@ -77,6 +77,8 @@
                 logging.config.fileConfig(cp,
                     {'__file__': path_to_ini_file, 'here': os.path.dirname(path_to_ini_file)})
                 if config_file_initialize_app:
+                    if needs_config_file:  # special case for db creation: also call annotated function (with config parameter) *before* app initialization
+                        annotated(*args, config=kallithea.CONFIG, **kwargs)
                     kallithea.config.application.make_app(kallithea.CONFIG.global_conf, **kallithea.CONFIG.local_conf)
                 return annotated(*args, **kwargs)
             return cli_command(runtime_wrapper)
--- a/kallithea/bin/kallithea_cli_db.py	Mon Aug 03 20:29:20 2020 +0200
+++ b/kallithea/bin/kallithea_cli_db.py	Mon Aug 24 13:07:08 2020 +0200
@@ -19,7 +19,7 @@
 from kallithea.model.meta import Session
 
 
-@cli_base.register_command(needs_config_file=True)
+@cli_base.register_command(needs_config_file=True, config_file_initialize_app=True)
 @click.option('--reuse/--no-reuse', default=False,
         help='Reuse and clean existing database instead of dropping and creating (default: no reuse)')
 @click.option('--user', help='Username of administrator account.')
@@ -30,7 +30,7 @@
 @click.option('--force-no', is_flag=True, help='Answer no to every question.')
 @click.option('--public-access/--no-public-access', default=True,
         help='Enable/disable public access on this installation (default: enable)')
-def db_create(user, password, email, repos, force_yes, force_no, public_access, reuse):
+def db_create(user, password, email, repos, force_yes, force_no, public_access, reuse, config=None):
     """Initialize the database.
 
     Create all required tables in the database specified in the configuration
@@ -39,44 +39,43 @@
 
     You can pass the answers to all questions as options to this command.
     """
-    dbconf = kallithea.CONFIG['sqlalchemy.url']
+    if config is not None:  # first called with config, before app initialization
+        dbconf = config['sqlalchemy.url']
 
-    # force_ask should be True (yes), False (no), or None (ask)
-    if force_yes:
-        force_ask = True
-    elif force_no:
-        force_ask = False
-    else:
-        force_ask = None
+        # force_ask should be True (yes), False (no), or None (ask)
+        if force_yes:
+            force_ask = True
+        elif force_no:
+            force_ask = False
+        else:
+            force_ask = None
 
-    cli_args = dict(
-            username=user,
-            password=password,
-            email=email,
-            repos_location=repos,
-            force_ask=force_ask,
-            public_access=public_access,
-    )
-    dbmanage = DbManage(dbconf=dbconf, root=kallithea.CONFIG['here'],
-                        tests=False, cli_args=cli_args)
-    dbmanage.create_tables(reuse_database=reuse)
-    repo_root_path = dbmanage.prompt_repo_root_path(None)
-    dbmanage.create_settings(repo_root_path)
-    dbmanage.create_default_user()
-    dbmanage.admin_prompt()
-    dbmanage.create_permissions()
-    dbmanage.populate_default_permissions()
-    Session().commit()
+        cli_args = dict(
+                username=user,
+                password=password,
+                email=email,
+                repos_location=repos,
+                force_ask=force_ask,
+                public_access=public_access,
+        )
+        dbmanage = DbManage(dbconf=dbconf, root=config['here'],
+                            tests=False, cli_args=cli_args)
+        dbmanage.create_tables(reuse_database=reuse)
+        repo_root_path = dbmanage.prompt_repo_root_path(None)
+        dbmanage.create_settings(repo_root_path)
+        dbmanage.create_default_user()
+        dbmanage.admin_prompt()
+        dbmanage.create_permissions()
+        dbmanage.populate_default_permissions()
+        Session().commit()
 
-    # initial repository scan
-    kallithea.config.application.make_app(
-            kallithea.CONFIG.global_conf, **kallithea.CONFIG.local_conf)
-    added, _ = kallithea.lib.utils.repo2db_mapper(kallithea.model.scm.ScmModel().repo_scan())
-    if added:
-        click.echo('Initial repository scan: added following repositories:')
-        click.echo('\t%s' % '\n\t'.join(added))
-    else:
-        click.echo('Initial repository scan: no repositories found.')
+    else:  # then called again after app initialization
+        added, _ = kallithea.lib.utils.repo2db_mapper(kallithea.model.scm.ScmModel().repo_scan())
+        if added:
+            click.echo('Initial repository scan: added following repositories:')
+            click.echo('\t%s' % '\n\t'.join(added))
+        else:
+            click.echo('Initial repository scan: no repositories found.')
 
-    click.echo('Database set up successfully.')
-    click.echo("Don't forget to build the front-end using 'kallithea-cli front-end-build'.")
+        click.echo('Database set up successfully.')
+        click.echo("Don't forget to build the front-end using 'kallithea-cli front-end-build'.")