Skip to content

Update rust inside python builder - #418

Closed
jvulgan wants to merge 1 commit into
mainfrom
update-rust-1.98.1
Closed

jvulgan wants to merge 1 commit into
mainfrom
update-rust-1.98.1

Conversation

@jvulgan

@jvulgan jvulgan commented Sep 11, 2026

Copy link
Copy Markdown
Contributor

Upgraded rust version to 1.98.1

Summary by Sourcery

Upgrade the Rust toolchain used by the Python builder to 1.98.1.

Enhancements:

  • Upgrade the Rust toolchain used by the Python builder to version 1.98.1.

Build:

  • Update the Rust release checksum used during the builder image build.

Upgraded rust version to 1.98.1
@sourcery-ai

sourcery-ai Bot commented Sep 11, 2026

Copy link
Copy Markdown
Reviewer's guide (collapsed on small PRs)

Reviewer's Guide

Updates the Python builder’s Rust bootstrap configuration to download and verify Rust 1.98.1 instead of 1.95.0, while preserving the existing download source and build-script flow.

File-Level Changes

Change Details Files
Upgrade the Rust toolchain downloaded by the Python builder.
  • Set the Rust version from 1.95.0 to 1.98.1.
  • Replace the pinned Rust distribution checksum with the hash for the new release.
builder/Containerfile

Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

@sourcery-ai sourcery-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey - I've reviewed your changes and they look great!

Sourcery assessment

Approved.


Sourcery is free for open source - if you like our reviews please consider sharing them ✨

@jvulgan

jvulgan commented Sep 14, 2026

Copy link
Copy Markdown
Contributor Author

closing, will be done in different PR along with updates to other libs we're building from source

@jvulgan jvulgan closed this Sep 14, 2026
smatula added a commit to smatula/plumbing that referenced this pull request Sep 14, 2026
build_rust fetched the installer from
https://static.rust-lang.org/rustup/dist/x86_64-unknown-linux-gnu/rustup-init,
a path with no version anywhere in it: it always serves the newest rustup.
RUST_HASH is the sha256 of that file, so it pinned the bytes of a moving target
and broke the moment the rustup project cut a release:

    + curl -fsSL --retry 10 -o rustup-init \
        https://static.rust-lang.org/rustup/dist/x86_64-unknown-linux-gnu/rustup-init
    rustup-init: FAILED
    sha256sum: WARNING: 1 computed checksum did NOT match

The pinned hash 4acc9acc is rustup 1.29.0 exactly; dist/ now serves 1.29.1
(dda72343). Nothing was tampered with -- the checksum did its job and refused a
file that had legitimately changed underneath a version-less URL.

Fetch from the immutable .../rustup/archive/1.29.1/ path instead, so RUST_HASH
pins something that cannot move, and record in a comment that RUST_HASH covers
the installer and not the toolchain. That distinction is easy to miss:
RUST_VERSION is passed to --default-toolchain and selects the compiler, while
the rustup version only decides which installer runs.

Every other fetch_source in builder/build_scripts/ interpolates a *_ROOT
variable that carries the version in the filename, so rustup-init was the only
download exposed to this.

Also bump RUST_VERSION 1.95.0 -> 1.98.1, carried over from calungaproject#418, which was
closed so it could be folded in here.

Verified with podman build --target build_rust: exit 0, "rustup-init: OK", and
"rustc 1.98.1 (48a229cea 2026-09-01)" installed in the resulting stage.

Assisted-by: Claude Opus 5 <noreply@anthropic.com>
smatula added a commit to smatula/plumbing that referenced this pull request Sep 14, 2026
Every plumbing-builder PR pipeline has failed since 2026-09-01, in two
different places. Both are URL bugs in builder/Containerfile, and both fail the
same way: a URL that does not address a fixed artifact.

1. GNU autoconf/automake/libtool (install-autoconf.sh, step 5 of 29)

    curl -fsSL --retry 10 -o autoconf-2.72.tar.gz \
        https://ftpmirror.gnu.org/gnu/autoconf/autoconf-2.72.tar.gz
    curl: (22) The requested URL returned error: 404

ftpmirror.gnu.org's root already is the GNU archive root -- it appends the
request path to each mirror's GNU directory -- so the extra /gnu/ produced a
doubled path segment:

    .../mirrors/gnu//gnu/autoconf/autoconf-2.72.tar.gz -> 404
    .../mirrors/gnu/autoconf/autoconf-2.72.tar.gz      -> 200

