[SCM] PostGIS branch master updated. 3.7.0beta1-50-g827e06ab9

git at osgeo.org git at osgeo.org
Mon Jul 27 09:04:20 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  827e06ab9152ed04bc82f2e7991c48bffa1b9315 (commit)
       via  f70445ec395ec9018006e4dde006356c7011d63e (commit)
       via  ee8c28912cd17bd36ca453c64b6432d43726d94f (commit)
       via  16bd690ff08bfff359ec40e0eea70d185f1e0322 (commit)
       via  35276a9c68f61a69e8772e4345cbb080fd8d5334 (commit)
       via  35f5637489b57a23e8b2d93b90240241a1db5287 (commit)
      from  f79d1bec72e41ce2054b3586d70de32fa5135eba (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 827e06ab9152ed04bc82f2e7991c48bffa1b9315
Merge: f79d1bec7 f70445ec3
Author: Darafei Praliaskouski <komzpa at gmail.com>
Date:   Mon Jul 27 09:04:18 2026 -0700

    Merge pull request 'ci: consolidate pipeline reliability fixes' (!559) from Komzpa/postgis:ci/pipeline-reliability-20260727 into master
    
    Reviewed-on: https://gitea.osgeo.org/postgis/postgis/pulls/559


commit f70445ec395ec9018006e4dde006356c7011d63e
Author: Darafei Praliaskouski <me at komzpa.net>
Date:   Mon Jul 27 09:42:59 2026 +0400

    ci: stop one translation push from breaking the whole docs pipeline
    
    Each `html-<lang>` step is gated on its own language's `.po` files, but was also
    chained to the previous language's `html` step. When a push touches a single
    language -- which is what Weblate sends, and it sends them constantly -- every
    other language's step is pruned by its path filter while the surviving step
    still declares `depends_on` on a pruned one. Woodpecker rejects the pipeline
    before creating any workflow:
    
        step 'html-ja' depends on unknown step 'html-de'
    
    The pipeline then reports as `error` with zero workflows, which reads on
    https://postgis.net/ci/ as a failing `master` even though nothing was built or
    tested. The Japanese translation commit f79d1bec72e4 is the current instance;
    any single-language push reproduces it.
    
    There were 15 of these cross-language dependencies, covering the entire
    `html-*` chain, so master goes red on essentially every translation push.
    
    Each `html-<lang>` now depends only on its own `check-xml-<lang>`, which is the
    dependency that actually matters: a language's HTML build needs that language's
    XML checked, and nothing else. The cross-language chaining only serialised the
    builds, and it cannot coexist with per-language path gating.

diff --git a/.woodpecker/docs.yml b/.woodpecker/docs.yml
index b71ffae6b..87f39a39a 100644
--- a/.woodpecker/docs.yml
+++ b/.woodpecker/docs.yml
@@ -307,7 +307,7 @@ steps:
     pull: true
     commands:
       - make -C build-docs/doc/po/pt_BR local-html
-    depends_on: [ check-xml-pt_BR, html-it_IT ]
+    depends_on: check-xml-pt_BR
     when:
        - path:
           include:
@@ -318,7 +318,7 @@ steps:
     pull: true
     commands:
       - make -C build-docs/doc/po/fr local-html
-    depends_on: [ check-xml-fr, html-pt_BR ]
+    depends_on: check-xml-fr
     when:
        - path:
           include:
@@ -329,7 +329,7 @@ steps:
     pull: true
     commands:
       - make -C build-docs/doc/po/es local-html
-    depends_on: [ check-xml-es, html-fr ]
+    depends_on: check-xml-es
     when:
        - path:
           include:
@@ -340,7 +340,7 @@ steps:
     pull: true
     commands:
       - make -C build-docs/doc/po/pl local-html
-    depends_on: [ check-xml-pl, html-es ]
+    depends_on: check-xml-pl
     when:
        - path:
           include:
@@ -351,7 +351,7 @@ steps:
     pull: true
     commands:
       - make -C build-docs/doc/po/ka local-html
-    depends_on: [ check-xml-ka, html-pl ]
+    depends_on: check-xml-ka
     when:
        - path:
           include:
@@ -362,7 +362,7 @@ steps:
     pull: true
     commands:
       - make -C build-docs/doc/po/ko_KR local-html
-    depends_on: [ check-xml-ko_KR, html-ka ]
+    depends_on: check-xml-ko_KR
     when:
        - path:
           include:
@@ -373,7 +373,7 @@ steps:
     pull: true
     commands:
       - make -C build-docs/doc/po/da local-html
-    depends_on: [ check-xml-da, html-ko_KR ]
+    depends_on: check-xml-da
     when:
        - path:
           include:
@@ -384,7 +384,7 @@ steps:
     pull: true
     commands:
       - make -C build-docs/doc/po/de local-html
-    depends_on: [ check-xml-de, html-da ]
+    depends_on: check-xml-de
     when:
        - path:
           include:
@@ -395,7 +395,7 @@ steps:
     pull: true
     commands:
       - make -C build-docs/doc/po/ja local-html
-    depends_on: [ check-xml-ja, html-de ]
+    depends_on: check-xml-ja
     when:
        - path:
           include:
@@ -406,7 +406,7 @@ steps:
     pull: true
     commands:
       - make -C build-docs/doc/po/ru local-html
-    depends_on: [ check-xml-ru, html-ja ]
+    depends_on: check-xml-ru
     when:
        - path:
           include:
@@ -417,7 +417,7 @@ steps:
     pull: true
     commands:
       - make -C build-docs/doc/po/zh_Hans local-html
-    depends_on: [ check-xml-zh_Hans, html-ru ]
+    depends_on: check-xml-zh_Hans
     when:
        - path:
           include:
@@ -428,7 +428,7 @@ steps:
     pull: true
     commands:
       - make -C build-docs/doc/po/ro local-html
-    depends_on: [ check-xml-ro, html-zh_Hans ]
+    depends_on: check-xml-ro
     when:
        - path:
           include:
@@ -439,7 +439,7 @@ steps:
     pull: true
     commands:
       - make -C build-docs/doc/po/sv local-html
-    depends_on: [ check-xml-sv, html-ro ]
+    depends_on: check-xml-sv
     when:
        - path:
           include:
@@ -450,7 +450,7 @@ steps:
     pull: true
     commands:
       - make -C build-docs/doc/po/uk local-html
-    depends_on: [ check-xml-uk, html-sv ]
+    depends_on: check-xml-uk
     when:
        - path:
           include:
@@ -461,7 +461,7 @@ steps:
     pull: true
     commands:
       - make -C build-docs/doc/po/be local-html
-    depends_on: [ check-xml-be, html-uk ]
+    depends_on: check-xml-be
     when:
        - path:
           include:

commit ee8c28912cd17bd36ca453c64b6432d43726d94f
Author: Darafei Praliaskouski <me at komzpa.net>
Date:   Sun Jul 26 20:27:04 2026 +0400

    ci: ignore missing generated sources in lcov

diff --git a/.woodpecker/qa-expensive.yml b/.woodpecker/qa-expensive.yml
index 5c9b8ec11..d4f9dbb2f 100644
--- a/.woodpecker/qa-expensive.yml
+++ b/.woodpecker/qa-expensive.yml
@@ -52,7 +52,7 @@ steps:
         --enable-debug
       - make -j1
       - make check RUNTESTFLAGS="--verbose $${QA_REGRESS_HOOKS}"
-      - lcov --capture --directory "$${BUILDDIR}" --output-file "$${BUILDDIR}/coverage.info"
+      - lcov --capture --directory "$${BUILDDIR}" --output-file "$${BUILDDIR}/coverage.info" --ignore-errors source
       - lcov --list "$${BUILDDIR}/coverage.info"
 
   garden:

commit 16bd690ff08bfff359ec40e0eea70d185f1e0322
Author: Darafei Praliaskouski <me at komzpa.net>
Date:   Sun Jul 26 20:26:19 2026 +0400

    ci: widen Docker image pull retry window

diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index e62f529bf..82646b0ba 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -54,7 +54,8 @@ jobs:
         retry() {
           max_attempts="$1"
           delay="$2"
-          shift 2
+          max_delay="$3"
+          shift 3
           attempt=1
           while true; do
             "$@" && return 0
@@ -66,12 +67,16 @@ jobs:
             echo "Command failed with exit code ${status}; retrying in ${delay}s (${attempt}/${max_attempts}): $*"
             sleep "$delay"
             attempt=$((attempt + 1))
+            delay=$((delay * 2))
+            if test "$delay" -gt "$max_delay"; then
+              delay="$max_delay"
+            fi
           done
         }
 
         uname -a
         build_image="postgis/postgis-build-env:${{ matrix.ci.tag }}"
-        retry 3 15 docker pull "${build_image}"
+        retry 6 20 180 docker pull "${build_image}"
         echo "FROM ${build_image}" > Dockerfile
         if test "${{ matrix.ci.mode }}" = "garden"; then
           echo "USER root" >> Dockerfile

commit 35276a9c68f61a69e8772e4345cbb080fd8d5334
Author: Darafei Praliaskouski <me at komzpa.net>
Date:   Mon Jul 27 09:13:51 2026 +0400

    ci: create regression roles in private clusters

diff --git a/ci/start-postgresql.sh b/ci/start-postgresql.sh
index c8926c008..16394e94a 100755
--- a/ci/start-postgresql.sh
+++ b/ci/start-postgresql.sh
@@ -48,6 +48,22 @@ pgstart_stop()
   fi
 }
 
