diff --git a/lib/init/grass.py b/lib/init/grass.py index c52b123ac9d..6f67c6fff47 100755 --- a/lib/init/grass.py +++ b/lib/init/grass.py @@ -295,7 +295,7 @@ def help_message(default_gui) -> None: flags=_("Flags"), help_flag=_("print this help message"), version_flag=_("show version information and exit"), - create=_("create given database, project or mapset if it doesn't exist"), + create=_("create given project or mapset if it doesn't exist"), exit_after=_("exit after creation of project or mapset. Only with -c flag"), force_removal=_( "force removal of .gislock if exists (use with care!)." @@ -666,15 +666,22 @@ def create_location(gisdbase, location, geostring) -> None: :param geostring: path to a georeferenced file or EPSG code """ import grass.script as gs # pylint: disable=E0611 + from grass.exceptions import ScriptError try: gs.create_project(gisdbase, location, crs=geostring) - except gs.ScriptError as err: + except ScriptError as err: fatal( _("Error creating project: {}").format( err.value.strip('"').strip("'").replace("\\n", os.linesep) ) ) + except OSError as err: + fatal( + _("Cannot create project <{}>: {}: {}").format( + location, err.strerror, err.filename + ) + ) def can_create_location(gisdbase: StrPath, location) -> bool: diff --git a/lib/init/tests/grass_create_project_test.py b/lib/init/tests/grass_create_project_test.py new file mode 100644 index 00000000000..640c5da7d99 --- /dev/null +++ b/lib/init/tests/grass_create_project_test.py @@ -0,0 +1,21 @@ +"""Test that grass -c reports a clear error instead of a traceback + +SPDX-FileCopyrightText: 2026 Akash Maity +SPDX-FileCopyrightText: GRASS Development Team +SPDX-License-Identifier: GPL-2.0-or-later +""" + +import subprocess + + +def test_missing_database_directory(tmp_path): + """Missing parent directories give a clear error""" + project = tmp_path / "missing" / "deeper" / "myproject" + result = subprocess.run( + ["grass", "-c", "EPSG:4326", str(project), "-e"], + capture_output=True, + text=True, + ) + assert result.returncode != 0 + assert "Traceback" not in result.stderr + assert "Cannot create project" in result.stderr