Changeset - 213085032127
[Not reviewed]
default
3 10 2
Mads Kiilerich - 9 years ago 2016-09-12 17:50:11
madski@unity3d.com
gearbox: make a make-config sub-command available again

Drop the old kallithea-config command line tool and rework it to a replacement
for the make-config paster command. Make-config was experimental in paste, it
doesn't exist with gearbox, it was tied to pylons, and we already have the
luxury problem of having two ways of doing almost the same thing. This is a
good opportunity to get rid of one of them.

This replacement tool is Kallithea specific and doesn't need to be told that it
is Kallithea it has to create a config file for. The command should thus
perhaps be given a Kallithea specific name instead of the very generic name ...
13 files changed with 66 insertions and 693 deletions:
0 comments (0 inline, 0 general)
MANIFEST.in
Show inline comments
 
@@ -11,7 +11,6 @@ recursive-include init.d *
 
recursive-include kallithea/alembic *
 
include           kallithea/bin/ldap_sync.conf
 
include           kallithea/bin/template.ini.mako
 
include           kallithea/config/deployment.ini_tmpl
 
recursive-include kallithea/i18n *
 
recursive-include kallithea/public *
 
recursive-include kallithea/templates *
docs/contributing.rst
Show inline comments
 
@@ -36,7 +36,7 @@ To get started with development::
 
        source ../kallithea-venv/bin/activate
 
        pip install --upgrade pip setuptools
 
        pip install -e .
 
        TODO make-config Kallithea my.ini
 
        gearbox make-config my.ini
 
        gearbox setup-db -c my.ini --user=user --email=user@example.com --password=password --repos=/tmp
 
        gearbox serve -c my.ini --reload &
 
        firefox http://127.0.0.1:5000/
docs/dev/dbmigrations.rst
Show inline comments
 
@@ -18,7 +18,7 @@ changes, you should make a matching Alem
 
2. Create a separate throwaway configuration for iterating on the actual
 
   database changes::
 

	
 
    TODO make-config Kallithea temp.ini
 
    gearbox make-config temp.ini
 

	
 
   Edit the file to change database settings. SQLite is typically fine,
 
   but make sure to change the path to e.g. ``temp.db``, to avoid
docs/installation_win.rst
Show inline comments
 
@@ -166,7 +166,7 @@ it, reopen it following the same command
 
one). When ready, type::
 

	
 
  cd C:\Kallithea\Bin
 
  TODO make-config Kallithea production.ini
 
  gearbox make-config production.ini
 

	
 
Then you must edit production.ini to fit your needs (IP address, IP
 
port, mail settings, database, etc.). `NotePad++`__ or a similar text
docs/installation_win_old.rst
Show inline comments
 
@@ -204,7 +204,7 @@ if you closed it reopen it following the
 
"activate" one). When ready, just type::
 

	
 
  cd C:\Kallithea\Bin
 
  TODO make-config Kallithea production.ini
 
  gearbox make-config production.ini
 

	
 
Then, you must edit production.ini to fit your needs (network address and
 
port, mail settings, database, whatever). I recommend using NotePad++
docs/setup.rst
Show inline comments
 
@@ -11,7 +11,7 @@ Setting up Kallithea
 
First, you will need to create a Kallithea configuration file. Run the
 
following command to do so::
 

	
 
    TODO make-config Kallithea my.ini
 
    gearbox make-config my.ini
 

	
 
This will create the file ``my.ini`` in the current directory. This
 
configuration file contains the various settings for Kallithea, e.g.
docs/upgrade.rst
Show inline comments
 
@@ -91,13 +91,11 @@ If you originally installed from version
 
5. Upgrade your configuration
 
-----------------------------
 

	
 
Run the following command to upgrade your configuration (``.ini``) file::
 

	
 
    TODO make-config Kallithea my.ini
 
Run the following command to create a new configuration (``.ini``) file::
 

	
 
This will display any changes made by the new version of Kallithea to your
 
current configuration, and attempt an automatic merge. It is recommended
 
that you check the contents after the merge.
 
    gearbox make-config new.ini
 

	
 
Then compare it with your old config file and see what changed.
 

	
 
.. note::
 
    Please always make sure your ``.ini`` files are up to date. Errors
kallithea/config/deployment.ini_tmpl
Show inline comments
 
deleted file
kallithea/lib/paster_commands/make_config.py
Show inline comments
 
modified file chmod 100755 => 100644
 
file renamed from kallithea/bin/kallithea_config.py to kallithea/lib/paster_commands/make_config.py
 
#!/usr/bin/env python2
 

	
 
# -*- coding: utf-8 -*-
 
# This program is free software: you can redistribute it and/or modify
 