+pgstart_create_role()
+{
+  role=$1
+  test -n "${role}" || return 0
+
+  psql -XAt --set ON_ERROR_STOP=1 --set role="${role}" template1 <<'SQL'
+SELECT format('CREATE ROLE %I LOGIN', :'role')
+WHERE NOT EXISTS (
+  SELECT 1
+  FROM pg_catalog.pg_roles
+  WHERE rolname = :'role'
+)
+\gexec
+SQL
+}
+
 PGROOT=${PGROOT:-$(mktemp -d "${TMPDIR:-/tmp}/postgis-pg${PGVER}.XXXXXX")}
 PGDATA=${PGDATA:-${PGROOT}/data}
 PGHOST=${PGHOST:-${PGROOT}/socket}
@@ -80,3 +96,6 @@ if ! runuser -u "${PGSTART_USER}" -- "${PGCTL}" -D "${PGDATA}" -l "${PGLOG}" \
   echo "ci/start-postgresql.sh: PostgreSQL ${PGVER} failed to start" >&2
   exit 1
 fi
+
+pgstart_create_role "${POSTGIS_REGRESS_DB_OWNER:-}"
+pgstart_create_role "${POSTGIS_REGRESS_ROLE_EXT_CREATOR:-}"

commit 35f5637489b57a23e8b2d93b90240241a1db5287
Author: Darafei Praliaskouski <me at komzpa.net>
Date:   Mon Jul 27 04:56:56 2026 +0400

    ci: isolate Woodpecker PostgreSQL state