Only ftp.gnu.org takes the /gnu/ prefix, because there the archive sits in a
/gnu/ subdirectory; the Containerfile was using ftp.gnu.org's layout against
the redirector. The URLs were inherited verbatim from pypa/manylinux
(docker/Dockerfile:65,72,79), which carries the same mistake.

Drop the redundant segment. Probed 18 times afterwards, six per tool:
18/18 HTTP 200. --retry never helped here, since curl's transient-error set
excludes 404 entirely.

2. rustup-init (build-rust.sh, step 12 of 29)

    rustup-init: FAILED
    sha256sum: WARNING: 1 computed checksum did NOT match

RUST_DOWNLOAD_URL pointed at https://static.rust-lang.org/rustup/dist, and the
fetched filename is a bare "rustup-init" -- no version anywhere in the path.
That endpoint always serves the newest rustup, so RUST_HASH pinned the bytes of
a moving target and broke as soon as rustup cut a release. The pinned hash
4acc9acc is rustup 1.29.0 exactly; dist/ now serves 1.29.1 (dda72343). Nothing
was tampered with: the checksum correctly refused a file that had legitimately
changed.

Fetch from the immutable .../rustup/archive/1.29.1/ path so RUST_HASH pins
something that cannot move, and record in a comment that RUST_HASH covers the
installer rather than the toolchain. That distinction is easy to miss:
RUST_VERSION is passed to --default-toolchain and selects the compiler, while
the rustup version only decides which installer runs. Cargo is not pinned
separately; it ships with the toolchain and follows RUST_VERSION.

Also bump RUST_VERSION 1.95.0 -> 1.98.1, carried over from calungaproject#418, which was
closed so it could be folded in here.

Every other fetch_source in builder/build_scripts/ interpolates a *_ROOT
variable that carries the version in the filename, so these were the only two
downloads exposed. Both tarball sets remain checksum-verified by
check_sha256sum after download.

The CI workflow comment in .github/workflows/test.yml attributed --skip-build
to download flakiness; that reason was this bug. Drop it. The remaining reasons
for pulling the published image -- Konflux builds the real one, and denylist
coverage is the job above -- stand on their own.

Verified in two parts. The rustup change and all 29 build stages ran clean on
the Konflux PR build -- zero curl errors across 18k log lines, and
"rustc 1.98.1 (48a229cea 2026-09-01)" installed. The corrected GNU URLs were
verified with podman build --no-cache --target runtime_base: all three tarballs
fetched from ftpmirror.gnu.org and checksummed OK, giving autoconf 2.72,
automake 1.18.1 and libtool 2.5.4 in the image.

Assisted-by: Claude Opus 5 <noreply@anthropic.com>
smatula added a commit to smatula/plumbing that referenced this pull request Sep 14, 2026
Every plumbing-builder PR pipeline has failed since 2026-09-01, in two
different places. Both are URL bugs in builder/Containerfile, and both fail the
same way: a URL that does not address a fixed artifact.

1. GNU autoconf/automake/libtool (install-autoconf.sh, step 5 of 29)

    curl -fsSL --retry 10 -o autoconf-2.72.tar.gz \
        https://ftpmirror.gnu.org/gnu/autoconf/autoconf-2.72.tar.gz
    curl: (22) The requested URL returned error: 404

ftpmirror.gnu.org's root already is the GNU archive root -- it appends the
request path to each mirror's GNU directory -- so the extra /gnu/ produced a
doubled path segment:

    .../mirrors/gnu//gnu/autoconf/autoconf-2.72.tar.gz -> 404
    .../mirrors/gnu/autoconf/autoconf-2.72.tar.gz      -> 200

Only ftp.gnu.org takes the /gnu/ prefix, because there the archive sits in a
/gnu/ subdirectory; the Containerfile was using ftp.gnu.org's layout against
the redirector. The URLs were inherited verbatim from pypa/manylinux
(docker/Dockerfile:65,72,79), which carries the same mistake.

Drop the redundant segment. Probed 18 times afterwards, six per tool:
18/18 HTTP 200. --retry never helped here, since curl's transient-error set
excludes 404 entirely.

