Commit Graph

27367 Commits

Author SHA1 Message Date
Jamie Tanna b3facccd6e refactor(manager/dockerfile): share the RUN command parsing
As part of future changes, we want to extract system package managers'
packages in `Dockerfile`s more generally.

Instead of an `apk`-specific file, we can introduce a shared file for
extracting commands from `RUN`s.

From here, it can then be used by `apk` and follow-up tools by providing
the `names` to look for.

Co-Authored-By: Claude Opus 5 <jamie.tanna+claude-code@mend.io>
2026-09-18 08:25:35 +01:00
Jamie Tanna d5faaa85ec docs(datasource/apk): add more in-depth information about using with a Wolfi Dockerfile (#45702)
Now we have support for extracting `apk add`s in the Dockerfile manager,
we should also add a more in-depth indication of how to use this with
Wolfi or Chainguard Images.

Co-authored-by: Claude Opus 5 <jamie.tanna+claude-code@mend.io>
44.98.0
2026-09-18 07:06:56 +00:00
Jamie Tanna 426bf15b26 feat(manager/dockerfile): update APK packages pinned with a fuzzy constraint (#45693)
In the Wolfi undistribution, which Chainguard Images are built upon,
it is common to use a fuzzy constraint rather than exact versions[0]:

    RUN apk update && apk add --no-cache libcurl-openssl4=~8.12.1
          curl=~8.12.1 make

which we previously skipped as `unsupported-version` when we started
extracting `apk add` packages.

As the `apk` version resolves these, we should extract the constraint as
the `currentValue`, and let the lookup evaluate it.

A constraint of `~8.12.1` matches every `8.12.1-rN` version, so we don't
need to update these constraints.

However, when the `newVersion` is i.e. `8.13.0-r0`, the constraint is
rewritten to `curl=~8.13.0`.

If using an exact pin, the version is upgraded with the same precision
i.e. `curl=8.12.1` -> `curl=8.13.0`.

We still skip constraints we can't handle with i.e. `contains-variable`
or `unsupported-version`.

[0]: https://github.com/elastic/crawler/blob/bc15328fb808affd00dff0cd92527bbe402f5ded/Dockerfile.wolfi#L7

Co-authored-by: Claude Opus 5 <jamie.tanna+claude-code@mend.io>
2026-09-18 07:06:55 +00:00
renovate[bot] 5b7886e3da build(deps): update dependency markdown-it to v15.0.2 (main) (#46315)
build(deps): update dependency markdown-it to v15.0.2

| datasource | package     | from   | to     |
| ---------- | ----------- | ------ | ------ |
| npm        | markdown-it | 15.0.1 | 15.0.2 |

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
44.97.6
2026-09-18 05:26:02 +00:00
renovate[bot] 0d8fa4169e fix(deps): update ghcr.io/renovatebot/base-image docker tag to v13.99.3 (main) (#46314)
fix(deps): update ghcr.io/renovatebot/base-image docker tag to v13.99.3

| datasource | package                        | from    | to      |
| ---------- | ------------------------------ | ------- | ------- |
| docker     | ghcr.io/renovatebot/base-image | 13.99.1 | 13.99.3 |

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
44.97.5
2026-09-18 03:23:25 +00:00
renovate[bot] b74f51096b chore(deps): update dependency astral-sh/uv to v0.12.16 (main) (#46312)
chore(deps): update dependency astral-sh/uv to v0.12.16

| datasource      | package      | from    | to      |
| --------------- | ------------ | ------- | ------- |
| github-releases | astral-sh/uv | 0.12.15 | 0.12.16 |

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-09-18 02:29:42 +00:00
renovate[bot] e2da51d329 chore(deps): update dependency uv to v0.12.16 (main) (#46313)
chore(deps): update dependency uv to v0.12.16

| datasource      | package      | from    | to      |
| --------------- | ------------ | ------- | ------- |
| github-releases | astral-sh/uv | 0.12.15 | 0.12.16 |

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-09-18 02:27:15 +00:00
renovate[bot] 5f4d4bfb99 build(deps): update dependency @renovatebot/detect-tools to v4.0.17 (main) (#46310)
build(deps): update dependency @renovatebot/detect-tools to v4.0.17

| datasource | package                   | from   | to     |
| ---------- | ------------------------- | ------ | ------ |
| npm        | @renovatebot/detect-tools | 4.0.16 | 4.0.17 |

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
44.97.4
2026-09-17 22:40:27 +00:00
renovate[bot] fb9aa21a45 build(deps): update dependency zod to v4.6.2 (main) (#46309)
build(deps): update dependency zod to v4.6.2

| datasource | package | from  | to    |
| ---------- | ------- | ----- | ----- |
| npm        | zod     | 4.6.1 | 4.6.2 |

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
44.97.3
2026-09-17 22:24:15 +00:00
Jamie Tanna cc6f4145dd docs: update call-to-action banner (#46303)
With help from Claude to correctly render it as an SVG (that can have
URLs that are clickable) and render it so it's more responsive.

Co-authored-by: Claude Sonnet 5 <jamie.tanna+claude-code@mend.io>
2026-09-17 20:25:08 +00:00
renovate[bot] e01a96562f chore(deps): update dependency memfs to v4.74.0 (main) (#46307)
chore(deps): update dependency memfs to v4.74.0

| datasource | package | from   | to     |
| ---------- | ------- | ------ | ------ |
| npm        | memfs   | 4.73.0 | 4.74.0 |

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-09-17 19:28:08 +00:00
renovate[bot] d54267f7e8 build(deps): update dependency @renovatebot/pgp to v2.0.1 (main) (#46304)
build(deps): update dependency @renovatebot/pgp to v2.0.1

| datasource | package          | from  | to    |
| ---------- | ---------------- | ----- | ----- |
| npm        | @renovatebot/pgp | 2.0.0 | 2.0.1 |

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
44.97.2
2026-09-17 16:17:26 +00:00
renovate[bot] de452f52bc build(deps): update dependency cronstrue to v3.26.0 (main) (#46301)
build(deps): update dependency cronstrue to v3.26.0

| datasource | package   | from   | to     |
| ---------- | --------- | ------ | ------ |
| npm        | cronstrue | 3.25.0 | 3.26.0 |

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-09-17 14:38:45 +00:00
renovate[bot] e19db4efe8 build(deps): update dependency @renovatebot/pgp to v2 (main) (#46298)
build(deps): update dependency @renovatebot/pgp to v2

| datasource | package          | from  | to    |
| ---------- | ---------------- | ----- | ----- |
| npm        | @renovatebot/pgp | 1.4.3 | 2.0.0 |

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
44.97.1
2026-09-17 14:27:36 +00:00
ELENASEMANOVA f3a314f51a fix(datasource/docker): fetch all pages for Red Hat registries (#46294)
[CWFHEALTH-5169] Extend list of registries

Extend a list of registries that require all pages to be read.

Assisted-by: Cursor
44.97.0
2026-09-17 13:52:16 +00:00
Tyler Gillson 2e1a079c7f feat(manager/helm-values): support version in sibling tag/version key (#46267)
Some charts define the image reference and its version as sibling keys
of the same object, with the parent key unrelated to the image name:

    cli:
      image: ghcr.io/fluxcd/flux-cli
      tag: v2.7.2

The walker previously extracted the `image` string via
matchesHelmValuesInlineImage but, without an embedded version, produced
a version-less dependency that could never be updated; the sibling
`tag`/`version` key was invisible because
matchesHelmValuesDockerHeuristic requires the keys to live inside an
object whose parent key ends in `image`.

When an inline reference carries no version and no digest, adopt a
sibling `tag` (preferred) or `version` string as the version, reusing
the same update mechanics as the repository/tag object form
(replaceString = version, docker versioning, `{{newValue}}` template).
Inline references with an embedded version or digest keep current
behavior, and repository/tag objects never reach the inline branch.

Discussion #46265 documents the layout with a real-world example.

Signed-off-by: Tyler Gillson <tyler.gillson@gmail.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-09-17 13:48:24 +00:00
renovate[bot] 53e93ca96b chore(deps): update dependency memfs to v4.73.0 (main) (#46297)
chore(deps): update dependency memfs to v4.73.0

| datasource | package | from   | to     |
| ---------- | ------- | ------ | ------ |
| npm        | memfs   | 4.72.2 | 4.73.0 |

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
44.96.4
2026-09-17 13:12:35 +00:00
renovate[bot] b34b2cb7f9 chore(deps): update dependency vite to v8.3.0 (main) (#46296)
chore(deps): update dependency vite to v8.3.0

| datasource | package | from  | to    |
| ---------- | ------- | ----- | ----- |
| npm        | vite    | 8.2.2 | 8.3.0 |

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-09-17 12:56:13 +00:00
renovate[bot] be8ddade54 fix(deps): update ghcr.io/renovatebot/base-image docker tag to v13.99.1 (main) (#46295)
fix(deps): update ghcr.io/renovatebot/base-image docker tag to v13.99.1

| datasource | package                        | from    | to      |
| ---------- | ------------------------------ | ------- | ------- |
| docker     | ghcr.io/renovatebot/base-image | 13.99.0 | 13.99.1 |

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-09-17 12:55:18 +00:00
Sergei Zharinov 30f0fe84d5 fix(datasource/jsr): set cacheable explicitly
Closes #46005
44.96.3
2026-09-17 13:49:20 +01:00
Sergei Zharinov bb378c3518 fix(datasource/rust-version): set cacheable explicitly
Closes #46016
2026-09-17 13:49:20 +01:00
Sergei Zharinov 3848bd95d1 fix(datasource/dotnet-version): set cacheable explicitly
Closes #45981
2026-09-17 13:49:20 +01:00
Sergei Zharinov 8fcbe1f7ca fix(datasource/galaxy): set cacheable explicitly
Closes #45986
2026-09-17 13:49:20 +01:00
Sergei Zharinov adc1b0c2fa fix(datasource/buildpacks-registry): set cacheable explicitly
Closes #45974
2026-09-17 13:49:20 +01:00
renovate[bot] f585e1e2b4 chore(deps): update dependency lint-staged to v17.5.1 (main) (#46292)
chore(deps): update dependency lint-staged to v17.5.1

| datasource | package     | from   | to     |
| ---------- | ----------- | ------ | ------ |
| npm        | lint-staged | 17.5.0 | 17.5.1 |

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-09-17 11:41:03 +00:00
renovate[bot] ec41298b10 chore(deps): update dependency @biomejs/biome to v2.5.13 (main) (#46291)
chore(deps): update dependency @biomejs/biome to v2.5.13

| datasource | package        | from   | to     |
| ---------- | -------------- | ------ | ------ |
| npm        | @biomejs/biome | 2.5.12 | 2.5.13 |

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-09-17 11:40:41 +00:00
renovate[bot] ff9ec78004 chore(deps): update dependency memfs to v4.72.2 (main) (#46290)
chore(deps): update dependency memfs to v4.72.2

| datasource | package | from   | to     |
| ---------- | ------- | ------ | ------ |
| npm        | memfs   | 4.72.1 | 4.72.2 |

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
44.96.2
2026-09-17 10:32:17 +00:00
renovate[bot] 3c173d32cd build(deps): update dependency @renovatebot/pgp to v1.4.3 (main) (#46289)
build(deps): update dependency @renovatebot/pgp to v1.4.3

| datasource | package          | from  | to    |
| ---------- | ---------------- | ----- | ----- |
| npm        | @renovatebot/pgp | 1.4.2 | 1.4.3 |

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-09-17 10:31:29 +00:00
renovate[bot] 232835d982 build(deps): update dependency @renovatebot/pgp to v1.4.2 (main) (#46285)
build(deps): update dependency @renovatebot/pgp to v1.4.2

| datasource | package          | from  | to    |
| ---------- | ---------------- | ----- | ----- |
| npm        | @renovatebot/pgp | 1.4.1 | 1.4.2 |

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
44.96.1
2026-09-17 08:17:47 +00:00
Jamie Tanna 9b87f8de2f feat(manager/dockerfile): extract apk add packages from RUN instructions (#45691)
* feat(manager/dockerfile): extract `apk add` packages from `RUN` instructions

As noted in #43711, users pin APK packages in their Dockerfiles and want
Renovate to update them, which so far has needed a custom manager[0].

Now that we have the `apk` datasource, we can extract these ourselves,
and parse the `RUN` instruction more effectively than a regex can.

We can do this by:

- extracting `apk add` dependencies when processing a `Dockerfile`
- ignoring common flags to `apk` before we extract the dependency names,
  which wasn't straightforward with a Custom Manager
- ignoring i.e. `--virtual .build-deps`
- handle example cases from [0] and other usages i.e. with a comment in
  between lines
- ensure that `final` doesn't run against the final `apk` install
- removing the docs for how to do this with a Custom Manager, as that
  complexity is no longer needed
- skipping `unspecified-version` and `contains-variable`

We inform the user that they will need to override the `registryUrls`,
as we already have a default on the `apk` datasource and can't override
it in a straightforward means.

[0]: https://www.jvt.me/posts/2025/03/24/renovate-regex-dockerfile-apk/

Co-authored-by: Claude Opus 5 <jamie.tanna+claude-code@mend.io>

* fixup! feat(manager/dockerfile): extract `apk add` packages from `RUN` instructions

Co-Authored-By: Claude Sonnet 5 <jamie.tanna+claude-code@mend.io>

* fixup! feat(manager/dockerfile): extract `apk add` packages from `RUN` instructions

Co-Authored-By: Claude Opus 5 <jamie.tanna+claude-code@mend.io>

* fixup! feat(manager/dockerfile): extract `apk add` packages from `RUN` instructions

Find the command by name wherever it sits in the tokens, rather than
skipping an allowlist of shell keywords and variable assignments, so that
a wrapper program like `sudo`, `chroot /mnt` or `timeout 30` is handled
too.

Co-Authored-By: Claude Sonnet 5 <jamie.tanna+claude-code@mend.io>

* fixup! feat(manager/dockerfile): extract `apk add` packages from `RUN` instructions

---------

Co-authored-by: Claude Opus 5 <jamie.tanna+claude-code@mend.io>
44.96.0
2026-09-17 08:00:50 +00:00
Michael Kriese f711fd46e2 test: reach 100% branch coverage (#46284)
* test(workers/repository): mark seven unreachable guards for v8

These are defensive paths that no input reaches, and the guards stay as
they are. What changes is that v8 now knows to skip them: the existing
`istanbul ignore` comments are inert under the v8 provider, so the
branches behind them were still being counted.

- `versioning/index`: a string input can only fail the schema with the
  custom issue its own transform raises
- `versioning/conda`: pep440 always answers for a well-formed `==X.Y.*`
- `versioning/ruby`: callers only pass versions that have already parsed
- `repository/index`: only called when the repository logged a problem
- `config-migration/branch/rebase`: JSON5 output is always serializable
  back to JSON
- `onboarding/pr/pr-list`: base branches are unique Record keys, so the
  sort never compares one with itself
- `changelog/release-notes`: a matched release always carries its own url
- `changelog/source`: `getInRangeReleases` only returns null on paths it
  already ignores

Two notes on the hints. They have to be a single-line comment directly
above the statement -- a two-line reason, or anything in between such as
an oxlint directive, breaks the association silently. And `v8 ignore
else` covers an `if` with no else, while `v8 ignore next` covers an
expression-level branch such as `??` or a ternary.

`versioning/index` also swaps `issue && issue.code` for `issue?.code`,
which is what the oxlint directive sitting in the way was suppressing.

Co-authored-by: Claude Opus 5 <michael.kriese+claude-code@mend.io>

* test(workers/repository): cover the last five pr worker guards

None of these needed an ignore comment; each has a real input:

- `updatePrDebugData` gets a describe of its own. It is exported but was
  only reached through a pr whose debug data already carried labels, so
  the case where an existing pr has none went untaken.
- a `not-pending` branch whose status is no longer yellow
- a changelog error that is not a missing GitHub token
- an existing pr updated because a rebase was requested
- a platform that answers `createPr` with null, so assignees and
  reviewers are skipped

With these, `update/pr/index.ts` is fully covered.

Co-authored-by: Claude Opus 5 <michael.kriese+claude-code@mend.io>

* test(workers/repository): cover the last four branch update guards

- `bump-versions` reads the current version off disk when the pending
  change for that file carries no contents. All three guards involved are
  covered by one case where the file is pending in both the package file
  and the artifact list with no contents on either entry. An earlier
  attempt at this looked like it failed: the bump does happen, but the
  result is appended to `updatedPackageFiles` rather than
  `updatedArtifacts`, because the file is already pending there.
- `get-updated` keeps a package file another upgrade already wrote, for a
  manager that is asked for a lockfile-only update but has no
  `updateLockedDependency`.

With these, `lib/workers/repository` is fully covered.

Co-authored-by: Claude Opus 5 <michael.kriese+claude-code@mend.io>

* ci: pin the branch coverage threshold at 100

A full run on this branch reports 100% on all four metrics: statements
(49435/49435), branches (25727/25727), functions (7414/7414) and lines
(48924/48924).

Branches joins the other three at 100 rather than taking another
rounding-down step. There is no longer a margin to leave: any new
uncovered branch is a regression, and the threshold should say so.

Co-authored-by: Claude Opus 5 <michael.kriese+claude-code@mend.io>

---------

Co-authored-by: Claude Opus 5 <michael.kriese+claude-code@mend.io>
2026-09-17 07:08:48 +00:00
Michael Kriese f1ace2dfdc test(workers/repository): close more branch coverage gaps (#46269)
* test(workers/repository): cover the dependency dashboard guards

- a repository with no dashboard issue yet, so nothing is read back into
  the config
- a dashboard rendered with an empty header and with abandonment
  reporting turned off
- two vulnerabilities for the same package, which are grouped under one
  entry rather than recorded twice

With these, `dependency-dashboard.ts` is fully covered.

Co-authored-by: Claude Opus 5 <michael.kriese+claude-code@mend.io>

* test(workers/repository): cover a locked update that reports no files

`updateLockedDependency` can answer `updated` without handing back any
file contents. Every test supplied files alongside that status, so the
guard that skips merging them went untaken.

Co-authored-by: Claude Opus 5 <michael.kriese+claude-code@mend.io>

* test(workers/repository): cover a changelog release read from cache

Every changelog test started from an empty package cache, so the branch
that reuses a cached release rather than fetching it went untaken.

Co-authored-by: Claude Opus 5 <michael.kriese+claude-code@mend.io>

* ci: ratchet the branch coverage threshold

A full run on this branch reports 100% statements (49441/49441), 100%
functions (7414/7414), 100% lines (48930/48930) and 99.92% branches
(25723/25742), up from 99.89% on the branch below. The threshold moves to
99.90, keeping the same rounding-down margin as before.

Statements, functions and lines are already pinned at 100 and stay
there.

Co-authored-by: Claude Opus 5 <michael.kriese+claude-code@mend.io>

---------

Co-authored-by: Claude Opus 5 <michael.kriese+claude-code@mend.io>
2026-09-17 07:08:47 +00:00
Michael Kriese f7e8104511 test(workers/repository): close more branch coverage gaps (#46259)
* test(workers/repository): cover five pr body and warning guards

- an upgrade with no release notes of its own, which gets no summary
  title while the branch as a whole has notes
- an upgrade with no homepage, source or dependency url, whose name is
  therefore left unlinked
- an upgrade that defines no pr body columns
- an assignee list that filtering empties out
- a second warned dependency in a package file that is already listed,
  so the file is not recorded twice

Co-authored-by: Claude Opus 5 <michael.kriese+claude-code@mend.io>

* test(workers/repository): cover four changelog guards

- `massageName` gets a describe of its own: it is exported but was only
  ever reached through a release that carried a tag, so the no-version
  path and the empty-result path went untaken
- a lone in-range release with no earlier one to prepend
- a bitbucket tree holding exactly one changelog candidate, so nothing is
  logged about choosing between several
- a bitbucket-server source url that parses but matches neither the git
  nor the web repository pattern

Co-authored-by: Claude Opus 5 <michael.kriese+claude-code@mend.io>

* test(workers/repository): cover both extract failure paths

- a manager whose `extractAllPackageFiles` returns null, so there is
  nothing to massage dep names in
- a file whose `extractPackageFile` returns nothing, so it contributes no
  package file

Co-authored-by: Claude Opus 5 <michael.kriese+claude-code@mend.io>

* ci: ratchet the branch coverage threshold

A full run on this branch reports 100% statements (49491/49491), 100%
functions (7384/7384), 100% lines (48981/48981) and 99.86% branches
(25726/25761), up from 99.82% on the branch below. The threshold moves to
99.84, keeping the same rounding-down margin as before.

Statements, functions and lines are already pinned at 100 and stay
there.

Co-authored-by: Claude Opus 5 <michael.kriese+claude-code@mend.io>

* test(workers/repository): cover four process guards

- a libyear update released before the version currently in use, which
  yields a negative age and is therefore not counted
- a pr that is closed, and one raised from the onboarding branch, neither
  of which counts towards the concurrent pr limit
- a second base branch whose package files do not displace the first
  one's, on a platform that cannot sync a fork with its upstream

The fork case redefines `syncForkWithUpstream` rather than deleting it,
the same way the migration branch spec handles `refreshPr`.

Co-authored-by: Claude Opus 5 <michael.kriese+claude-code@mend.io>

* test(workers/repository): cover the extract cache guards

- a cached extract whose manager fingerprints all still match, so the
  cache is reusable; the test reads the expected fingerprint out of
  `hashMap` rather than hard-coding a hash that regenerates
- an extract that is told not to overwrite the cache
- a cached scan for a branch that is still a configured base branch, so
  it survives the clean-up that drops the others

With these, `lib/workers/repository/process` is fully covered.

Co-authored-by: Claude Opus 5 <michael.kriese+claude-code@mend.io>

* test(workers/repository): cover the branchPrefixOld miss

`prAlreadyExisted` retries the lookup under the old branch prefix, but
every test either hit on the first lookup or on the second, so the case
where both miss went untaken.

Co-authored-by: Claude Opus 5 <michael.kriese+claude-code@mend.io>

* ci: ratchet the branch coverage threshold to 99.87

The tests added after the earlier bump in this branch close eight more
branches. A full run now reports 100% statements (49491/49491), 100%
functions (7384/7384), 100% lines (48981/48981) and 99.89% branches
(25734/25761). The threshold moves from 99.84 to 99.87, keeping the same
rounding-down margin as before.

Statements, functions and lines are already pinned at 100 and stay
there.

Co-authored-by: Claude Opus 5 <michael.kriese+claude-code@mend.io>

* test(workers/repository): cover three changelog embedding guards

The pr worker copies release notes off each upgrade's changelog result.
Three of its guards were never taken because every test supplied a
complete result for a distinct repository:

- a changelog with no project, so no repo name is recorded
- a changelog with a project but no versions, so no releases are copied
- a second upgrade for a repository whose notes were already committed,
  which is skipped rather than repeated

Co-authored-by: Claude Opus 5 <michael.kriese+claude-code@mend.io>

---------

Co-authored-by: Claude Opus 5 <michael.kriese+claude-code@mend.io>
2026-09-17 07:08:46 +00:00
Michael Kriese 7960e5d077 test(workers/repository): close more branch coverage gaps (#46254)
* test(workers/repository): cover the pr note and closed-pr guards

`handle-existing.ts` had no spec of its own and was only reached through
the branch worker, so none of its early exits were exercised. Give it
one, covering an open pr, a suppressed notification, a branch that is
already gone, each of the three ignore messages, and both dry-run paths
in each function.

Also cover a pr body with no notes at all, extra notes where none of the
three conditions hold, and a config warning issue raised from an error
that carries no validation details and whose issue is neither created
nor updated.

Co-authored-by: Claude Opus 5 <michael.kriese+claude-code@mend.io>

* test(workers/repository): cover five config migration guards

- a `package.json` that carries no `renovate` key, so nothing is deleted
  from it before it is rewritten
- a platform with no `refreshPr`, which the migration branch check has to
  tolerate
- an old migration branch that is already gone, so there is nothing to
  delete before the new one is created
- an editorconfig that sets no maximum line length
- a migration pr with no footer configured

The platform case redefines `refreshPr` rather than deleting it: the
mocked module object refuses deletion but allows redefinition.

Co-authored-by: Claude Opus 5 <michael.kriese+claude-code@mend.io>

* test(workers/repository): cover the onboarding and reconfigure caches

- deleting and updating the onboarding cache when there is no cache
- an onboarding pr whose closing comment is suppressed
- a reconfigure cache written together with an extract result

Also drop the `if (extractResult)` in the reconfigure check: the catch
above it returns, so the variable is always set by the time the comment
is ensured, and the compiler narrows it on its own.

Co-authored-by: Claude Opus 5 <michael.kriese+claude-code@mend.io>

* test(workers/repository): cover the update flattening guards

- a config whose `semanticCommits` is already decided, so no detection
  runs while flattening
- a semantic commit with no scope configured

Also drop the first `packagePath.length > 0` check while flattening:
`String.split` always yields at least one element, so there is always a
file name to drop. The check after the splice stays, since that one can
leave the array empty.

Co-authored-by: Claude Opus 5 <michael.kriese+claude-code@mend.io>

* ci: ratchet the branch coverage threshold

A full run on this branch reports 100% statements (49468/49468), 100%
functions (7381/7381), 100% lines (48958/48958) and 99.82% branches
(25709/25755), up from 99.73% on the branch below. The threshold moves to
99.80, keeping the same rounding-down margin as before.

Statements, functions and lines are already pinned at 100 and stay
there.

Co-authored-by: Claude Opus 5 <michael.kriese+claude-code@mend.io>

* Apply suggestion from `@secustor`

Co-authored-by: Sebastian Poxhofer <secustor@users.noreply.github.com>

---------

Co-authored-by: Claude Opus 5 <michael.kriese+claude-code@mend.io>
Co-authored-by: Sebastian Poxhofer <secustor@users.noreply.github.com>
2026-09-17 07:08:46 +00:00
Sebastian Poxhofer 4215f35059 feat(config): add minimumReleaseAgeBuffer option (#45577)
* feat(config): add minimumReleaseAgeBuffer option

Adds a new config option which extends the time Renovate waits before
suggesting an update by a percentage of minimumReleaseAge. This gives
companion packages that are published after the main package (e.g.
platform-specific binaries) time to pass the package manager's own
release age cooldown, avoiding lock file artifact errors.

* feat(config): make minimumReleaseAgeBuffer a duration with 10 minutes default

* feat(config): raise minimumReleaseAgeBuffer default to 30 minutes
2026-09-17 07:08:00 +00:00
Maxime Brunet a22f8f0a09 fix(platform/github): attempt direct merge before falling back to the merge queue (#46271)
fix(github): attempt direct merge before falling back to the merge queue

PR automerge against a merge-queue-protected base branch could no longer
merge directly when the authenticated actor is allowed to bypass the
queue: mergePr() enqueues the PR unconditionally once the base branch has
a merge queue, and the enqueuePullRequest mutation evaluates queue-entry
requirements (e.g. required code-owner review) without honoring ruleset
bypass, leaving bypass-enabled installs unable to merge at all.

Attempt the direct REST merge first and enqueue only when that merge is
refused, mirroring the try-first design #45724 shipped for branch
automerge. Repositories without a bypass actor pay one refused REST merge
call per automerge attempt before the queue fallback, and up to four when
an unrecognized refusal message triggers method guessing.

Docs: describe the direct-merge-first behavior in the GitHub merge queue
section of the automerge documentation.
2026-09-17 07:07:56 +00:00
renovate[bot] c5a2722b20 chore(deps): update jlumbroso/free-disk-space action to v1.3.2 (main) (#46283)
chore(deps): update jlumbroso/free-disk-space action to v1.3.2

| datasource  | package                   | from   | to     |
| ----------- | ------------------------- | ------ | ------ |
| github-tags | jlumbroso/free-disk-space | v1.3.1 | v1.3.2 |

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-09-17 05:24:20 +00:00
renovate[bot] 8763fe4cf7 chore(deps): update codecov/codecov-action action to v7.1.1 (main) (#46282)
chore(deps): update codecov/codecov-action action to v7.1.1

| datasource  | package                | from   | to     |
| ----------- | ---------------------- | ------ | ------ |
| github-tags | codecov/codecov-action | v7.1.0 | v7.1.1 |

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-09-17 01:30:32 +00:00
renovate[bot] 2732ccf857 feat(deps): update ghcr.io/renovatebot/base-image docker tag to v13.99.0 (main) (#46281)
feat(deps): update ghcr.io/renovatebot/base-image docker tag to v13.99.0

| datasource | package                        | from     | to      |
| ---------- | ------------------------------ | -------- | ------- |
| docker     | ghcr.io/renovatebot/base-image | 13.98.10 | 13.99.0 |

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
44.95.0
2026-09-17 00:25:27 +00:00
renovate[bot] 8e9dcc7db4 build(deps): update dependency @renovatebot/detect-tools to v4.0.16 (main) (#46279)
build(deps): update dependency @renovatebot/detect-tools to v4.0.16

| datasource | package                   | from   | to     |
| ---------- | ------------------------- | ------ | ------ |
| npm        | @renovatebot/detect-tools | 4.0.15 | 4.0.16 |

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
44.94.4
2026-09-16 23:25:10 +00:00
renovate[bot] 28f514ae1d chore(deps): update ghcr.io/containerbase/devcontainer docker tag to v14.16.0 (main) (#46280)
chore(deps): update ghcr.io/containerbase/devcontainer docker tag to v14.16.0

| datasource | package                            | from    | to      |
| ---------- | ---------------------------------- | ------- | ------- |
| docker     | ghcr.io/containerbase/devcontainer | 14.15.2 | 14.16.0 |

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-09-16 23:24:46 +00:00
renovate[bot] 6475043afd chore(deps): update dependency memfs to v4.72.1 (main) (#46278)
chore(deps): update dependency memfs to v4.72.1

| datasource | package | from   | to     |
| ---------- | ------- | ------ | ------ |
| npm        | memfs   | 4.71.0 | 4.72.1 |

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
44.94.3
2026-09-16 22:34:06 +00:00
renovate[bot] 3c31c7df73 build(deps): update dependency zod to v4.6.1 (main) (#46277)
build(deps): update dependency zod to v4.6.1

| datasource | package | from  | to    |
| ---------- | ------- | ----- | ----- |
| npm        | zod     | 4.6.0 | 4.6.1 |

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-09-16 22:27:10 +00:00
renovate[bot] d440083229 build(deps): update dependency @renovatebot/detect-tools to v4.0.15 (main) (#46276)
build(deps): update dependency @renovatebot/detect-tools to v4.0.15

| datasource | package                   | from   | to     |
| ---------- | ------------------------- | ------ | ------ |
| npm        | @renovatebot/detect-tools | 4.0.14 | 4.0.15 |

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
44.94.2
2026-09-16 21:28:20 +00:00
renovate[bot] 88e6c1a57e build(deps): update dependency zod to v4.6.0 (main) (#46275)
build(deps): update dependency zod to v4.6.0

| datasource | package | from  | to    |
| ---------- | ------- | ----- | ----- |
| npm        | zod     | 4.5.4 | 4.6.0 |

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
44.94.1
2026-09-16 20:27:11 +00:00
renovate[bot] c563ab2a52 fix(deps): update ghcr.io/renovatebot/base-image docker tag to v13.98.10 (main) (#46274)
fix(deps): update ghcr.io/renovatebot/base-image docker tag to v13.98.10

| datasource | package                        | from    | to       |
| ---------- | ------------------------------ | ------- | -------- |
| docker     | ghcr.io/renovatebot/base-image | 13.98.9 | 13.98.10 |

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-09-16 20:25:47 +00:00
renovate[bot] 45df173f8f chore(deps): update dependency @types/node to v24.13.4 (main) (#46273)
chore(deps): update dependency @types/node to v24.13.4

| datasource | package     | from    | to      |
| ---------- | ----------- | ------- | ------- |
| npm        | @types/node | 24.13.3 | 24.13.4 |

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-09-16 18:28:10 +00:00
Jamie Tanna a14607f7e4 test(manager/renovate-config): guard supportedPresetSources against drift (#46256)
In #46201, we found that although `forgejo>` support was added to
Shareable Config Presets, the `renovate-config` manager didn't actually
implement the lookup, meaning we didn't previously propose updates we
should have.

We can validate this is done by making sure that the `{platform}-tags`
datasource is used to look up a preset.

Co-authored-by: Claude Sonnet 5 <jamie.tanna+claude-code@mend.io>
2026-09-16 15:31:57 +00:00
Jamie Tanna 0f5e9af2a3 docs(mend-hosted): clarify Enterprises can change inheritConfig* (#46261) 2026-09-16 15:28:49 +00:00
Jamie Tanna 98e4bb5713 docs(mend-hosted): move environment variables to their own page (#46260)
To allow more easily linking to them.
2026-09-16 15:28:48 +00:00