diff --git a/.woodpecker/qa-expensive.yml b/.woodpecker/qa-expensive.yml
index 8b0d900f2..5c9b8ec11 100644
--- a/.woodpecker/qa-expensive.yml
+++ b/.woodpecker/qa-expensive.yml
@@ -9,19 +9,13 @@ variables:
   steps-env: &steps-env
     - export PGVER=18
     - export PATH=/usr/lib/postgresql/$${PGVER}/bin:$${PATH}
-    - export PGHOST=/tmp
-    - export PGPORT=$$(grep ^port /etc/postgresql/$${PGVER}/main/postgresql.conf | awk '{print $$3}')
     - export POSTGIS_REGRESS_DB_OWNER=postgis_reg_unprivileged_user
     - export SRCDIR=$${CI_WORKSPACE}
     - export BUILDDIR=$${SRCDIR}/build/qa-$${QA_MODE}-pg$${PGVER}
     - export QA_REGRESS_HOOKS="--after-create-db-script $${CI_WORKSPACE}/regress/hooks/configure-pgextwlist.sql"
     - pg_config --version
   steps-start-postgresql: &steps-start-postgresql
-    - runuser -u postgres -- pg_ctl
-      -D /var/lib/postgresql/$${PGVER}/main
-      -l /tmp/postgresql-$${PGVER}-$${QA_MODE}.log
-      -o "-c config_file=/etc/postgresql/$${PGVER}/main/postgresql.conf -c unix_socket_directories=/tmp"
-      -t 300 start
+    - . ci/start-postgresql.sh
     - psql -c 'select version()' template1
 
 clone:
diff --git a/.woodpecker/qa.yml b/.woodpecker/qa.yml
index 1853ce0b4..2befd93b6 100644
--- a/.woodpecker/qa.yml
+++ b/.woodpecker/qa.yml
@@ -7,19 +7,13 @@ variables:
   steps-env: &steps-env
     - export PGVER=18
     - export PATH=/usr/lib/postgresql/$${PGVER}/bin:$${PATH}
-    - export PGHOST=/tmp
-    - export PGPORT=$$(grep ^port /etc/postgresql/$${PGVER}/main/postgresql.conf | awk '{print $$3}')
     - export POSTGIS_REGRESS_DB_OWNER=postgis_reg_unprivileged_user
     - export SRCDIR=$${CI_WORKSPACE}
     - export BUILDDIR=$${SRCDIR}/build/qa-$${QA_MODE}-pg$${PGVER}
     - export QA_REGRESS_HOOKS="--after-create-db-script $${CI_WORKSPACE}/regress/hooks/configure-pgextwlist.sql"
     - pg_config --version
   steps-start-postgresql: &steps-start-postgresql