# it under the terms of the GNU General Public License as published by
 
@@ -14,16 +12,11 @@
 
# You should have received a copy of the GNU General Public License
 
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
"""
 
kallithea.bin.kallithea_config
 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 

	
 
configuration generator for Kallithea
 
kallithea.lib.paster_commands.make_config
 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 

	
 
This file was forked by the Kallithea project in July 2014.
 
Original author and date, and relevant copyright and licensing information is below:
 
:created_on: Jun 18, 2013
 
:author: marcink
 
:copyright: (c) 2013 RhodeCode GmbH, and others.
 
make-config gearbox command for Kallithea
 

	
 
:license: GPLv3, see LICENSE.md for more details.
 
"""
 

	
 
@@ -36,31 +29,36 @@ from mako.template import Template
 
TMPL = 'template.ini.mako'
 
here = os.path.dirname(os.path.abspath(__file__))
 

	
 
def argparser(argv):
 
    usage = (
 
      "kallithea-config [-h] [--filename=FILENAME] [--template=TEMPLATE] \n"
 
      "VARS optional specify extra template variable that will be available in "
 
      "template. Use comma separated key=val format eg.\n"
 
      "key1=val1,port=5000,host=127.0.0.1,elements='a\,b\,c'\n"
 
    )
 
from kallithea.lib.paster_commands.common import ask_ok, BasePasterCommand
 

	
 

	
 
class Command(BasePasterCommand):
 
    """Kallithea: Create a new config file
 

	
 
    parser = argparse.ArgumentParser(
 
        description='Kallithea CONFIG generator with variable replacement',
 
        usage=usage
 
    )
 
    make-config is part of a two-phase installation process (the
 
    second phase is setup-app). make-config creates a bare configuration
 
    file (possibly filling in defaults from the extra
 
    variables you give).
 
    """
 

	
 
    takes_config_file = False # at least not an existing one ...
 

	
 
    ## config
 
    group = parser.add_argument_group('CONFIG')
 
    group.add_argument('--filename', help='Output ini filename.')
 
    group.add_argument('--template', help='Mako template file to use instead of '
 
                                          'the default builtin template')
 
    group.add_argument('--raw', help='Store given mako template as raw without '
 
                                     'parsing. Use this to create custom template '
 
                                     'initially', action='store_true')
 
    group.add_argument('--show-defaults', help='Show all default variables for '
 
                                               'builtin template', action='store_true')
 
    args, other = parser.parse_known_args()
 
    return parser, args, other
 
    def take_action(self, args):
 
        _run(args)
 

	
 
    def get_parser(self, prog_name):
 
        parser = super(Command, self).get_parser(prog_name)
 

	
 
        parser.add_argument('config_file', nargs='?',
 
            help='application config file to write')
 

	
 
        parser.add_argument('custom', nargs=argparse.REMAINDER,
 
            help='custom values to write to config file')
 

	
 
        parser.add_argument('--show-defaults', action='store_true',
 
            help="Show the default values that can be overridden")
 

	
 
        return parser
 

	
 

	
 
def _escape_split(text, sep):
 
@@ -90,11 +88,15 @@ def _escape_split(text, sep):
 

	
 
    return startlist + [unfinished] + endlist[1:]  # put together all the parts
 

	
 
def _run(argv):
 
    parser, args, other = argparser(argv)
 
    if not len(sys.argv) > 1:
 
        print parser.print_help()
 
        sys.exit(0)
 

	
 
def _run(args):
 
    if args.config_file is None:
 
        if not args.show_defaults:
 
            raise ValueError("Missing argument: config_file")
 
    else:
 
        if args.show_defaults:
 
            raise ValueError("Can't specify both config_file and --show_defaults")
 

	
 
    # defaults that can be overwritten by arguments
 
    tmpl_stored_args = {
 
        'http_server': 'waitress',
 
@@ -104,10 +106,10 @@ def _run(argv):
 
        'port': 5000,
 
        'error_aggregation_service': None,
 
    }
 
    if other:
 
        # parse arguments, we assume only first is correct
 
    for custom in args.custom:
 
        # parse arguments
 
        kwargs = {}
 
        for el in _escape_split(other[0], ','):
 
        for el in _escape_split(custom, ','):
 
            kv = _escape_split(el, '=')
 
            if len(kv) == 2:
 
                k, v = kv
 
