106 lines
3.3 KiB
Python
106 lines
3.3 KiB
Python
# Copyright (c) 2015 SUSE Linux GmbH. All rights reserved.
|
|
#
|
|
# This file is part of kiwi.
|
|
#
|
|
# kiwi is free software: you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation, either version 3 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# kiwi is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with kiwi. If not, see <http://www.gnu.org/licenses/>
|
|
#
|
|
import sys
|
|
import docopt
|
|
|
|
# project
|
|
from . import logger
|
|
from .app import App
|
|
from .exceptions import KiwiError
|
|
from .defaults import Defaults
|
|
|
|
|
|
def extras(help_, version, options, doc):
|
|
"""
|
|
Overwritten method from docopt
|
|
|
|
We want to show our own usage for -h|--help
|
|
"""
|
|
if help_ and any((o.name in ('-h', '--help')) and o.value for o in options):
|
|
usage(doc.strip("\n"))
|
|
sys.exit(1)
|
|
if version and any(o.name == '--version' and o.value for o in options):
|
|
print(version)
|
|
sys.exit(0)
|
|
|
|
|
|
def main():
|
|
"""
|
|
kiwi - main application entry point
|
|
|
|
Initializes a global log object and handles all errors of the
|
|
application. Every known error is inherited from KiwiError,
|
|
everything else is passed down until the generic Exception
|
|
which is handled as unexpected error including the python
|
|
backtrace
|
|
"""
|
|
docopt.__dict__['extras'] = extras
|
|
try:
|
|
App()
|
|
except KiwiError as e:
|
|
# known exception, log information and exit
|
|
logger.log.error('%s: %s', type(e).__name__, format(e))
|
|
sys.exit(1)
|
|
except KeyboardInterrupt:
|
|
logger.log.error('kiwi aborted by keyboard interrupt')
|
|
sys.exit(1)
|
|
except docopt.DocoptExit as e:
|
|
# exception thrown by docopt, results in usage message
|
|
usage(e)
|
|
sys.exit(1)
|
|
except SystemExit as e:
|
|
# user exception, program aborted by user
|
|
sys.exit(e)
|
|
except Exception:
|
|
# exception we did no expect, show python backtrace
|
|
logger.log.error('Unexpected error:')
|
|
raise
|
|
|
|
|
|
def usage(command_usage):
|
|
"""
|
|
Instead of the docopt way to show the usage information we
|
|
provide a kiwi specific usage information. The usage
|
|
data now always consists out of:
|
|
|
|
1. the generic call
|
|
kiwi [global options] service <command> [<args>]
|
|
|
|
2. the command specific usage defined by the docopt string
|
|
short form by default, long form with -h | --help
|
|
|
|
3. the global options
|
|
"""
|
|
with open(Defaults.project_file('cli.py'), 'r') as cli:
|
|
program_code = cli.readlines()
|
|
|
|
global_options = '\n'
|
|
process_lines = False
|
|
for line in program_code:
|
|
if line.rstrip().startswith('global options'):
|
|
process_lines = True
|
|
if line.rstrip() == '"""':
|
|
process_lines = False
|
|
if process_lines:
|
|
global_options += format(line)
|
|
|
|
print('usage: kiwi [global options] service <command> [<args>]\n')
|
|
print(format(command_usage).replace('usage:', ' '))
|
|
if 'global options' not in format(command_usage):
|
|
print(format(global_options))
|