Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
d02f15f
fix: keep the SQLSTATE of PostGIS provisioning failures
jeremi Nov 11, 2026
b740b0d
feat: add rstack dev stop --recover and one JSON error envelope
jeremi Nov 11, 2026
981c07c
feat: check rstack dev bindings with the product readers
jeremi Nov 11, 2026
87c07c2
fix(breg): decode encrypted field envelopes across PostgreSQL line br…
jeremi Nov 11, 2026
3b9ba41
feat: run rstack dev projects with encrypted fields on a per-run key
jeremi Nov 11, 2026
0a3e367
test(breg): read long encrypted envelopes back through every read pro…
jeremi Nov 11, 2026
58e4366
docs: add a how-to page for running a project with rstack dev
jeremi Nov 11, 2026
fd93194
fix: check Casework context bindings through caseworkctl, not a crate…
jeremi Nov 11, 2026
f2e175a
fix: name the rule a BReg review authority binding breaks
jeremi Nov 11, 2026
8a0b4b3
fix: class rstack dev timeouts as operational and malformed arguments…
jeremi Nov 11, 2026
db33379
fix: keep rstack dev key material and start times safe across interru…
jeremi Nov 11, 2026
43b9c94
docs: record rstack dev recovery, error envelope and run keys in the …
jeremi Nov 11, 2026
aec3363
fix: class an unavailable Casework inspection as operational and keep…
jeremi Nov 11, 2026
06e364a
fix: keep an interrupted Casework inspection as the operator's request
jeremi Nov 11, 2026
503136e
chore(deps): bump rustix to 1.1.6 for RUSTSEC-2026-0486
jeremi Nov 11, 2026
447bdbc
fix: register the rstack error report schema as out of configuration …
jeremi Nov 11, 2026
2bb110f
fix: guard rstack dev workloads and bind database recovery to startup
jeremi Nov 11, 2026
d185bc0
docs: clarify rstack dev installation, recovery and journey reports
jeremi Nov 11, 2026
39b118e
fix: keep guard cleanup errors visible during drop
jeremi Nov 11, 2026
5099a7e
test: allow reaped workload descendants to remain visible as zombies
jeremi Nov 11, 2026
6763481
ci: fall back to the Ubuntu archive when the Azure mirror cannot resolve
jeremi Nov 11, 2026
f016e87
ci: use the Ubuntu archive fallback for docs shell dependencies
jeremi Nov 11, 2026
0fee982
ci: select a reachable Ubuntu archive before installing packages
jeremi Nov 11, 2026
9dc0abd
ci: check every Noble package index when selecting a mirror
jeremi Nov 11, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 24 additions & 0 deletions .github/scripts/select-ubuntu-archive.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
#!/usr/bin/env bash
set -euo pipefail

has_noble_indexes() {
local archive="$1" suite
for suite in noble noble-updates noble-backports noble-security; do
curl --proto '=https' --fail --silent --show-error --head --max-time 10 \
"${archive}dists/$suite/InRelease" >/dev/null || return 1
done
}

for mirror in \
https://archive.ubuntu.com/ubuntu/ \
https://mirrors.edge.kernel.org/ubuntu/ \
https://mirror.math.princeton.edu/pub/ubuntu/; do
host="${mirror#https://}"
if timeout 5 getent ahosts "${host%%/*}" >/dev/null && has_noble_indexes "$mirror"; then
printf '%s\n' "$mirror"
exit 0
fi
done

printf '%s\n' 'No Ubuntu Noble archive mirror is reachable.' >&2
exit 1
12 changes: 12 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2702,6 +2702,11 @@ jobs:
shell: bash
run: |
set -euo pipefail
# Use the Ubuntu archive if the runner's Azure mirror cannot resolve.
if [[ -f /etc/apt/apt-mirrors.txt ]] && ! timeout 10 getent ahosts azure.archive.ubuntu.com >/dev/null; then
mirror="$(bash .github/scripts/select-ubuntu-archive.sh)"
printf '%s\n' "$mirror" | sudo tee /etc/apt/apt-mirrors.txt >/dev/null
fi
sudo /usr/share/postgresql-common/pgdg/apt.postgresql.org.sh -y
sudo env DEBIAN_FRONTEND=noninteractive apt-get install --yes --no-install-recommends postgresql-18 postgresql-18-postgis-3
/usr/lib/postgresql/18/bin/postgres --version
Expand Down Expand Up @@ -3071,7 +3076,14 @@ jobs:
cache-dependency-path: docs/site/package-lock.json

- name: Install docs shell dependency
shell: bash
run: |
set -euo pipefail
# Use the Ubuntu archive if the runner's Azure mirror cannot resolve.
if [[ -f /etc/apt/apt-mirrors.txt ]] && ! timeout 10 getent ahosts azure.archive.ubuntu.com >/dev/null; then
mirror="$(bash .github/scripts/select-ubuntu-archive.sh)"
printf '%s\n' "$mirror" | sudo tee /etc/apt/apt-mirrors.txt >/dev/null
fi
sudo apt-get update
sudo apt-get install --yes zsh

Expand Down
47 changes: 24 additions & 23 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

28 changes: 27 additions & 1 deletion crates/registry-breg/src/mutation.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3659,8 +3659,10 @@ pub(crate) fn envelope_member_from_projection(value: Value) -> Result<Value, Mut
return Ok(Value::Null);
}
let encoded = value.as_str().ok_or(MutationError::Unavailable)?;
// PostgreSQL's base64 encoding breaks its output every 76 characters;
// those line breaks carry no data.
let envelope = base64::engine::general_purpose::STANDARD
.decode(encoded)
.decode(encoded.replace('\n', ""))
.map_err(|_| MutationError::Unavailable)?;
Ok(envelope_member_json(&envelope))
}
Expand Down Expand Up @@ -4837,4 +4839,28 @@ mod tests {
)
.is_ok());
}

/// PostgreSQL's `encode(..., 'base64')` breaks its output every 76
/// characters, so a projected envelope longer than 57 bytes reaches row
/// decode on several lines.
#[test]
fn a_projected_envelope_decodes_across_postgresql_line_breaks() {
use base64::Engine as _;
let envelope = (0..=200).collect::<Vec<u8>>();
let encoded = base64::engine::general_purpose::STANDARD.encode(&envelope);
let wrapped = encoded
.as_bytes()
.chunks(76)
.map(|line| std::str::from_utf8(line).expect("base64 is ASCII"))
.collect::<Vec<_>>()
.join("\n");
assert_eq!(
envelope_member_from_projection(Value::String(wrapped)),
Ok(envelope_member_json(&envelope))
);
assert_eq!(
envelope_member_from_projection(Value::String(format!(" {encoded}"))),
Err(MutationError::Unavailable)
);
}
}
6 changes: 4 additions & 2 deletions crates/registry-breg/src/postgres/roles.rs
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,8 @@ pub async fn provision_postgis_prerequisites(
migration_role.quoted(),
runtime_role.quoted(),
))
.await?;
.await
.map_err(|error| PostgresKernelError::from_statement_error(&error))?;
let bbox_role = provision_spatial_bbox_role(admin, migration_role, runtime_role).await?;
Ok(bbox_role)
}
Expand Down Expand Up @@ -178,7 +179,8 @@ pub async fn provision_spatial_bbox_role(
migration_role.quoted(),
bbox_role.quoted(),
))
.await?;
.await
.map_err(|error| PostgresKernelError::from_statement_error(&error))?;
Ok(bbox_role)
}

Expand Down
Loading
Loading