[SCM] PostGIS branch master updated. 3.7.0beta1-208-gc244b1110d

git at osgeo.org git at osgeo.org
Mon Aug 3 02:45:44 PDT 2026


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "PostGIS".

The branch, master has been updated
       via  c244b1110db72edbe5073a3ee04cab0da232a8e7 (commit)
       via  a10a9fd696417400ab20b39245676596dec715d3 (commit)
      from  80a9286dbacc32ce1538d67745a596b0dd93d52a (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit c244b1110db72edbe5073a3ee04cab0da232a8e7
Merge: 80a9286dba a10a9fd696
Author: Darafei Praliaskouski <komzpa at gmail.com>
Date:   Mon Aug 3 02:45:42 2026 -0700

    Merge pull request 'ci: name the failed step on the CI status dashboard' (!653) from Komzpa/postgis:ci-status-failed-step-name-20260801 into master
    
    A red cell on https://postgis.net/ci/ said only which *workflow* failed. On this repository a workflow is a matrix cell with a dozen steps, so `regress/29` told a reader nothing about whether the build broke, a suite failed, or the agent died — every diagnosis began by opening Woodpecker and hunting for the step.
    
    The step states are already inside the pipeline records the report reads, so naming them costs no extra API call. A failed workflow now renders as `regress/29 (test-upgrades)`. Only failed children are listed, and only for workflows that failed, so successful and in-progress cells are unchanged.
    
    Verified both directions: the new regression passes against this change and **fails** against the previous `report.py`.
    
    Reviewed-on: https://gitea.osgeo.org/postgis/postgis/pulls/653


commit a10a9fd696417400ab20b39245676596dec715d3
Author: Darafei Praliaskouski <me at komzpa.net>
Date:   Sat Aug 1 03:13:54 2026 +0400

    ci: name the failed step on the CI status dashboard
    
    A red cell on https://postgis.net/ci/ said only which workflow failed. On this
    repository a workflow is a matrix cell with a dozen steps, so 'regress/29' told
    a reader nothing about whether the build broke, a suite failed, or the agent
    died — every diagnosis started by opening Woodpecker and hunting for the step.
    
    The step states are already present in the pipeline records the report reads,
    so naming them costs no extra API call: a failed workflow now renders as
    'regress/29 (test-upgrades)'. Only failed children are listed, and only for
    workflows that failed, so successful and in-progress cells are unchanged.
    
    The regression asserts the rendered label contains the failing step name; it
    fails against the previous report.py.

diff --git a/utils/docs/ci_status/report.py b/utils/docs/ci_status/report.py
index 7c61baa8bb..172adbd89d 100644
--- a/utils/docs/ci_status/report.py
+++ b/utils/docs/ci_status/report.py
@@ -421,7 +421,8 @@ def woodpecker_build_sort_key(build):
     )
 
 
-def woodpecker_workflow_label(workflow, duplicate_names):
+def woodpecker_workflow_base_label(workflow, duplicate_names):
+    """Return the human workflow label, disambiguating duplicate names by pid."""
     name = workflow.get("name") or f"workflow {workflow.get('pid') or workflow.get('id')}"
     pid = workflow.get("pid")
     if pid is not None and name in duplicate_names:
@@ -429,6 +430,27 @@ def woodpecker_workflow_label(workflow, duplicate_names):
     return name
 
 
+def woodpecker_failed_step_labels(workflow):
+    """Return failed child step labels already included in a workflow record."""
+    return [
+        str(step.get("name") or f"step {step.get('pid') or step.get('id')}")
+        for step in workflow.get("children") or []
+        if normalize_woodpecker_status(step.get("state") or step.get("status")) == FAILURE
+    ]
+
+
+def woodpecker_workflow_label(workflow, duplicate_names, status):
+    base_label = woodpecker_workflow_base_label(workflow, duplicate_names)
+    if status != FAILURE:
+        return base_label
+
+    failed_children = woodpecker_failed_step_labels(workflow)
+    if not failed_children:
+        return base_label
+
+    return f"{base_label} ({', '.join(failed_children)})"
+
+
 def woodpecker_workflow_url(web_url, pipeline, workflow):
     if not web_url or not pipeline.get("number") or workflow.get("pid") is None:
         return None
@@ -469,7 +491,7 @@ def woodpecker_workflow_details(pipeline, web_url):
         status = normalize_woodpecker_status(workflow.get("state") or workflow.get("status"))
         if status == SUCCESS:
             continue
-        label = woodpecker_workflow_label(workflow, duplicate_names)
+        label = woodpecker_workflow_label(workflow, duplicate_names, status)
         if status == FAILURE:
             by_bucket["failed"].append((label, workflow))
         elif status == IN_PROGRESS:
diff --git a/utils/docs/tests/test_ci_status.py b/utils/docs/tests/test_ci_status.py
index 852c190bdc..4249b539ca 100644
--- a/utils/docs/tests/test_ci_status.py
+++ b/utils/docs/tests/test_ci_status.py
@@ -519,6 +519,52 @@ class CIStatusTest(unittest.TestCase):
             http_json.call_args_list[1].args[0],
         )
 
+    def test_woodpecker_failure_names_single_failed_workflow_child_step(self):
+        check_config = {
+            "name": "Woodpecker",
+            "provider": "woodpecker",
+            "required": True,
+            "api_url": "https://woodie.example.test/api/repos/30/pipelines",
+            "web_url": "https://woodie.example.test/repos/30",
+        }
+        branch = {"name": "stable-3.6", "label": "3.6"}
+        pipeline = {
+            "number": 5431,
+            "event": "push",
+            "branch": "stable-3.6",
+            "ref": "refs/heads/stable-3.6",
+            "status": "failure",
+            "commit": "b" * 40,
+            "message": "opaque commit message",
+        }
+        pipeline_detail = {
+            **pipeline,
+            "workflows": [
+                {"pid": 9, "id": 24470, "name": "regress", "state": "success"},
+                {
+                    "pid": 29,
+                    "id": 24477,
+                    "name": "regress",
+                    "state": "failure",
+                    "children": [
+                        {"pid": 100, "name": "test-upgrades", "state": "failure"},
+                    ],
+                },
+            ],
+        }
+
+        with mock.patch.object(CI_STATUS, "http_json", side_effect=([pipeline], pipeline_detail)) as http_json:
+            result = CI_STATUS.woodpecker_check(check_config, branch, timeout=5)
+
+        self.assertEqual(CI_STATUS.FAILURE, result["status"])
+        self.assertEqual("failed: regress/29 (test-upgrades)", result["message"])
+        self.assertEqual("https://woodie.example.test/repos/30/pipeline/5431/29", result["url"])
+        self.assertEqual("b" * 40, result["revision"])
+        self.assertEqual(
+            "https://woodie.example.test/api/repos/30/pipelines/5431",
+            http_json.call_args_list[1].args[0],
+        )
+
     def test_woodpecker_error_without_workflows_shows_error_message(self):
         check_config = {
             "name": "Woodpecker",

-----------------------------------------------------------------------

Summary of changes:
 utils/docs/ci_status/report.py     | 26 +++++++++++++++++++--
 utils/docs/tests/test_ci_status.py | 46 ++++++++++++++++++++++++++++++++++++++
 2 files changed, 70 insertions(+), 2 deletions(-)


hooks/post-receive
-- 
PostGIS


More information about the postgis-tickets mailing list