X-Git-Url: https://git.openstreetmap.org/nominatim.git/blobdiff_plain/6f6910101e495cb7dbda2a295645f6174fce6a54..e37cfc64d2734bf67aedf44e57585d6bd5ff06af:/nominatim/cli.py diff --git a/nominatim/cli.py b/nominatim/cli.py index 55f51aac..f911023b 100644 --- a/nominatim/cli.py +++ b/nominatim/cli.py @@ -1,3 +1,9 @@ +# SPDX-License-Identifier: GPL-2.0-only +# +# This file is part of Nominatim. (https://nominatim.org) +# +# Copyright (C) 2022 by the Nominatim developer community. +# For a full list of authors see the git log. """ Command-line interface to the Nominatim functions for import, update, database administration and querying. @@ -12,8 +18,8 @@ from nominatim.config import Configuration from nominatim.tools.exec_utils import run_legacy_script, run_php_server from nominatim.errors import UsageError from nominatim import clicmd +from nominatim import version from nominatim.clicmd.args import NominatimArgs -from nominatim.tools import tiger_data LOG = logging.getLogger() @@ -31,6 +37,10 @@ class CommandlineParser: self.subs = self.parser.add_subparsers(title='available commands', dest='subcommand') + # Global arguments that only work if no sub-command given + self.parser.add_argument('--version', action='store_true', + help='Print Nominatim version and exit') + # Arguments added to every sub-command self.default_args = argparse.ArgumentParser(add_help=False) group = self.default_args.add_argument_group('Default arguments') @@ -46,6 +56,14 @@ class CommandlineParser: group.add_argument('-j', '--threads', metavar='NUM', type=int, help='Number of parallel threads to use') + @staticmethod + def nominatim_version_text(): + """ Program name and version number as string + """ + text = f'Nominatim version {version.version_str()}' + if version.GIT_COMMIT_HASH is not None: + text += f' ({version.GIT_COMMIT_HASH})' + return text def add_subcommand(self, name, cmd): """ Add a subcommand to the parser. The subcommand must be a class @@ -65,7 +83,14 @@ class CommandlineParser: appropriate subcommand. """ args = NominatimArgs() - self.parser.parse_args(args=kwargs.get('cli_args'), namespace=args) + try: + self.parser.parse_args(args=kwargs.get('cli_args'), namespace=args) + except SystemExit: + return 1 + + if args.version: + print(CommandlineParser.nominatim_version_text()) + return 0 if args.subcommand is None: self.parser.print_help() @@ -104,7 +129,7 @@ class CommandlineParser: return 1 -##### Subcommand classes +# Subcommand classes # # Each class needs to implement two functions: add_args() adds the CLI parameters # for the subfunction, run() executes the subcommand. @@ -115,58 +140,6 @@ class CommandlineParser: # # No need to document the functions each time. # pylint: disable=C0111 -# Using non-top-level imports to make pyosmium optional for replication only. -# pylint: disable=E0012,C0415 -class UpdateAddData: - """\ - Add additional data from a file or an online source. - - Data is only imported, not indexed. You need to call `nominatim-update index` - to complete the process. - """ - - @staticmethod - def add_args(parser): - group_name = parser.add_argument_group('Source') - group = group_name.add_mutually_exclusive_group(required=True) - group.add_argument('--file', metavar='FILE', - help='Import data from an OSM file') - group.add_argument('--diff', metavar='FILE', - help='Import data from an OSM diff file') - group.add_argument('--node', metavar='ID', type=int, - help='Import a single node from the API') - group.add_argument('--way', metavar='ID', type=int, - help='Import a single way from the API') - group.add_argument('--relation', metavar='ID', type=int, - help='Import a single relation from the API') - group.add_argument('--tiger-data', metavar='DIR', - help='Add housenumbers from the US TIGER census database.') - group = parser.add_argument_group('Extra arguments') - group.add_argument('--use-main-api', action='store_true', - help='Use OSM API instead of Overpass to download objects') - - @staticmethod - def run(args): - if args.tiger_data: - return tiger_data.add_tiger_data(args.tiger_data, - args.config, args.threads or 1) - - params = ['update.php'] - if args.file: - params.extend(('--import-file', args.file)) - elif args.diff: - params.extend(('--import-diff', args.diff)) - elif args.node: - params.extend(('--import-node', args.node)) - elif args.way: - params.extend(('--import-way', args.way)) - elif args.relation: - params.extend(('--import-relation', args.relation)) - if args.use_main_api: - params.append('--use-main-api') - return run_legacy_script(*params, nominatim_env=args) - - class QueryExport: """\ Export addresses as CSV file from the database. @@ -229,7 +202,7 @@ class AdminServe: This command starts the built-in PHP webserver to serve the website from the current project directory. This webserver is only suitable - for testing and develop. Do not use it in production setups! + for testing and development. Do not use it in production setups! By the default, the webserver can be accessed at: http://127.0.0.1:8088 """ @@ -257,9 +230,9 @@ def get_set_parser(**kwargs): parser.add_subcommand('special-phrases', clicmd.ImportSpecialPhrases) - parser.add_subcommand('add-data', UpdateAddData) + parser.add_subcommand('add-data', clicmd.UpdateAddData) parser.add_subcommand('index', clicmd.UpdateIndex) - parser.add_subcommand('refresh', clicmd.UpdateRefresh) + parser.add_subcommand('refresh', clicmd.UpdateRefresh()) parser.add_subcommand('admin', clicmd.AdminFuncs)