-    - runuser -u postgres -- pg_ctl
-      -D /var/lib/postgresql/$${PGVER}/main
-      -l /tmp/postgresql-$${PGVER}-$${QA_MODE}.log
-      -o "-c config_file=/etc/postgresql/$${PGVER}/main/postgresql.conf -c unix_socket_directories=/tmp"
-      -t 300 start
+    - . ci/start-postgresql.sh
     - psql -c 'select version()' template1
 
 clone:
diff --git a/.woodpecker/regress.yml b/.woodpecker/regress.yml
index 666b16fea..e8402be47 100644
--- a/.woodpecker/regress.yml
+++ b/.woodpecker/regress.yml
@@ -6,8 +6,6 @@ variables:
   test-image: &test-image repo.osgeo.org/postgis/build-test:debian13
   steps-env: &steps-env
     - export PATH=/usr/lib/postgresql/$${PGVER}/bin:$${PATH}
-    - export PGHOST=/tmp
-    - export PGPORT=$$(grep ^port /etc/postgresql/$${PGVER}/main/postgresql.conf | awk '{print $$3}')
     - export POSTGIS_REGRESS_DB_OWNER=postgis_reg_unprivileged_user
     - export RUNTESTFLAGS="-v
       --after-create-db-script $${CI_WORKSPACE}/regress/hooks/configure-pgextwlist.sql
@@ -17,14 +15,7 @@ variables:
     - export CURRENTVERSION=$$(grep '^POSTGIS_' $${SRCDIR}/Version.config | cut -d= -f2 | paste -sd '.')
     - pg_config --version
   steps-start-postgresql: &steps-start-postgresql
-    # The test image can need crash recovery after clone-local startup. Under
-    # multi-workflow I/O load, Debian's default 60-second pg_ctl wait is short.
-    # Use /tmp for the socket: runner-specific /run mounts are not portable.
-    - runuser -u postgres -- pg_ctl
-      -D /var/lib/postgresql/$${PGVER}/main
-      -l /tmp/postgresql-$${PGVER}.log
-      -o "-c config_file=/etc/postgresql/$${PGVER}/main/postgresql.conf -c unix_socket_directories=/tmp"
-      -t 300 start
+    - . ci/start-postgresql.sh
     - psql -c 'select version()' template1
   steps-pg-build: &steps-pg-build
     - mkdir -p "$${BUILDDIR}"
@@ -130,6 +121,7 @@ steps:
     commands:
       - make -C build/pg$${PGVER} install
       - make -C build/pg$${SECOND_PGVER} install
+      - export PGPORT=$$((20000 + ($${CI_PIPELINE_NUMBER:-0} % 1000) * 32 + ($${CI_WORKFLOW_NUMBER:-30} % 32)))
       - su postgres -c 'utils/check_cluster_upgrade.sh -i regress/hooks/cluster-upgrade-geography.sql /usr/lib/postgresql/'$${PGVER}'/bin/pg_config /usr/lib/postgresql/'$${SECOND_PGVER}'/bin/pg_config'
 
 # Every entry is an independent workflow with its own clone, workspace,
