fail if osm2pgsql is not recent enough

This commit is contained in:
Sarah Hoffmann 2024-08-09 14:44:49 +02:00
parent 3cc20581ae
commit 6527b7cdcd
3 changed files with 44 additions and 6 deletions

View File

@ -7,14 +7,17 @@
""" """
Helper functions for executing external programs. Helper functions for executing external programs.
""" """
from typing import Any, Mapping, List from typing import Any, Mapping, List, Optional
import logging import logging
import os import os
import re
import subprocess import subprocess
import shutil import shutil
from ..typing import StrPath from ..typing import StrPath
from ..db.connection import get_pg_env from ..db.connection import get_pg_env
from ..errors import UsageError
from ..version import OSM2PGSQL_REQUIRED_VERSION
LOG = logging.getLogger() LOG = logging.getLogger()
@ -28,6 +31,8 @@ def run_php_server(server_address: str, base_dir: StrPath) -> None:
def run_osm2pgsql(options: Mapping[str, Any]) -> None: def run_osm2pgsql(options: Mapping[str, Any]) -> None:
""" Run osm2pgsql with the given options. """ Run osm2pgsql with the given options.
""" """
_check_osm2pgsql_version(options['osm2pgsql'])
env = get_pg_env(options['dsn']) env = get_pg_env(options['dsn'])
cmd = [_find_osm2pgsql_cmd(options['osm2pgsql']), cmd = [_find_osm2pgsql_cmd(options['osm2pgsql']),
@ -84,12 +89,31 @@ def _mk_tablespace_options(ttype: str, options: Mapping[str, Any]) -> List[str]:
return cmds return cmds
def _find_osm2pgsql_cmd(cmdline: str) -> str: def _find_osm2pgsql_cmd(cmdline: Optional[str]) -> str:
if cmdline is not None: if cmdline is not None:
return cmdline return cmdline
in_path = shutil.which('osm2pgsql') in_path = shutil.which('osm2pgsql')
if in_path is None: if in_path is None:
raise RuntimeError('osm2pgsql executable not found. Please install osm2pgsql first.') raise UsageError('osm2pgsql executable not found. Please install osm2pgsql first.')
return str(in_path) return str(in_path)
def _check_osm2pgsql_version(cmdline: Optional[str]) -> None:
cmd = [_find_osm2pgsql_cmd(cmdline), '--version']
result = subprocess.run(cmd, capture_output=True, check=True)
if not result.stderr:
raise UsageError("osm2pgsql does not print version information.")
verinfo = result.stderr.decode('UTF-8')
match = re.search(r'osm2pgsql version (\d+)\.(\d+)', verinfo)
if match is None:
raise UsageError(f"No version information found in output: {verinfo}")
if (int(match[1]), int(match[2])) < OSM2PGSQL_REQUIRED_VERSION:
raise UsageError(f"osm2pgsql is too old. Found version {match[1]}.{match[2]}. "
f"Need at least version {'.'.join(map(str, OSM2PGSQL_REQUIRED_VERSION))}.")

View File

@ -62,6 +62,7 @@ NOMINATIM_VERSION = parse_version('4.4.99-1')
POSTGRESQL_REQUIRED_VERSION = (9, 6) POSTGRESQL_REQUIRED_VERSION = (9, 6)
POSTGIS_REQUIRED_VERSION = (2, 2) POSTGIS_REQUIRED_VERSION = (2, 2)
OSM2PGSQL_REQUIRED_VERSION = (1, 8)
# Cmake sets a variable @GIT_HASH@ by executing 'git --log'. It is not run # Cmake sets a variable @GIT_HASH@ by executing 'git --log'. It is not run
# on every execution of 'make'. # on every execution of 'make'.

View File

@ -7,10 +7,23 @@
import pytest import pytest
@pytest.fixture @pytest.fixture
def osm2pgsql_options(temp_db): def osm2pgsql_options(temp_db, tmp_path):
""" A standard set of options for osm2pgsql. """ A standard set of options for osm2pgsql
together with a osm2pgsql mock that just reflects the command line.
""" """
return dict(osm2pgsql='echo', osm2pgsql_exec = tmp_path / 'osm2pgsql_mock'
osm2pgsql_exec.write_text("""#!/bin/sh
if [ "$*" = "--version" ]; then
>&2 echo "2024-08-09 11:16:23 osm2pgsql version 11.7.2 (11.7.2)"
else
echo "$@"
fi
""")
osm2pgsql_exec.chmod(0o777)
return dict(osm2pgsql=str(osm2pgsql_exec),
osm2pgsql_cache=10, osm2pgsql_cache=10,
osm2pgsql_style='style.file', osm2pgsql_style='style.file',
threads=1, threads=1,