@@ -115,46 +117,27 @@ def _run(argv):
 
        # update our template stored args
 
        tmpl_stored_args.update(kwargs)
 

	
 
    # use default that cannot be replaced
 
    tmpl_stored_args.update({
 
        'uuid': lambda: uuid.uuid4().hex,
 
        'here': os.path.abspath(os.curdir),
 
    })
 
    if args.show_defaults:
 
        for k,v in tmpl_stored_args.iteritems():
 
            print '%s=%s' % (k, v)
 
        sys.exit(0)
 

	
 
    # use default that cannot be replaced
 
    tmpl_stored_args.update({
 
        'uuid': lambda: uuid.uuid4().hex,
 
        'here': os.path.dirname(os.path.abspath(args.config_file)),
 
    })
 
    try:
 
        # built in template
 
        tmpl_file = os.path.join(here, TMPL)
 
        if args.template:
 
            tmpl_file = args.template
 

	
 
        with open(tmpl_file, 'rb') as f:
 
            tmpl_data = f.read().decode('utf-8')
 
            if args.raw:
 
                tmpl = tmpl_data
 
            else:
 
                tmpl = Template(tmpl_data).render(**tmpl_stored_args)
 
        with open(args.filename, 'wb') as f:
 
            tmpl = Template(tmpl_data).render(**tmpl_stored_args)
 
        with open(args.config_file, 'wb') as f:
 
            f.write(tmpl.encode('utf-8'))
 
        print 'Wrote new config file in %s' % (os.path.abspath(args.filename))
 
        print 'Wrote new config file in %s' % (os.path.abspath(args.config_file))
 

	
 
    except Exception:
 
        from mako import exceptions
 
        print exceptions.text_error_template().render()
 

	
 
def main(argv=None):
 
    """
 
    Main execution function for cli
 

	
 
    :param argv:
 
    """
 
    if argv is None:
 
        argv = sys.argv
 

	
 
    return _run(argv)
 

	
 

	
 
if __name__ == '__main__':
 
    sys.exit(main(sys.argv))
kallithea/lib/paster_commands/template.ini.mako
Show inline comments
 
file renamed from kallithea/bin/template.ini.mako to kallithea/lib/paster_commands/template.ini.mako
scripts/generate-ini.py
Show inline comments
 
#!/usr/bin/env python2
 
"""
 
Based on kallithea/bin/template.ini.mako, generate
 
  kallithea/config/deployment.ini_tmpl
 
Based on kallithea/lib/paster_commands/template.ini.mako, generate
 
  development.ini
 
  kallithea/tests/test.ini
 
"""
 

	
 
import re
 

	
 
makofile = 'kallithea/bin/template.ini.mako'
 
makofile = 'kallithea/lib/paster_commands/template.ini.mako'
 

	
 
# the mako conditionals used in all other ini files and templates
 
selected_mako_conditionals = set([
 
@@ -28,14 +27,6 @@ mako_variable_values = {
 

	
 
# files to be generated from the mako template
 
ini_files = [
 
    ('kallithea/config/deployment.ini_tmpl',
 
        '''
 
        Kallithea - Example config
 

	
 
        The %(here)s variable will be replaced with the parent directory of this file
 
        ''',
 
        {}, # exactly the same settings as template.ini.mako
 
    ),
 
    ('kallithea/tests/test.ini',
 
        '''
 
        Kallithea - config for tests:
scripts/manifest
Show inline comments
 
@@ -75,11 +75,9 @@ kallithea/bin/kallithea_gist.py
 
kallithea/bin/ldap_sync.conf
 
kallithea/bin/ldap_sync.py
 
kallithea/bin/rebranddb.py
 
kallithea/bin/template.ini.mako
 
kallithea/config/
 
kallithea/config/__init__.py
 
kallithea/config/conf.py
 
kallithea/config/deployment.ini_tmpl
 
kallithea/config/environment.py
 
kallithea/config/middleware.py
 
kallithea/config/post_receive_tmpl.py
 
@@ -355,6 +353,7 @@ kallithea/lib/paster_commands/make_index
 
kallithea/lib/paster_commands/make_rcextensions.py
 
kallithea/lib/paster_commands/repo_scan.py
 
kallithea/lib/paster_commands/setup_db.py
 
kallithea/lib/paster_commands/template.ini.mako
 
kallithea/lib/paster_commands/update_repoinfo.py
 
kallithea/lib/pidlock.py
 
kallithea/lib/profiler.py
setup.py
Show inline comments
 
@@ -155,6 +155,7 @@ setuptools.setup(
 
    main = pylons.util:PylonsInstaller
 

	
 
    [gearbox.commands]
 
    make-config=kallithea.lib.paster_commands.make_config:Command
 
    setup-db=kallithea.lib.paster_commands.setup_db:Command
 
    cleanup-repos=kallithea.lib.paster_commands.cleanup:Command
 
    update-repoinfo=kallithea.lib.paster_commands.update_repoinfo:Command
0 comments (0 inline, 0 general)