2. rustup-init (build-rust.sh, step 12 of 29)

    rustup-init: FAILED
    sha256sum: WARNING: 1 computed checksum did NOT match

RUST_DOWNLOAD_URL pointed at https://static.rust-lang.org/rustup/dist, and the
fetched filename is a bare "rustup-init" -- no version anywhere in the path.
That endpoint always serves the newest rustup, so RUST_HASH pinned the bytes of
a moving target and broke as soon as rustup cut a release. The pinned hash
4acc9acc is rustup 1.29.0 exactly; dist/ now serves 1.29.1 (dda72343). Nothing
was tampered with: the checksum correctly refused a file that had legitimately
changed.

Fetch from the immutable .../rustup/archive/${RUSTUP_VERSION}/ path so
RUST_HASH pins something that cannot move, with the rustup version held in its
own variable alongside RUST_VERSION rather than buried in the URL, and record
in a comment that RUST_HASH covers the installer rather than the toolchain. That distinction is easy to miss:
RUST_VERSION is passed to --default-toolchain and selects the compiler, while
the rustup version only decides which installer runs. Cargo is not pinned
separately; it ships with the toolchain and follows RUST_VERSION.

Also bump RUST_VERSION 1.95.0 -> 1.98.1, carried over from calungaproject#418, which was
closed so it could be folded in here.

Every other fetch_source in builder/build_scripts/ interpolates a *_ROOT
variable that carries the version in the filename, so these were the only two
downloads exposed. Both tarball sets remain checksum-verified by
check_sha256sum after download.

The CI workflow comment in .github/workflows/test.yml attributed --skip-build
to download flakiness; that reason was this bug. Drop it. The remaining reasons
for pulling the published image -- Konflux builds the real one, and denylist
coverage is the job above -- stand on their own.

Verified in two parts. The rustup change and all 29 build stages ran clean on
the Konflux PR build -- zero curl errors across 18k log lines, and
"rustc 1.98.1 (48a229cea 2026-09-01)" installed. The corrected GNU URLs were
verified with podman build --no-cache --target runtime_base: all three tarballs
fetched from ftpmirror.gnu.org and checksummed OK, giving autoconf 2.72,
automake 1.18.1 and libtool 2.5.4 in the image.

Assisted-by: Claude Opus 5 <noreply@anthropic.com>
smatula added a commit to smatula/plumbing that referenced this pull request Sep 14, 2026
Every plumbing-builder PR pipeline has failed since 2026-09-01, in two
different places. Both are URL bugs in builder/Containerfile, and both fail the
same way: a URL that does not address a fixed artifact.

1. GNU autoconf/automake/libtool (install-autoconf.sh, step 5 of 29)

    curl -fsSL --retry 10 -o autoconf-2.72.tar.gz \
        https://ftpmirror.gnu.org/gnu/autoconf/autoconf-2.72.tar.gz
    curl: (22) The requested URL returned error: 404

ftpmirror.gnu.org's root already is the GNU archive root -- it appends the
request path to each mirror's GNU directory -- so the extra /gnu/ produced a
doubled path segment:

    .../mirrors/gnu//gnu/autoconf/autoconf-2.72.tar.gz -> 404
    .../mirrors/gnu/autoconf/autoconf-2.72.tar.gz      -> 200

Only ftp.gnu.org takes the /gnu/ prefix, because there the archive sits in a
/gnu/ subdirectory; the Containerfile was using ftp.gnu.org's layout against
the redirector. The URLs were inherited verbatim from pypa/manylinux
(docker/Dockerfile:65,72,79), which carries the same mistake.

Drop the redundant segment. Probed 18 times afterwards, six per tool:
18/18 HTTP 200. --retry never helped here, since curl's transient-error set
excludes 404 entirely.

2. rustup-init (build-rust.sh, step 12 of 29)

    rustup-init: FAILED
    sha256sum: WARNING: 1 computed checksum did NOT match

RUST_DOWNLOAD_URL pointed at https://static.rust-lang.org/rustup/dist, and the
fetched filename is a bare "rustup-init" -- no version anywhere in the path.
That endpoint always serves the newest rustup, so RUST_HASH pinned the bytes of
a moving target and broke as soon as rustup cut a release. The pinned hash
4acc9acc is rustup 1.29.0 exactly; dist/ now serves 1.29.1 (dda72343). Nothing
was tampered with: the checksum correctly refused a file that had legitimately
changed.