diff --git a/ci/start-postgresql.sh b/ci/start-postgresql.sh
new file mode 100755
index 000000000..c8926c008
--- /dev/null
+++ b/ci/start-postgresql.sh
@@ -0,0 +1,82 @@
+#!/bin/sh
+
+set -eu
+
+: "${PGVER:?PGVER must name the PostgreSQL major version}"
+
+PGBINDIR=${PGBINDIR:-/usr/lib/postgresql/${PGVER}/bin}
+PGCTL=${PGCTL:-${PGBINDIR}/pg_ctl}
+INITDB=${INITDB:-${PGBINDIR}/initdb}
+PGSTART_USER=${PGSTART_USER:-postgres}
+PGSTART_TIMEOUT=${PGSTART_TIMEOUT:-300}
+
+pgstart_number()
+{
+  case "$1" in
+    ''|*[!0-9]*) echo 0 ;;
+    *) echo "$1" ;;
+  esac
+}
+
+pgstart_default_port()
+{
+  pipeline=$(pgstart_number "${CI_PIPELINE_NUMBER:-0}")
+  workflow=$(pgstart_number "${CI_WORKFLOW_NUMBER:-${CI_STEP_NUMBER:-0}}")
+
+  # TCP is disabled below. This only chooses the socket filename inside
+  # the private PGHOST directory.
+  echo $((20000 + (pipeline % 1000) * 32 + (workflow % 32)))
+}
+
+pgstart_print_log()
+{
+  if test -s "${PGLOG}"; then
+    echo "PostgreSQL startup log (${PGLOG}) follows:" >&2
+    tail -n 200 "${PGLOG}" >&2
+  else
+    echo "PostgreSQL startup log (${PGLOG}) is empty or missing" >&2
+  fi
+}
+
+pgstart_stop()
+{
+  if test -n "${PGDATA:-}" && test -s "${PGDATA}/postmaster.pid"; then
+    runuser -u "${PGSTART_USER}" -- "${PGCTL}" -D "${PGDATA}" -m fast -w stop || true
+  fi
+  if test -n "${PGROOT:-}"; then
+    rm -rf "${PGROOT}"
+  fi
+}
+
+PGROOT=${PGROOT:-$(mktemp -d "${TMPDIR:-/tmp}/postgis-pg${PGVER}.XXXXXX")}
+PGDATA=${PGDATA:-${PGROOT}/data}
+PGHOST=${PGHOST:-${PGROOT}/socket}
+PGLOG=${PGLOG:-${PGROOT}/postgresql.log}
+PGPORT=${PGPORT:-$(pgstart_default_port)}
+PGUSER=${PGUSER:-postgres}
+
+export PGROOT PGDATA PGHOST PGLOG PGPORT PGUSER
+
+mkdir -p "${PGROOT}"
+chown "${PGSTART_USER}:${PGSTART_USER}" "${PGROOT}"
+runuser -u "${PGSTART_USER}" -- mkdir -p "${PGDATA}" "${PGHOST}"
+
+INITDB_OPTS=
+if "${INITDB}" --help 2>&1 | grep -q -- '--no-data-checksums'; then
+  INITDB_OPTS="--no-data-checksums"
+fi
+
+if test ! -s "${PGDATA}/PG_VERSION"; then
+  runuser -u "${PGSTART_USER}" -- "${INITDB}" -D "${PGDATA}" -A trust --no-sync ${INITDB_OPTS}
+fi
+
+trap pgstart_stop EXIT
+
+PGSTART_OPTS=${PGSTART_OPTS:-"-F -h '' -p ${PGPORT} -k ${PGHOST} -c fsync=off -c full_page_writes=off -c synchronous_commit=off"}
+
+if ! runuser -u "${PGSTART_USER}" -- "${PGCTL}" -D "${PGDATA}" -l "${PGLOG}" \
+  -o "${PGSTART_OPTS}" -t "${PGSTART_TIMEOUT}" start; then
+  pgstart_print_log
+  echo "ci/start-postgresql.sh: PostgreSQL ${PGVER} failed to start" >&2
+  exit 1
+fi
diff --git a/utils/check_cluster_upgrade.sh b/utils/check_cluster_upgrade.sh
index 972279d7d..88b8c4561 100755
--- a/utils/check_cluster_upgrade.sh
+++ b/utils/check_cluster_upgrade.sh
@@ -1,10 +1,17 @@
 #!/bin/sh
 
-TMPDIR=/tmp/pgis_upgrade_test-$$/
+TMPDIR=$(mktemp -d "${TMPDIR:-/tmp}/pgis_upgrade_test.XXXXXX") || exit 1
 DATADIR=${TMPDIR}/cluster
 LOGFILE=${TMPDIR}/log
 INIT_SCRIPT=
-export PGPORT=15432
+if test -z "${PGPORT:-}"; then
+  pipeline=${CI_PIPELINE_NUMBER:-0}
+  workflow=${CI_WORKFLOW_NUMBER:-30}
+  case "${pipeline}" in ''|*[!0-9]*) pipeline=0 ;; esac
+  case "${workflow}" in ''|*[!0-9]*) workflow=30 ;; esac
+  PGPORT=$((20000 + (pipeline % 1000) * 32 + (workflow % 32)))
+fi
+export PGPORT
 export PGHOST=${TMPDIR}
 export PGDATABASE=postgis_cluster_upgrade_test
 PG_CONFIG_OLD=

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

Summary of changes:
 .github/workflows/ci.yml       |   9 +++-
 .woodpecker/docs.yml           |  30 ++++++------
 .woodpecker/qa-expensive.yml   |  10 +---
 .woodpecker/qa.yml             |   8 +---
 .woodpecker/regress.yml        |  12 +----
 ci/start-postgresql.sh         | 101 +++++++++++++++++++++++++++++++++++++++++
 utils/check_cluster_upgrade.sh |  11 ++++-
 7 files changed, 137 insertions(+), 44 deletions(-)
 create mode 100755 ci/start-postgresql.sh


hooks/post-receive
-- 
PostGIS


More information about the postgis-tickets mailing list