[GRASS-git] [OSGeo/grass] f85545: checks: Exclude vendored code from bandit scanning...

Vaclav Petras noreply at github.com
Fri Jul 17 10:02:10 PDT 2026


  Branch: refs/heads/ai-findings-autofix/lib-raster3d-tilewrite.c
  Home:   https://github.com/OSGeo/grass
  Commit: f85545aac20250111392dfc30cbef97c784e49be
      https://github.com/OSGeo/grass/commit/f85545aac20250111392dfc30cbef97c784e49be
  Author: Corey White <smortopahri at gmail.com>
  Date:   2026-07-15 (Wed, 15 Jul 2026)

  Changed paths:
    M pyproject.toml

  Log Message:
  -----------
  checks: Exclude vendored code from bandit scanning (#7699)

Bandit scans the vendored ctypesgen copy in
python/libgrass_interface_generator and the vendored PLY copy in
python/grass/temporal/ply, reporting 13 findings (B102, B403, B605,
B307, B602, B607) in code GRASS does not maintain. Exclude both
directories, matching the existing pylint ignore-paths and formatter
extend-exclude entries.


  Commit: 4c45878bb13dc369b133973271c8310c0c82507a
      https://github.com/OSGeo/grass/commit/4c45878bb13dc369b133973271c8310c0c82507a
  Author: Edouard Choinière <27212526+echoix at users.noreply.github.com>
  Date:   2026-07-15 (Wed, 15 Jul 2026)

  Changed paths:
    M doc/howto_release.md

  Log Message:
  -----------
  doc: How to release: follow up typos (#7718)

Follow up of a recently changed file. AI findings mostly found typos, plus an interesting other situation.

The symlink source uses `grass-$VERSION.tar.md5sum`, but the md5sum file is created as `grass-${VERSION}.md5sum` (line 347). The `.tar` part in the filename is incorrect and the symlink will be broken.

_This PR applies 4/4 suggestions from code quality [AI findings](https://github.com/OSGeo/grass/security/quality/ai-findings)._

* Apply suggested fix to doc/howto_release.md from Copilot Autofix

---------

Co-authored-by: Copilot Autofix powered by AI <223894421+github-code-quality[bot]@users.noreply.github.com>


  Commit: e193ca71e7d42d0beb730d17e95a6e8de689afb6
      https://github.com/OSGeo/grass/commit/e193ca71e7d42d0beb730d17e95a6e8de689afb6
  Author: Anna Petrasova <kratochanna at gmail.com>
  Date:   2026-07-15 (Wed, 15 Jul 2026)

  Changed paths:
    M python/grass/temporal/register.py
    M temporal/t.register/t.register.html
    M temporal/t.register/t.register.md
    R temporal/t.register/test.t.register.raster.file.reltime.sh
    A temporal/t.register/tests/conftest.py
    A temporal/t.register/tests/t_register_file_test.py

  Log Message:
  -----------
  grass.temporal: Fix end time parsing when registering relative-time maps from file (t.register) (#7717)

The name|start|end input file format silently misread the end time as a
semantic label for relative-time datasets: maps were registered as point
time and the intended end times were written as semantic labels into the
raster metadata. Regression from the band references implementation
(a83af32aac). An integer third column is now interpreted as an end time
for relative time; anything else remains a semantic label.

Written with the help of Claude Code.


  Commit: 46836626508062ccf0ae8a5e0571666eb814cb5c
      https://github.com/OSGeo/grass/commit/46836626508062ccf0ae8a5e0571666eb814cb5c
  Author: Edouard Choinière <27212526+echoix at users.noreply.github.com>
  Date:   2026-07-15 (Wed, 15 Jul 2026)

  Changed paths:
    M display/d.linegraph/main.c

  Log Message:
  -----------
  d.linegraph: Follow-up fixes for typos, dereference pointers, and format string precision specifier (#7722)

A couple simple string typos were fixed, plus two other issues.

`tt` and `tb` are pointer parameters (`double *tt`, `double *tb`), so `tt - tb` computes pointer difference (an address offset), not the difference between the pointed-to text box values. The condition should dereference the pointers: `(*tt - *tb) > YTIC_DIST`.

The format string `"%f.0"` is incorrect — the `.0` precision specifier must be inside the format specifier, not after it. The literal `.0` will be appended as plain text to the output. The intended format is `"%.0f"` to format the value as a float with no decimal places.

* Apply suggested fix to display/d.linegraph/main.c from Copilot Autofix

Co-authored-by: Copilot Autofix powered by AI <223894421+github-code-quality[bot]@users.noreply.github.com>

* Apply suggested fix to display/d.linegraph/main.c from Copilot Autofix

Co-authored-by: Copilot Autofix powered by AI <223894421+github-code-quality[bot]@users.noreply.github.com>

* Apply suggested fix to display/d.linegraph/main.c from Copilot Autofix

Co-authored-by: Copilot Autofix powered by AI <223894421+github-code-quality[bot]@users.noreply.github.com>

* Apply suggested fix to display/d.linegraph/main.c from Copilot Autofix

Co-authored-by: Copilot Autofix powered by AI <223894421+github-code-quality[bot]@users.noreply.github.com>

---------

Co-authored-by: Copilot Autofix powered by AI <223894421+github-code-quality[bot]@users.noreply.github.com>


  Commit: 8031e362fd2f63a6c550be691aeda1e989839312
      https://github.com/OSGeo/grass/commit/8031e362fd2f63a6c550be691aeda1e989839312
  Author: Anna Petrasova <kratochanna at gmail.com>
  Date:   2026-07-15 (Wed, 15 Jul 2026)

  Changed paths:
    A temporal/t.info/tests/conftest.py
    A temporal/t.info/tests/test_t_info_backend.py
    A temporal/t.info/tests/test_t_info_str3ds.py
    A temporal/t.info/tests/test_t_info_strds.py
    A temporal/t.info/tests/test_t_info_stvds.py
    R temporal/t.info/testsuite/test.t.info.sh

  Log Message:
  -----------
  t.info: Add tests (#7682)

Add pytest tests covering the plain, shell (-g), history (-h) and
temporal database backend (-d) output of t.info for space time datasets
and maps of all types. Include a dataset without registered maps, a
relative time dataset, a map registered in two datasets and non-ASCII
title and description.

Remove the shell script test, which the new tests replace.

The temporal history records the command name with the .py extension on
Windows, so assert the name and its parameters separately.

The tests were written with the help of Claude Code.


  Commit: f131b6caa797081a9a0cc4ca42514e793161f56b
      https://github.com/OSGeo/grass/commit/f131b6caa797081a9a0cc4ca42514e793161f56b
  Author: Vaclav Petras <wenzeslaus at gmail.com>
  Date:   2026-07-15 (Wed, 15 Jul 2026)

  Changed paths:
    M python/grass/utils/download.py
    A python/grass/utils/tests/grass_utils_download_test.py
    M scripts/g.download.project/g.download.project.html
    M scripts/g.download.project/g.download.project.md

  Log Message:
  -----------
  grass.utils: Fix the download error message and limit the URL schemes (#7687)

Fix the HTTP error message, which lost its {desc} placeholder and was
formatted with the whole HTTPError instead of a status code. Limit a download
to the supported schemes (http, https, ftp, file), since urlretrieve opens
any scheme, including data and custom ones (Bandit B310), and document that a
local archive needs the file scheme (no change in behavior, just doc clarity).
Skip the content type check for a local file, which fixed extracting a local ZIP
on Windows. Add tests for the module.


  Commit: f0970ee81eb13fdfb9dee4ed0c5b37a7baa5cc7e
      https://github.com/OSGeo/grass/commit/f0970ee81eb13fdfb9dee4ed0c5b37a7baa5cc7e
  Author: Anna Petrasova <kratochanna at gmail.com>
  Date:   2026-07-15 (Wed, 15 Jul 2026)

  Changed paths:
    M python/grass/app/cli.py
    M python/grass/app/tests/grass_app_cli_test.py
    M python/grass/script/__init__.py
    M python/grass/script/core.py
    A python/grass/script/tests/grass_script_create_mapset_test.py

  Log Message:
  -----------
  grass.script: add create_mapset function (#7298)

Validates project exists and has PERMANENT mapset
Validates mapset name using legal_name()
Rejects creating PERMANENT
overwrite=True to replace existing mapset
initialize_db=True (default) runs db.connect -c via Tools API
env parameter for use with specific sessions, falls back to os.environ
Raises ScriptError with clear messages for all error cases


  Commit: 9893d6817d3900835ff0e0775132f773ae547f0f
      https://github.com/OSGeo/grass/commit/9893d6817d3900835ff0e0775132f773ae547f0f
  Author: Stefan Blumentrath <stefan.blumentrath at gmx.de>
  Date:   2026-07-15 (Wed, 15 Jul 2026)

  Changed paths:
    M python/grass/temporal/core.py
    M python/grass/temporal/tests/grass_temporal_core_init_skip_db_test.py
    M temporal/t.connect/t.connect.html
    M temporal/t.connect/t.connect.md
    M temporal/t.list/t.list.py

  Log Message:
  -----------
  temporal: handle TGIS DB connections for half initialized mapsets (#7707)

* exclude mapsets without DB

* handle defined connection without DB file.

* add test for half initialized mapset

* try to clarify functionality in manual

* de-escalate warnings

Co-authored-by: Anna Petrasova <kratochanna at gmail.com>
Co-authored-by: Veronica Andreo <veroandreo at gmail.com>


  Commit: e50e16c4b2c730c916fc4342b4966cd6d27ddb2c
      https://github.com/OSGeo/grass/commit/e50e16c4b2c730c916fc4342b4966cd6d27ddb2c
  Author: Corey White <smortopahri at gmail.com>
  Date:   2026-07-15 (Wed, 15 Jul 2026)

  Changed paths:
    M raster/r.in.gdal/main.c
    M raster/r.viewshed/grass.cpp
    M raster/r.watershed/ram/init_vars.c

  Log Message:
  -----------
  raster: Fix three single-alert CodeQL findings (#7702)

r.watershed(ram): checking sscanf against 0 misses the EOF return, so
use != 1 as the seg variant already does. 
r.viewshed: bound the inner
column loop by the local int ncols cast to dimensionType, matching the
row loop, instead of comparing the unsigned short counter directly to
Rast_window_cols().
r.in.gdal: drop the null check on sdsdesc, which
is always assigned a non-null pointer beforehand.


  Commit: 57968d60e7e3865a84ccf76bb4ed0ad92cd3cc32
      https://github.com/OSGeo/grass/commit/57968d60e7e3865a84ccf76bb4ed0ad92cd3cc32
  Author: Stefan Blumentrath <stefan.blumentrath at gmx.de>
  Date:   2026-07-15 (Wed, 15 Jul 2026)

  Changed paths:
    M python/grass/temporal/abstract_space_time_dataset.py
    M python/grass/temporal/list_stds.py
    M temporal/t.rast.list/t.rast.list.py
    M temporal/t.rast.list/tests/t_rast_list_test.py

  Log Message:
  -----------
  t.rast.list: allow method gran with where option (#7678)

* enable where with method gran

* enable where with method gran, set '' to None for gran

* add gran-where test, move to tools

---------

Co-authored-by: SAKET KUMAR MALL <72020337+saket0187 at users.noreply.github.com>
Co-authored-by: Anna Petrasova <kratochanna at gmail.com>


  Commit: 22df76e0d0ba549593a8d044b80e6f0cbd954a83
      https://github.com/OSGeo/grass/commit/22df76e0d0ba549593a8d044b80e6f0cbd954a83
  Author: Corey White <smortopahri at gmail.com>
  Date:   2026-07-15 (Wed, 15 Jul 2026)

  Changed paths:
    M python/grass/imaging/images2avi.py
    M python/grass/pygrass/modules/grid/grid.py

  Log Message:
  -----------
  python: Use argument lists instead of shell=True for subprocess (#7703)


  Commit: c6459dc35f802085fd32758d69661bdf07452ce0
      https://github.com/OSGeo/grass/commit/c6459dc35f802085fd32758d69661bdf07452ce0
  Author: Anna Petrasova <kratochanna at gmail.com>
  Date:   2026-07-15 (Wed, 15 Jul 2026)

  Changed paths:
    M doc/development/style_guide.md
    M man/mkdocs/docs/development_intro.md

  Log Message:
  -----------
  doc: use absolute links in style guide, add link to cookiecutter (#5656)


  Commit: f63463995a7ec61a3d2948cefe6a39092ef81683
      https://github.com/OSGeo/grass/commit/f63463995a7ec61a3d2948cefe6a39092ef81683
  Author: Markus Neteler <neteler at osgeo.org>
  Date:   2026-07-15 (Wed, 15 Jul 2026)

  Changed paths:
    M python/grass/script/db.py

  Log Message:
  -----------
  db.univar: fix Python error when input table not existing (#7726)


  Commit: 7aec9f206e28a71671277a4a6b8d8db23cac3ef3
      https://github.com/OSGeo/grass/commit/7aec9f206e28a71671277a4a6b8d8db23cac3ef3
  Author: Anna Petrasova <kratochanna at gmail.com>
  Date:   2026-07-15 (Wed, 15 Jul 2026)

  Changed paths:
    M cmake/modules/build_addon.cmake
    M include/Make/Module.make
    M include/Make/Script.make
    M scripts/g.extension/g.extension.py
    M scripts/g.extension/testsuite/test_addons_download.py
    M scripts/g.extension/testsuite/test_addons_modules.py

  Log Message:
  -----------
  g.extension: Install markdown documentation for addons (#7676)

Extend the addon install rules in Module.make and Script.make to
install the generated markdown page and its images into
docs/mkdocs/source in the addon prefix, next to the existing HTML and
man page. g.extension creates the directory on install and removes the
markdown page on uninstall.

Generate markdown and man pages also in the CMake addon build
(build_addon.cmake), which previously produced only HTML pages and no
man pages at all. This requires g.md2man in the installed GRASS
(shipped by the Autotools build since #7540 and by the CMake build
since #7674).

update_manual_page() intentionally remains HTML-only: it rewrites
relative links for the browser-based help, while the installed
markdown has no consumer that follows links (man pages drop link
targets, and the online addons manual build does its own linking).

Extend the g.extension tests to check the installed markdown files.

AI assistance (Claude Fable); verified with install and
remove round trips of a sample addon through both the make-based and
CMake-based paths.


  Commit: f0376624592e47e50148f3cc5a9f9bfdbcf776fd
      https://github.com/OSGeo/grass/commit/f0376624592e47e50148f3cc5a9f9bfdbcf776fd
  Author: Anna Petrasova <kratochanna at gmail.com>
  Date:   2026-07-15 (Wed, 15 Jul 2026)

  Changed paths:
    M CMakeLists.txt
    M include/CMakeLists.txt
    M lib/temporal/CMakeLists.txt

  Log Message:
  -----------
  CMake: Fix stale staging of headers, modules list, and temporal SQL in build output (#7720)

This PR fixes three CMake staging defects that leave the runnable tree under build/output stale or incomplete, typically after editing headers or switching branches. Each showed up as confusing failures unrelated to
the change under test. AI assistance Claude Fable


  Commit: c7fc4ea573ef6c5092d667105f3a08215319582b
      https://github.com/OSGeo/grass/commit/c7fc4ea573ef6c5092d667105f3a08215319582b
  Author: Anna Petrasova <kratochanna at gmail.com>
  Date:   2026-07-15 (Wed, 15 Jul 2026)

  Changed paths:
    M python/grass/temporal/__init__.py
    M python/grass/temporal/gui_support.py
    A python/grass/temporal/tests/grass_temporal_gui_support_test.py

  Log Message:
  -----------
  grass.temporal: Add registered_maps_grouped() and honor dbif mapsets in tlist() (#7714)

Add a gui_support helper that returns the maps registered in all space
time datasets of the mapsets covered by the given database connection,
grouped by dataset type and dataset id, ordered by start time. This
gives the Data Catalog a cheap way to show dataset contents and to
identify maps registered in any dataset without calling t.rast.list
per dataset.

Fix tlist() to iterate the mapsets of the passed connection instead of
re-deriving the search path, so tlist_grouped() works with a
connection created with mapsets=*. Default behavior is unchanged.

The tests also cover mapsets without a temporal database, a project
without any temporal database, and verify that listing with
tgis.init(skip_db_init=True) does not create a temporal database.

Written with the help of Claude Code.


  Commit: 0aaa18e7c0974244ec5564fc52c6495e2b426f59
      https://github.com/OSGeo/grass/commit/0aaa18e7c0974244ec5564fc52c6495e2b426f59
  Author: KBlumentrath <k.o.blumentrath at gmail.com>
  Date:   2026-07-16 (Thu, 16 Jul 2026)

  Changed paths:
    M gui/wxpython/core/menutree.py
    M gui/wxpython/core/utils.py
    M gui/wxpython/gmodeler/model.py
    M gui/wxpython/gmodeler/panels.py
    M gui/wxpython/image2target/ii2t_gis_set.py
    M gui/wxpython/rlisetup/frame.py
    M man/build.py
    M man/build_rest.py
    M pyproject.toml
    M python/grass/grassdb/manage.py
    M python/grass/gunittest/reporters.py
    M python/grass/pygrass/modules/interface/flag.py
    M python/grass/pygrass/modules/interface/module.py
    M python/grass/pygrass/modules/interface/parameter.py
    M python/grass/pygrass/modules/interface/read.py
    M python/grass/script/core.py
    M scripts/g.extension/g.extension.py
    M scripts/r.in.srtm/r.in.srtm.py

  Log Message:
  -----------
  style: fix ruff rules RUF019 and PTH104 (#7693)

* ruff 019 unnecessary key check

* PTH104 os rename

* checks: Remove fixed rules from ruff ignore list

* python: Add typing for investigated functions and dependent ones


---------

Co-authored-by: Edouard Choinière <27212526+echoix at users.noreply.github.com>


  Commit: 6dc1110500c3e6eb9a5bb46772fab4214b1be2fd
      https://github.com/OSGeo/grass/commit/6dc1110500c3e6eb9a5bb46772fab4214b1be2fd
  Author: Vaclav Petras <wenzeslaus at gmail.com>
  Date:   2026-07-16 (Thu, 16 Jul 2026)

  Changed paths:
    M AGENTS.md
    M python/grass/temporal/tests/grass_temporal_gui_support_test.py

  Log Message:
  -----------
  grass.temporal: Use an explicit env in the gui_support test session (#7732)

The temporal tests needs separate environment like all the other tests, but env can't be explicitly passes as for the rest of the API, so this uses pytest's monkeypatch to work around that.

The module-scoped fixture created its sessions with gs.setup.init()
without env, which sets the session up in the global os.environ. init()
prepends the GRASS executable paths to PATH on every call and never
removes them again, so PATH kept growing for the rest of the pytest
process, and later tests which copy os.environ inherited it. On Windows
this made r.coin fail on main since #7714 was merged: r.coin runs r.stats
in a subprocess, and supposedly, cmd.exe could no longer resolve it on the inherited
PATH, so r.coin reported an empty table.

Create the sessions with env=os.environ.copy() instead. tgis reads the
session from os.environ, so mirror the second session there with
monkeypatch, which restores the environment once the module is done. This
is what test_project_without_temporal_database in the same file already
does. The ultimate fix is for tgis to accept env, which would remove the
need for the monkey patch.

Additionally, document the rule and the tgis exception in AGENTS.md.

The investigation of the CI failure and this patch were done with the
assistance of Claude Code.


  Commit: afa422114ae67aa02259ef382830b612885cec97
      https://github.com/OSGeo/grass/commit/afa422114ae67aa02259ef382830b612885cec97
  Author: Vaclav Petras <wenzeslaus at gmail.com>
  Date:   2026-07-16 (Thu, 16 Jul 2026)

  Changed paths:
    M .github/workflows/pytest_args_gunittest.txt
    A lib/vector/rtree/tests/lib_vector_rtree_ctypes_test.py
    M python/grass/temporal/Makefile
    A python/grass/temporal/tests/grass_temporal_datetime_math_test.py
    A python/grass/temporal/tests/grass_temporal_granularity_test.py
    A python/grass/temporal/tests/grass_temporal_spatial_extent_test.py
    A python/grass/temporal/tests/grass_temporal_topology_test.py
    R python/grass/temporal/unit_tests.py

  Log Message:
  -----------
  tests: Add pytest coverage for the temporal framework and R-tree bindings (#7728)

Add executed pytest tests for parts of the temporal framework and the
R-tree ctypes bindings that no test in CI covered. The cases build their
datasets in memory, so they need neither a temporal database nor a GRASS
session.

- grass_temporal_datetime_math_test.py: datetime increment by string and
  adjustment of a datetime to a granularity.
- grass_temporal_granularity_test.py: absolute-time granularity of map
  lists of intervals, time points and a mix of both.
- grass_temporal_topology_test.py: the temporal topology builder relations
  (overlaps, overlapped, follows, precedes, contains, during) and the map
  list sorting keys. Following TemporalExtent.overlaps, an interval that
  starts and ends earlier overlaps the later one.
- grass_temporal_spatial_extent_test.py: the 2D and 3D spatial extent
  relations and intersection.
- lib_vector_rtree_ctypes_test.py: the 1D to 4D R-tree search through the
  grass.lib ctypes bindings.

These checks previously existed only in grass.temporal.unit_tests, which
could not be imported and was not run, and in doctests that CI does not
execute.

Prepared with the assistance of AI (Claude Code).


  Commit: 36f3025aebf81700826b98cc65be1006a9db441e
      https://github.com/OSGeo/grass/commit/36f3025aebf81700826b98cc65be1006a9db441e
  Author: Anna Petrasova <kratochanna at gmail.com>
  Date:   2026-07-16 (Thu, 16 Jul 2026)

  Changed paths:
    M .github/workflows/cmake.yml
    M CMakeLists.txt
    M cmake/modules/generate_docs.cmake
    M display/CMakeLists.txt
    M doc/CMakeLists.txt
    A doc/development/CMakeLists.txt
    M gui/icons/CMakeLists.txt
    M man/CMakeLists.txt
    M man/build_manpages.py

  Log Message:
  -----------
  CMake: Build the MkDocs documentation site (#7719)

Make the markdown documentation tree complete enough to build the
MkDocs site, and add build-mkdocs and serve-mkdocs targets matching
the Autotools ones (both run mkdocs from PATH and are not part of the
default build).

Copy the site files from man/mkdocs (mkdocs.yml, index and keywords
pages, theme overrides, CSS, logo) into the markdown tree. Add an
MD_ONLY mode to generate_docs for the web-only guides from doc/ and
doc/development/, which have no HTML source and no man page. Exclude
those pages from man page generation with a new --exclude option in
build_manpages.py, derived from the doc/ directories like WEB_ONLY_MD
in man/Makefile. Copy the assets linked from the pages (GUI icons,
color tables, barscale and north arrow thumbnails, grass_logo.txt)
into the markdown tree alongside their existing html copies.

AI assistance (Claude Fable)


  Commit: 9e9262b9510b59d258aa78f648a08a5c659e635b
      https://github.com/OSGeo/grass/commit/9e9262b9510b59d258aa78f648a08a5c659e635b
  Author: Edouard Choinière <27212526+echoix at users.noreply.github.com>
  Date:   2026-07-17 (Fri, 17 Jul 2026)

  Changed paths:
    M lib/db/dbmi_base/dirent.c

  Log Message:
  -----------
  MSVC: Improve MSVC support (part 3) (#5514)

* define unistd only if unistd.h is not available

Co-authored-by: Edouard Choinière <27212526+echoix at users.noreply.github.com>

* fix msvc broken build (works on gcc)

Co-authored-by: Edouard Choinière <27212526+echoix at users.noreply.github.com>

* msvc: __attribute__ is gcc only

Co-authored-by: Edouard Choinière <27212526+echoix at users.noreply.github.com>

* check for _WIN32 to support msvc and mingw

* msvc: undef min max and use math.h for math constants

Co-authored-by: Rashad Kanavath <mohammedrashadkm at gmail.com>

* msvc: fix warning POINT2D_C already defined

* Remove unneeded comment about GDAL without OGR

* Apply suggestions from code review

---------

Co-authored-by: Rashad Kanavath <mohammedrashadkm at gmail.com>
Co-authored-by: Anna Petrasova <kratochanna at gmail.com>


  Commit: d141869727a74ecdad11dab665ce7d006e6df2dc
      https://github.com/OSGeo/grass/commit/d141869727a74ecdad11dab665ce7d006e6df2dc
  Author: Edouard Choinière <27212526+echoix at users.noreply.github.com>
  Date:   2026-07-17 (Fri, 17 Jul 2026)

  Changed paths:
    M .github/workflows/macos.yml
    M .github/workflows/osgeo4w.yml

  Log Message:
  -----------
  CI: Change codecov test result upload action on macOS & Windows (#7683)

* CI: Change codecov test result upload action on macOS & windows

The PR #7607 missed to update the action in the macOS and OSGeo4W workflow. This PR makes the change in remaining workflows

* ci(macOS): Skip validation for codecov cli test results upload as unavailable in the current state of the runner; We uninstall homebrew in the workflow


  Commit: c80cbf1f6721ac35724fa5a8a480c5a11c2145eb
      https://github.com/OSGeo/grass/commit/c80cbf1f6721ac35724fa5a8a480c5a11c2145eb
  Author: Kaushik Raja <85415462+krcoder123 at users.noreply.github.com>
  Date:   2026-07-17 (Fri, 17 Jul 2026)

  Changed paths:
    M lib/gmath/lu.c
    M raster/CMakeLists.txt
    M raster/r.param.scale/Makefile
    A raster/r.param.scale/benchmark/benchmark_r_param_scale_nprocs.py
    M raster/r.param.scale/close_down.c
    M raster/r.param.scale/find_normal.c
    M raster/r.param.scale/interface.c
    M raster/r.param.scale/main.c
    M raster/r.param.scale/open_files.c
    M raster/r.param.scale/param.h
    M raster/r.param.scale/process.c
    M raster/r.param.scale/r.param.scale.md
    M raster/r.param.scale/tests/r_param_scale_test.py

  Log Message:
  -----------
  r.param.scale: parallelize with OpenMP (#7440)

Instead of giving each thread a strip with the whole map, there's now an outer loop over a band of rows, and the work inside each band is split across the threads. Each thread keeps a small ring buffer of wsize rows and rotates it as it goes, reading a new row from disk per output row. So, a thread's input memory only depends on the window height, not the size of the map.

Memory is now limited by the usual memory= option, which sets how many rows are
in a band. A single shared output buffer for the band replaces each row having an allocation and row pointer arrays for the whole map. 

I also reworked find_obs() to precompute the window coordinates once and reuse
w*z across the six weighted sums. This does less floating-point work per cell and
the output is bit-identical to before.
---------

Co-authored-by: Edouard Choinière <27212526+echoix at users.noreply.github.com>
Co-authored-by: Anna Petrasova <kratochanna at gmail.com>
Co-authored-by: Nicklas Larsson <n_larsson at yahoo.com>


  Commit: d6c75ad8e5e4c89cf400818669bbdaf263571ccd
      https://github.com/OSGeo/grass/commit/d6c75ad8e5e4c89cf400818669bbdaf263571ccd
  Author: Edouard Choinière <27212526+echoix at users.noreply.github.com>
  Date:   2026-07-17 (Fri, 17 Jul 2026)

  Changed paths:
    M .editorconfig
    M .pre-commit-config.yaml
    M CMakeLists.txt
    M GRASSConfig.cmake.in
    M cmake/ctypesgen.cmake
    M cmake/find_scripts/CMakeLists.txt
    M cmake/find_scripts/FindCBLAS.cmake
    M cmake/find_scripts/FindCairo.cmake
    M cmake/find_scripts/FindFFTW-egpbos.cmake
    M cmake/find_scripts/FindFFTW-eigen.cmake
    M cmake/find_scripts/FindFFTW.cmake
    M cmake/find_scripts/FindGEOS.cmake
    M cmake/find_scripts/FindLAPACKE.cmake
    M cmake/find_scripts/FindLibLAS.cmake
    M cmake/find_scripts/FindLibSVM.cmake
    M cmake/find_scripts/FindMySQL.cmake
    M cmake/find_scripts/FindNetCDF.cmake
    M cmake/find_scripts/FindPCRE.cmake
    M cmake/find_scripts/FindPROJ.cmake
    M cmake/find_scripts/FindReadline.cmake
    M cmake/find_scripts/Findzstd.cmake
    M cmake/locale_strings.cmake
    M cmake/modules/CMakeLists.txt
    M cmake/modules/CheckDependentLibraries.cmake
    M cmake/modules/Configure.cmake
    M cmake/modules/DevelUtils.cmake
    M cmake/modules/GRASSInstallDirs.cmake
    M cmake/modules/build_addon.cmake
    M cmake/modules/build_gui_in_subdir.cmake
    M cmake/modules/build_library_in_subdir.cmake
    M cmake/modules/build_module.cmake
    M cmake/modules/build_program.cmake
    M cmake/modules/build_program_in_subdir.cmake
    M cmake/modules/build_script_in_subdir.cmake
    M cmake/modules/check_target.cmake
    M cmake/modules/copy_python_files_in_subdir.cmake
    M cmake/modules/generate_docs.cmake
    M cmake/modules/get_host_arch.cmake
    M cmake/modules/get_versions.cmake
    M cmake/modules/linker.cmake
    M cmake/modules/repo_status.cmake
    M cmake/modules/set_compiler_flags.cmake
    A cmake/stubs/build_library_in_subdir_stub.cmake
    A cmake/stubs/build_program_in_subdir_stub.cmake
    A cmake/stubs/build_program_stub.cmake
    M db/CMakeLists.txt
    M db/drivers/CMakeLists.txt
    M demolocation/CMakeLists.txt
    M display/CMakeLists.txt
    M doc/CMakeLists.txt
    M doc/development/CMakeLists.txt
    M general/CMakeLists.txt
    M general/manage/lister/CMakeLists.txt
    M gui/CMakeLists.txt
    M gui/icons/CMakeLists.txt
    M gui/images/CMakeLists.txt
    M gui/scripts/CMakeLists.txt
    M gui/wxpython/CMakeLists.txt
    M gui/wxpython/docs/CMakeLists.txt
    M imagery/CMakeLists.txt
    M imagery/i.ortho.photo/CMakeLists.txt
    M include/CMakeLists.txt
    M lib/CMakeLists.txt
    M lib/db/CMakeLists.txt
    M lib/db/sqlp/CMakeLists.txt
    M lib/fonts/CMakeLists.txt
    M lib/gis/CMakeLists.txt
    M lib/init/CMakeLists.txt
    M lib/proj/CMakeLists.txt
    M lib/rst/CMakeLists.txt
    M lib/temporal/CMakeLists.txt
    M lib/vector/CMakeLists.txt
    M lib/vector/dglib/CMakeLists.txt
    M lib/vector/diglib/CMakeLists.txt
    M locale/CMakeLists.txt
    M man/CMakeLists.txt
    M misc/CMakeLists.txt
    M ps/CMakeLists.txt
    M python/grass/CMakeLists.txt
    R python/grass/pygrass/CMakeLists.txt
    M python/libgrass_interface_generator/CMakeLists.txt
    M raster/CMakeLists.txt
    M raster/r.colors.out/CMakeLists.txt
    M raster/r.colors/CMakeLists.txt
    M raster/r.li/CMakeLists.txt
    M raster/r.mapcalc/CMakeLists.txt
    M raster/r.sim/CMakeLists.txt
    M raster/r.spread/CMakeLists.txt
    M raster/r.univar/CMakeLists.txt
    M raster/r.watershed/CMakeLists.txt
    M raster3d/CMakeLists.txt
    M raster3d/r3.flow/CMakeLists.txt
    M scripts/CMakeLists.txt
    M scripts/g.extension/testsuite/data/sample_modules/r.plus.example/CMakeLists.txt
    M temporal/CMakeLists.txt
    M utils/CMakeLists.txt
    M vector/CMakeLists.txt
    M vector/v.lrs/CMakeLists.txt

  Log Message:
  -----------
  Checks: Add Gersemi to format cmake files in pre-commit (#7696)

* Checks: Add Gersemi to format cmake files in pre-commit

* CMake: Remove file python/grass/pygrass/CMakeLists.txt as unused per issue https://github.com/OSGeo/grass/issues/7686

[Bug] Where are CMake functions `build_pymodule_in_subdir` and `copy_python_file` defined?
Fixes #7686

* Define indentation for cmake files in .editorconfig to match gersemi's defaults

* checks: Create cmake stubs containing definitions for gersemi-unrecognized functions or macros

* cmake: Ignore one duplicated `_test_package` definition in FindLAPACKE.cmake/FindCBLAS.cmake

* cmake: Add more gersemi hints to indicate how to treat specific multi-value arguments

* cmake: Format all cmake files


  Commit: c77cf203fb82ce4871590e7b07bacaa3b268ff5e
      https://github.com/OSGeo/grass/commit/c77cf203fb82ce4871590e7b07bacaa3b268ff5e
  Author: Anna Petrasova <kratochanna at gmail.com>
  Date:   2026-07-17 (Fri, 17 Jul 2026)

  Changed paths:
    M vector/v.proj/main.c
    A vector/v.proj/tests/v_proj_wind_override_test.py

  Log Message:
  -----------
  v.proj: Seed region from default window to ignore region override (#7578)

When v.proj switches into the source project to read the input vector, it seeded its working region with G_get_window(), which honors WIND_OVERRIDE and GRASS_REGION. WIND_OVERRIDE names a region in the caller's mapset, not in the source project, so the read failed with "Unable to open element file" whenever v.proj ran under a named temporary region (e.g. inside RegionManager, use_temp_region(), or parallel pipelines). Using GRASS_REGION would also be wrong.

Read the source project's default window instead. The seed value is overwritten field by field from the input vector's extent immediately afterward, so seeding from the default window is sufficient and does not consult the override. G_unset_window() is dropped since it only existed to defeat G_get_window()'s cache.

Adds a regression test that runs v.proj with WIND_OVERRIDE naming a region present only in the target mapset.


  Commit: cb04122c70d15fa2b397ff93b36bc5f30525b587
      https://github.com/OSGeo/grass/commit/cb04122c70d15fa2b397ff93b36bc5f30525b587
  Author: Rajveer* <irajveer.bishnoi2310 at gmail.com>
  Date:   2026-07-17 (Fri, 17 Jul 2026)

  Changed paths:
    A raster/r.cross/tests/test_r_cross.py
    R raster/r.cross/testsuite/test_cross.py

  Log Message:
  -----------
  r.cross: migrate tests from gunittest to pytest (#7635)

* r.cross: migrate tests from gunittest to pytest

Replace the gunittest testsuite with a pytest module covering the same
behavior: the basic cross product (categories 0..8, no NULLs) and the -z
flag case (NULL combinations dropped, categories 0..5, output has NULLs).
It uses a tmp_path session fixture with synthetic 3x3 rasters and the
grass.tools API.

* Overwrite is not needed, use Tools everywhere

Co-authored-by: Vaclav Petras <wenzeslaus at gmail.com>

---------

Co-authored-by: Vaclav Petras <wenzeslaus at gmail.com>


  Commit: f778540e31a1ef6b05e5ff2b6efd55e82fa11e11
      https://github.com/OSGeo/grass/commit/f778540e31a1ef6b05e5ff2b6efd55e82fa11e11
  Author: Christian Braun <christian.braun1980 at gmail.com>
  Date:   2026-07-17 (Fri, 17 Jul 2026)

  Changed paths:
    M gui/wxpython/lmgr/layertree.py

  Log Message:
  -----------
  wxGUI: fix orphaned drag image windows when dragging layers in layer tree on macOS (#7725)


  Commit: 7b7710694b1d2a250a78a4b0ea94ed7828dcf880
      https://github.com/OSGeo/grass/commit/7b7710694b1d2a250a78a4b0ea94ed7828dcf880
  Author: Vaclav Petras <wenzeslaus at gmail.com>
  Date:   2026-07-17 (Fri, 17 Jul 2026)

  Changed paths:
    M python/grass/gunittest/runner.py
    M python/grass/imaging/images2avi.py
    M python/grass/pydispatch/dispatcher.py
    M python/grass/pygrass/raster/abstract.py
    M python/grass/pygrass/vector/geometry.py
    M python/grass/temporal/core.py
    M python/grass/tools/session_tools.py

  Log Message:
  -----------
  docs: Fix reStructuredText markup in Python docstrings (#7741)

The Sphinx build of the Python API documentation reports docutils
warnings and errors for docstrings with invalid reStructuredText, and
the affected docstrings also render badly. Fix the markup without
changing the documented content:

- grass.pydispatch.dispatcher: mark the two attribute listings as
  literal blocks, so that their plain-text layout is preserved instead
  of being misparsed as definition lists and block quotes.
- grass.pygrass.raster.abstract: drop the literal block marker in front
  of the doctest example of Info, so that the example is parsed as a
  doctest block. The expected output lines are not prefixed with ">>>",
  which made the quoting of the literal block inconsistent.
- grass.pygrass.vector.geometry: turn the parameter descriptions of the
  Node constructor into an actual field list.
- grass.gunittest.runner, grass.pygrass.vector.geometry,
  grass.tools.session_tools: escape or quote the asterisks so that
  "**kwargs" is not parsed as the start of inline strong markup.
- grass.imaging.images2avi: indent the continuation line of the bg_task
  field body, so that the field list is not cut short.
- grass.temporal.core: indent the content of the warning directive in
  init(), so that the directive is not empty.

This brings the number of warnings and errors reported by the Sphinx
build down from 42 to 19. Each fixed docstring is reported twice because
the subpackages are currently documented under two names.

The fixes were prepared with the help of Claude Code (AI) and verified
against the rendered HTML pages.


  Commit: b6b18bde311b233357040d169ddc40a10f1a961a
      https://github.com/OSGeo/grass/commit/b6b18bde311b233357040d169ddc40a10f1a961a
  Author: Anna Petrasova <kratochanna at gmail.com>
  Date:   2026-07-17 (Fri, 17 Jul 2026)

  Changed paths:
    M lib/proj/do_proj.c
    A vector/v.proj/tests/conftest.py
    A vector/v.proj/tests/v_proj_test.py

  Log Message:
  -----------
  v.proj: fix reprojection with smax=0 from latlon (#7730)

Bug: v.proj with smax=0 (densification disabled) on lines or boundaries with more than one vertex, coming from a lat/lon source project — only the first vertex was projected correctly, the rest came out as garbage.


  Commit: 0b25cf0163752bd655dc78422ff5de047d4620ba
      https://github.com/OSGeo/grass/commit/0b25cf0163752bd655dc78422ff5de047d4620ba
  Author: Vaclav Petras <wenzeslaus at gmail.com>
  Date:   2026-07-17 (Fri, 17 Jul 2026)

  Changed paths:
    M .gitignore
    M doc/examples/notebooks/parallelization_tutorial.ipynb
    M doc/grass_projects.md
    M doc/python_intro.md
    M python/grass/docs/Makefile
    M python/grass/docs/conf.py
    M python/grass/docs/src/gunittest_testing.rst
    M python/grass/docs/src/index.rst
    M python/grass/docs/src/pygrass_gis.rst
    M python/grass/docs/src/pygrass_index.rst
    M python/grass/docs/src/pygrass_messages.rst
    M python/grass/docs/src/pygrass_modules.rst
    M python/grass/docs/src/pygrass_raster.rst
    M python/grass/docs/src/pygrass_vector.rst
    M python/grass/docs/src/script_intro.rst
    M python/grass/docs/src/temporal_framework.rst

  Log Message:
  -----------
  docs: Generate libpython API docs only under the grass namespace (#7740)

The Sphinx build of the Python library documented every subpackage
twice: once under a stripped namespace (pygrass, script, temporal, ...)
and once under the full, preferred one (grass.pygrass, grass.script,
...). Keep only the grass.* pages.

Drop the seven per-subpackage sphinx-apidoc runs and the sys.path
entries in conf.py that made the modules importable under their stripped
names, and point the handwritten pages, the theme navigation and the
links in doc/ at the grass.* pages and modules.

This removes 22 of the 42 Sphinx warnings. All ten "more than one target
found for cross-reference" warnings (Table, GrassTestFilesMultiReporter)
are gone, since they were caused purely by the duplicate generation, as
are the docstring warnings which were reported once per spelling.

The three remaining "duplicate object description" warnings (Module,
MultiModule, ParallelModuleQueue) are not caused by the stripped
namespace: grass.pygrass.modules re-exports these classes, so autodoc
documents them both on the package page and on the page of the module
defining them. They are left for a separate change.

This change was prepared with the assistance of Claude Code.


  Commit: bcca890878070c434e8cb93433d0c597bbf7e9e9
      https://github.com/OSGeo/grass/commit/bcca890878070c434e8cb93433d0c597bbf7e9e9
  Author: Edouard Choinière <27212526+echoix at users.noreply.github.com>
  Date:   2026-07-17 (Fri, 17 Jul 2026)

  Changed paths:
    M gui/wxpython/animation/data.py
    M gui/wxpython/animation/nviztask.py
    M gui/wxpython/core/settings.py
    M gui/wxpython/core/utils.py
    M gui/wxpython/dbmgr/base.py
    M gui/wxpython/gmodeler/model.py
    M gui/wxpython/gui_core/forms.py
    M gui/wxpython/gui_core/toolbars.py
    M gui/wxpython/mapdisp/main.py
    M gui/wxpython/rdigit/controller.py
    M gui/wxpython/wxgui.py
    M pyproject.toml
    M python/grass/gunittest/case.py
    M python/grass/imaging/images2avi.py
    M python/grass/pydispatch/dispatcher.py
    M python/grass/pygrass/raster/category.py
    M python/grass/pygrass/rpc/base.py
    M python/grass/pygrass/vector/table.py
    M python/grass/script/core.py
    M python/grass/script/task.py
    M python/grass/script/utils.py
    M python/grass/script/vector.py
    M python/grass/semantic_label/reader.py
    M python/grass/utils/download.py
    M scripts/r.in.wms/wms_cap_parsers.py

  Log Message:
  -----------
  style: Fix raise-without-from-inside-except (B904) (#4032)

Enable the ruff B904 rule and add explicit exception chaining to raise
statements inside except clauses.

Most exceptions are chained with "from error" to preserve the original,
including where the original is also passed into the message of the new
exception, so the detail is both in the message and in the chained traceback;
reducing that duplication is left for later. "from None" is used where the
original would be noise: where it is an implementation detail of the raising
code (for example, IndexError becoming StopIteration) or where the new
exception gives a clearer replacement message (for example, an invalid value
for a database column). In wxGUI, the original error is passed into the new
exception and "from None" is used; that exception is caught immediately and
only its message is shown, so no traceback is produced.

The change covers wxGUI, grass.script, grass.pygrass, grass.gunittest,
grass.imaging, grass.pydispatch, grass.semantic_label, grass.utils, and
r.in.wms.

Related bug fixes included:

* rdigit: "raise ScriptError" raised the class, not an instance. ScriptError
  requires a message argument, so this raised TypeError instead, which the
  callers' "except ScriptError" handlers did not catch. A failing r.mapcalc
  or g.copy resulted in a traceback instead of showing an error message. The
  message of the module error is now passed to ScriptError.
* wxGUI toolbars: Remove an unreachable return statement after a raise.
* wxGUI utils: Remove a dead try-except in __ll_parts which could not be
  reached and only re-raised an empty ValueError.


  Commit: 740266b459adf86f4e5154e10394f7702f402d36
      https://github.com/OSGeo/grass/commit/740266b459adf86f4e5154e10394f7702f402d36
  Author: Anna Petrasova <kratochanna at gmail.com>
  Date:   2026-07-17 (Fri, 17 Jul 2026)

  Changed paths:
    M scripts/g.extension/g.extension.py

  Log Message:
  -----------
  g.extension: Skip official repo query when installing from other sources (#7746)

Updating metadata after install consulted the official grass-addons
repository (git ls-remote and a clone) to identify multi-addon
overview pages, even when installing from a local directory, so
installs failed without internet access.


  Commit: 0271cdb15cbc4514854319b85ad10e76830be799
      https://github.com/OSGeo/grass/commit/0271cdb15cbc4514854319b85ad10e76830be799
  Author: Vaclav Petras <wenzeslaus at gmail.com>
  Date:   2026-07-17 (Fri, 17 Jul 2026)

  Changed paths:
    M .editorconfig
    M .github/workflows/cmake.yml
    M .github/workflows/macos.yml
    M .github/workflows/osgeo4w.yml
    M .github/workflows/pytest_args_gunittest.txt
    M .gitignore
    M .pre-commit-config.yaml
    M AGENTS.md
    M CMakeLists.txt
    M GRASSConfig.cmake.in
    M cmake/ctypesgen.cmake
    M cmake/find_scripts/CMakeLists.txt
    M cmake/find_scripts/FindCBLAS.cmake
    M cmake/find_scripts/FindCairo.cmake
    M cmake/find_scripts/FindFFTW-egpbos.cmake
    M cmake/find_scripts/FindFFTW-eigen.cmake
    M cmake/find_scripts/FindFFTW.cmake
    M cmake/find_scripts/FindGEOS.cmake
    M cmake/find_scripts/FindLAPACKE.cmake
    M cmake/find_scripts/FindLibLAS.cmake
    M cmake/find_scripts/FindLibSVM.cmake
    M cmake/find_scripts/FindMySQL.cmake
    M cmake/find_scripts/FindNetCDF.cmake
    M cmake/find_scripts/FindPCRE.cmake
    M cmake/find_scripts/FindPROJ.cmake
    M cmake/find_scripts/FindReadline.cmake
    M cmake/find_scripts/Findzstd.cmake
    M cmake/locale_strings.cmake
    M cmake/modules/CMakeLists.txt
    M cmake/modules/CheckDependentLibraries.cmake
    M cmake/modules/Configure.cmake
    M cmake/modules/DevelUtils.cmake
    M cmake/modules/GRASSInstallDirs.cmake
    M cmake/modules/build_addon.cmake
    M cmake/modules/build_gui_in_subdir.cmake
    M cmake/modules/build_library_in_subdir.cmake
    M cmake/modules/build_module.cmake
    M cmake/modules/build_program.cmake
    M cmake/modules/build_program_in_subdir.cmake
    M cmake/modules/build_script_in_subdir.cmake
    M cmake/modules/check_target.cmake
    M cmake/modules/copy_python_files_in_subdir.cmake
    M cmake/modules/generate_docs.cmake
    M cmake/modules/get_host_arch.cmake
    M cmake/modules/get_versions.cmake
    M cmake/modules/linker.cmake
    M cmake/modules/repo_status.cmake
    M cmake/modules/set_compiler_flags.cmake
    A cmake/stubs/build_library_in_subdir_stub.cmake
    A cmake/stubs/build_program_in_subdir_stub.cmake
    A cmake/stubs/build_program_stub.cmake
    M db/CMakeLists.txt
    M db/drivers/CMakeLists.txt
    M demolocation/CMakeLists.txt
    M display/CMakeLists.txt
    M display/d.linegraph/main.c
    M doc/CMakeLists.txt
    A doc/development/CMakeLists.txt
    M doc/development/style_guide.md
    M doc/examples/notebooks/parallelization_tutorial.ipynb
    M doc/grass_projects.md
    M doc/howto_release.md
    M doc/python_intro.md
    M general/CMakeLists.txt
    M general/manage/lister/CMakeLists.txt
    M gui/CMakeLists.txt
    M gui/icons/CMakeLists.txt
    M gui/images/CMakeLists.txt
    M gui/scripts/CMakeLists.txt
    M gui/wxpython/CMakeLists.txt
    M gui/wxpython/animation/data.py
    M gui/wxpython/animation/nviztask.py
    M gui/wxpython/core/menutree.py
    M gui/wxpython/core/settings.py
    M gui/wxpython/core/utils.py
    M gui/wxpython/dbmgr/base.py
    M gui/wxpython/docs/CMakeLists.txt
    M gui/wxpython/gmodeler/model.py
    M gui/wxpython/gmodeler/panels.py
    M gui/wxpython/gui_core/forms.py
    M gui/wxpython/gui_core/toolbars.py
    M gui/wxpython/image2target/ii2t_gis_set.py
    M gui/wxpython/lmgr/layertree.py
    M gui/wxpython/mapdisp/main.py
    M gui/wxpython/rdigit/controller.py
    M gui/wxpython/rlisetup/frame.py
    M gui/wxpython/wxgui.py
    M imagery/CMakeLists.txt
    M imagery/i.ortho.photo/CMakeLists.txt
    M include/CMakeLists.txt
    M include/Make/Module.make
    M include/Make/Script.make
    M lib/CMakeLists.txt
    M lib/db/CMakeLists.txt
    M lib/db/dbmi_base/dirent.c
    M lib/db/sqlp/CMakeLists.txt
    M lib/fonts/CMakeLists.txt
    M lib/gis/CMakeLists.txt
    M lib/gmath/lu.c
    M lib/init/CMakeLists.txt
    M lib/proj/CMakeLists.txt
    M lib/proj/do_proj.c
    M lib/rst/CMakeLists.txt
    M lib/temporal/CMakeLists.txt
    M lib/vector/CMakeLists.txt
    M lib/vector/dglib/CMakeLists.txt
    M lib/vector/diglib/CMakeLists.txt
    A lib/vector/rtree/tests/lib_vector_rtree_ctypes_test.py
    M locale/CMakeLists.txt
    M man/CMakeLists.txt
    M man/build.py
    M man/build_manpages.py
    M man/build_rest.py
    M man/mkdocs/docs/development_intro.md
    M misc/CMakeLists.txt
    M ps/CMakeLists.txt
    M pyproject.toml
    M python/grass/CMakeLists.txt
    M python/grass/app/cli.py
    M python/grass/app/tests/grass_app_cli_test.py
    M python/grass/docs/Makefile
    M python/grass/docs/conf.py
    M python/grass/docs/src/gunittest_testing.rst
    M python/grass/docs/src/index.rst
    M python/grass/docs/src/pygrass_gis.rst
    M python/grass/docs/src/pygrass_index.rst
    M python/grass/docs/src/pygrass_messages.rst
    M python/grass/docs/src/pygrass_modules.rst
    M python/grass/docs/src/pygrass_raster.rst
    M python/grass/docs/src/pygrass_vector.rst
    M python/grass/docs/src/script_intro.rst
    M python/grass/docs/src/temporal_framework.rst
    M python/grass/grassdb/manage.py
    M python/grass/gunittest/case.py
    M python/grass/gunittest/reporters.py
    M python/grass/gunittest/runner.py
    M python/grass/imaging/images2avi.py
    M python/grass/pydispatch/dispatcher.py
    R python/grass/pygrass/CMakeLists.txt
    M python/grass/pygrass/modules/grid/grid.py
    M python/grass/pygrass/modules/interface/flag.py
    M python/grass/pygrass/modules/interface/module.py
    M python/grass/pygrass/modules/interface/parameter.py
    M python/grass/pygrass/modules/interface/read.py
    M python/grass/pygrass/raster/abstract.py
    M python/grass/pygrass/raster/category.py
    M python/grass/pygrass/rpc/base.py
    M python/grass/pygrass/vector/geometry.py
    M python/grass/pygrass/vector/table.py
    M python/grass/script/__init__.py
    M python/grass/script/core.py
    M python/grass/script/db.py
    M python/grass/script/task.py
    A python/grass/script/tests/grass_script_create_mapset_test.py
    M python/grass/script/utils.py
    M python/grass/script/vector.py
    M python/grass/semantic_label/reader.py
    M python/grass/temporal/Makefile
    M python/grass/temporal/__init__.py
    M python/grass/temporal/abstract_space_time_dataset.py
    M python/grass/temporal/core.py
    M python/grass/temporal/gui_support.py
    M python/grass/temporal/list_stds.py
    M python/grass/temporal/register.py
    M python/grass/temporal/tests/grass_temporal_core_init_skip_db_test.py
    A python/grass/temporal/tests/grass_temporal_datetime_math_test.py
    A python/grass/temporal/tests/grass_temporal_granularity_test.py
    A python/grass/temporal/tests/grass_temporal_gui_support_test.py
    A python/grass/temporal/tests/grass_temporal_spatial_extent_test.py
    A python/grass/temporal/tests/grass_temporal_topology_test.py
    R python/grass/temporal/unit_tests.py
    M python/grass/tools/session_tools.py
    M python/grass/utils/download.py
    A python/grass/utils/tests/grass_utils_download_test.py
    M python/libgrass_interface_generator/CMakeLists.txt
    M raster/CMakeLists.txt
    M raster/r.colors.out/CMakeLists.txt
    M raster/r.colors/CMakeLists.txt
    A raster/r.cross/tests/test_r_cross.py
    R raster/r.cross/testsuite/test_cross.py
    M raster/r.in.gdal/main.c
    M raster/r.li/CMakeLists.txt
    M raster/r.mapcalc/CMakeLists.txt
    M raster/r.param.scale/Makefile
    A raster/r.param.scale/benchmark/benchmark_r_param_scale_nprocs.py
    M raster/r.param.scale/close_down.c
    M raster/r.param.scale/find_normal.c
    M raster/r.param.scale/interface.c
    M raster/r.param.scale/main.c
    M raster/r.param.scale/open_files.c
    M raster/r.param.scale/param.h
    M raster/r.param.scale/process.c
    M raster/r.param.scale/r.param.scale.md
    M raster/r.param.scale/tests/r_param_scale_test.py
    M raster/r.sim/CMakeLists.txt
    M raster/r.spread/CMakeLists.txt
    M raster/r.univar/CMakeLists.txt
    M raster/r.viewshed/grass.cpp
    M raster/r.watershed/CMakeLists.txt
    M raster/r.watershed/ram/init_vars.c
    M raster3d/CMakeLists.txt
    M raster3d/r3.flow/CMakeLists.txt
    M scripts/CMakeLists.txt
    M scripts/g.download.project/g.download.project.html
    M scripts/g.download.project/g.download.project.md
    M scripts/g.extension/g.extension.py
    M scripts/g.extension/testsuite/data/sample_modules/r.plus.example/CMakeLists.txt
    M scripts/g.extension/testsuite/test_addons_download.py
    M scripts/g.extension/testsuite/test_addons_modules.py
    M scripts/r.in.srtm/r.in.srtm.py
    M scripts/r.in.wms/wms_cap_parsers.py
    M temporal/CMakeLists.txt
    M temporal/t.connect/t.connect.html
    M temporal/t.connect/t.connect.md
    A temporal/t.info/tests/conftest.py
    A temporal/t.info/tests/test_t_info_backend.py
    A temporal/t.info/tests/test_t_info_str3ds.py
    A temporal/t.info/tests/test_t_info_strds.py
    A temporal/t.info/tests/test_t_info_stvds.py
    R temporal/t.info/testsuite/test.t.info.sh
    M temporal/t.list/t.list.py
    M temporal/t.rast.list/t.rast.list.py
    M temporal/t.rast.list/tests/t_rast_list_test.py
    M temporal/t.register/t.register.html
    M temporal/t.register/t.register.md
    R temporal/t.register/test.t.register.raster.file.reltime.sh
    A temporal/t.register/tests/conftest.py
    A temporal/t.register/tests/t_register_file_test.py
    M utils/CMakeLists.txt
    M vector/CMakeLists.txt
    M vector/v.lrs/CMakeLists.txt
    M vector/v.proj/main.c
    A vector/v.proj/tests/conftest.py
    A vector/v.proj/tests/v_proj_test.py
    A vector/v.proj/tests/v_proj_wind_override_test.py

  Log Message:
  -----------
  Merge remote-tracking branch 'upstream/main' into ai-findings-autofix/lib-raster3d-tilewrite.c


  Commit: 46933580b8137b7c02594ad6d449ecb1ede295de
      https://github.com/OSGeo/grass/commit/46933580b8137b7c02594ad6d449ecb1ede295de
  Author: Vaclav Petras <wenzeslaus at gmail.com>
  Date:   2026-07-17 (Fri, 17 Jul 2026)

  Changed paths:
    A lib/raster3d/tests/lib_raster3d_tilewrite_test.py

  Log Message:
  -----------
  lib/raster3d: Add test for Rast3d_write_tile tile index bounds check

Add a pytest test covering the tileIndex bounds check in
Rast3d_write_tile: an index equal to nTiles must be rejected as out of
range, and the last valid index must be accepted. The invalid call runs
in a subprocess using the grass.lib.raster3d ctypes bindings because the
rejection is a fatal error which exits the calling process.

The out-of-range test fails without the bounds check change in this
branch and passes with it.

The test was written by Claude Code using the Claude Fable 5 model.


Compare: https://github.com/OSGeo/grass/compare/f98c0a5d5243...46933580b813

To unsubscribe from these emails, change your notification settings at https://github.com/OSGeo/grass/settings/notifications


More information about the grass-commit mailing list