Fetch from the immutable .../rustup/archive/${RUSTUP_VERSION}/ path so
RUST_HASH pins something that cannot move, with the rustup version held in its
own variable alongside RUST_VERSION rather than buried in the URL, and record
in a comment that RUST_HASH covers the installer rather than the toolchain.
That distinction is easy to miss: RUST_VERSION is passed to --default-toolchain
and selects the compiler, while the rustup version only decides which installer
runs. Cargo is not pinned separately; it ships with the toolchain and follows
RUST_VERSION.

Also bump RUST_VERSION 1.95.0 -> 1.98.1, carried over from calungaproject#418, which was
closed so it could be folded in here.

Every other fetch_source in builder/build_scripts/ interpolates a *_ROOT
variable that carries the version in the filename, so these were the only two
downloads exposed. Both tarball sets remain checksum-verified by
check_sha256sum after download.

The CI workflow comment in .github/workflows/test.yml attributed --skip-build
to download flakiness. Drop it -- the remaining reasons for pulling the
published image, that Konflux builds the real one and denylist coverage is the
job above, stand on their own.

Verified in two parts. The rustup change and all 29 build stages ran clean on
the Konflux PR build -- zero curl errors across 18k log lines, and
"rustc 1.98.1 (48a229cea 2026-09-01)" installed. The corrected GNU URLs were
verified with podman build --no-cache --target runtime_base: all three tarballs
fetched from ftpmirror.gnu.org and checksummed OK, giving autoconf 2.72,
automake 1.18.1 and libtool 2.5.4 in the image.

Assisted-by: Claude Opus 5 <noreply@anthropic.com>
smatula added a commit to smatula/plumbing that referenced this pull request Sep 14, 2026
Every plumbing-builder PR pipeline has failed since 2026-09-01, in two
different places. Only the second one is ours to fix.

The first, GNU autoconf/automake/libtool at step 5 of 29, was a fault in
ftpmirror.gnu.org itself and has resolved on its own:

    curl -fsSL --retry 10 -o autoconf-2.72.tar.gz \
        https://ftpmirror.gnu.org/gnu/autoconf/autoconf-2.72.tar.gz
    curl: (22) The requested URL returned error: 404

The redirector had started appending the request path to each mirror's GNU
directory rather than to its parent, producing a doubled segment
(.../mirrors/gnu//gnu/autoconf/autoconf-2.72.tar.gz). Our URLs were correct
throughout; --retry could not help, since curl's transient-error set excludes
404 and the mirror choice is a pure function of the request path, so every
attempt landed on the same broken mirror.

We were not alone: chimera-linux/cports#6169, fedora-infra/anitya#2073 (which
quotes the identical doubled path on the identical mirror we were assigned),
LibreELEC/LibreELEC.tv#11754 and #11759, and easybuilders/easybuild-framework
#5283 all report it over the same window. GNU published no announcement, but
the last third-party 404 is timestamped 2026-09-14T13:13Z and the path serves
correctly again now -- reconfirmed over six probes across all three tools,
6/6 HTTP 206 on /gnu/<tool>/ and 6/6 404 on the bare form. So the
Containerfile's GNU URLs are left exactly as they are; the mirrors are the
availability risk here, not the paths, and every tarball is
check_sha256sum-verified after download regardless.

That leaves the real bug, rustup-init (build-rust.sh, step 12 of 29):

    rustup-init: FAILED
    sha256sum: WARNING: 1 computed checksum did NOT match

RUST_DOWNLOAD_URL pointed at https://static.rust-lang.org/rustup/dist, and the
fetched filename is a bare "rustup-init" -- no version anywhere in the path.
That endpoint always serves the newest rustup, so RUST_HASH pinned the bytes of
a moving target and broke as soon as rustup cut a release. The pinned hash
4acc9acc is rustup 1.29.0 exactly; dist/ now serves 1.29.1 (dda72343). Nothing
was tampered with: the checksum correctly refused a file that had legitimately
changed.

Fetch from the immutable .../rustup/archive/${RUSTUP_VERSION}/ path so
RUST_HASH pins something that cannot move, with the rustup version held in its
own variable alongside RUST_VERSION rather than buried in the URL, and record
in a comment that RUST_HASH covers the installer rather than the toolchain.
That distinction is easy to miss: RUST_VERSION is passed to --default-toolchain
and selects the compiler, while the rustup version only decides which installer
runs. Cargo is not pinned separately; it ships with the toolchain and follows
RUST_VERSION.

Also bump RUST_VERSION 1.95.0 -> 1.98.1, carried over from calungaproject#418, which was
closed so it could be folded in here.

Every other fetch_source in builder/build_scripts/ interpolates a *_ROOT
variable that carries the version in the filename, so rustup-init was the only
download exposed to this class of failure.

Verified on the Konflux PR build: all 29 stages ran clean, zero curl errors
across 18k log lines, and "rustc 1.98.1 (48a229cea 2026-09-01)" installed.

Assisted-by: Claude Opus 5 <noreply@anthropic.com>
smatula added a commit to smatula/plumbing that referenced this pull request Sep 15, 2026
The variable holds the sha256 of rustup-init, the installer, but sat next to
RUST_VERSION and read as though it belonged to it. That misreading is not
hypothetical: calungaproject#418 bumped RUST_VERSION and replaced this hash together,
described as "update the Rust release checksum", when the new value was in
fact the rustup 1.29.1 installer. It went green for the wrong reason.

RUSTUP_HASH pairs the hash with RUSTUP_VERSION, which is what actually
determines it. check_var already fails the build loudly if the variable is
unset, so a missed rename cannot pass silently.

Five call sites: the export and comment in builder/Containerfile, check_var
and check_sha256sum in build-rust.sh, and the reference in VERSION_UPDATES.md.
That document is stale on the version it quotes (1.94.0, against 1.95.0 on
main) but that drift is not this commit's to fix.

The comment above the RUN shrinks from five lines to two. Most of it existed
to explain that the hash was not the toolchain's, which the name now says.
What remains is the part no name can carry: why the rustup version is pinned
in the URL at all.

Assisted-by: Claude Opus 5 <noreply@anthropic.com>
smatula added a commit to smatula/plumbing that referenced this pull request Sep 15, 2026
Both describe rustup-init, the installer, but sat beside RUST_VERSION and read
as though they belonged to it. That misreading is not hypothetical: calungaproject#418 bumped
RUST_VERSION and replaced the hash together, described as "update the Rust
release checksum", when the new value was in fact the rustup 1.29.1 installer's.
It went green for the wrong reason.

RUSTUP_HASH and RUSTUP_DOWNLOAD_URL pair both with RUSTUP_VERSION, which is what
actually determines them -- the URL now points at rustup/archive/${RUSTUP_VERSION}
and has nothing to do with the Rust release. RUST_VERSION keeps its name; it
still selects the toolchain, via --default-toolchain.

check_var already fails the build loudly on an unset variable, so a missed site
cannot pass silently. Eight in total: two exports and a comment in
builder/Containerfile, two check_var calls plus check_sha256sum and fetch_source
in build-rust.sh, and a reference in VERSION_UPDATES.md. That document is stale
on the version it quotes (1.94.0, against 1.95.0 on main) but that drift is not
this commit's to fix.

Neither name collides. RUSTUP_* is rustup's own environment namespace
(RUSTUP_HOME, RUSTUP_DIST_SERVER, ...) and these are exported in the shell
rustup-init runs in, but it reads neither of these names.

The comment above the RUN shrinks from five lines to two. Most of it existed to
explain that the hash was not the toolchain's, which the names now say. What
remains is the part no name can carry: why the rustup version is pinned in the
URL at all.

Assisted-by: Claude Opus 5 <noreply@anthropic.com>
smatula added a commit that referenced this pull request Sep 15, 2026
Every plumbing-builder PR pipeline has failed since 2026-09-01, in two
different places. Only the second one is ours to fix.

The first, GNU autoconf/automake/libtool at step 5 of 29, was a fault in
ftpmirror.gnu.org itself and has resolved on its own:

    curl -fsSL --retry 10 -o autoconf-2.72.tar.gz \
        https://ftpmirror.gnu.org/gnu/autoconf/autoconf-2.72.tar.gz
    curl: (22) The requested URL returned error: 404

The redirector had started appending the request path to each mirror's GNU
directory rather than to its parent, producing a doubled segment
(.../mirrors/gnu//gnu/autoconf/autoconf-2.72.tar.gz). Our URLs were correct
throughout; --retry could not help, since curl's transient-error set excludes
404 and the mirror choice is a pure function of the request path, so every
attempt landed on the same broken mirror.

We were not alone: chimera-linux/cports#6169, fedora-infra/anitya#2073 (which
quotes the identical doubled path on the identical mirror we were assigned),
LibreELEC/LibreELEC.tv#11754 and #11759, and easybuilders/easybuild-framework
#5283 all report it over the same window. GNU published no announcement, but
the last third-party 404 is timestamped 2026-09-14T13:13Z and the path serves
correctly again now -- reconfirmed over six probes across all three tools,
6/6 HTTP 206 on /gnu/<tool>/ and 6/6 404 on the bare form. So the
Containerfile's GNU URLs are left exactly as they are; the mirrors are the
availability risk here, not the paths, and every tarball is
check_sha256sum-verified after download regardless.

That leaves the real bug, rustup-init (build-rust.sh, step 12 of 29):

    rustup-init: FAILED
    sha256sum: WARNING: 1 computed checksum did NOT match

RUST_DOWNLOAD_URL pointed at https://static.rust-lang.org/rustup/dist, and the
fetched filename is a bare "rustup-init" -- no version anywhere in the path.
That endpoint always serves the newest rustup, so RUST_HASH pinned the bytes of
a moving target and broke as soon as rustup cut a release. The pinned hash
4acc9acc is rustup 1.29.0 exactly; dist/ now serves 1.29.1 (dda72343). Nothing
was tampered with: the checksum correctly refused a file that had legitimately
changed.

Fetch from the immutable .../rustup/archive/${RUSTUP_VERSION}/ path so
RUST_HASH pins something that cannot move, with the rustup version held in its
own variable alongside RUST_VERSION rather than buried in the URL, and record
in a comment that RUST_HASH covers the installer rather than the toolchain.
That distinction is easy to miss: RUST_VERSION is passed to --default-toolchain
and selects the compiler, while the rustup version only decides which installer
runs. Cargo is not pinned separately; it ships with the toolchain and follows
RUST_VERSION.

Also bump RUST_VERSION 1.95.0 -> 1.98.1, carried over from #418, which was
closed so it could be folded in here.

Every other fetch_source in builder/build_scripts/ interpolates a *_ROOT
variable that carries the version in the filename, so rustup-init was the only
download exposed to this class of failure.

Verified on the Konflux PR build: all 29 stages ran clean, zero curl errors
across 18k log lines, and "rustc 1.98.1 (48a229cea 2026-09-01)" installed.

Assisted-by: Claude Opus 5 <noreply@anthropic.com>
smatula added a commit that referenced this pull request Sep 15, 2026
Both describe rustup-init, the installer, but sat beside RUST_VERSION and read
as though they belonged to it. That misreading is not hypothetical: #418 bumped
RUST_VERSION and replaced the hash together, described as "update the Rust
release checksum", when the new value was in fact the rustup 1.29.1 installer's.
It went green for the wrong reason.

RUSTUP_HASH and RUSTUP_DOWNLOAD_URL pair both with RUSTUP_VERSION, which is what
actually determines them -- the URL now points at rustup/archive/${RUSTUP_VERSION}
and has nothing to do with the Rust release. RUST_VERSION keeps its name; it
still selects the toolchain, via --default-toolchain.

check_var already fails the build loudly on an unset variable, so a missed site
cannot pass silently. Eight in total: two exports and a comment in
builder/Containerfile, two check_var calls plus check_sha256sum and fetch_source
in build-rust.sh, and a reference in VERSION_UPDATES.md. That document is stale
on the version it quotes (1.94.0, against 1.95.0 on main) but that drift is not
this commit's to fix.

Neither name collides. RUSTUP_* is rustup's own environment namespace
(RUSTUP_HOME, RUSTUP_DIST_SERVER, ...) and these are exported in the shell
rustup-init runs in, but it reads neither of these names.

The comment above the RUN shrinks from five lines to two. Most of it existed to
explain that the hash was not the toolchain's, which the names now say. What
remains is the part no name can carry: why the rustup version is pinned in the
URL at all.

Assisted-by: Claude Opus 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant