Files
renovate/lib/util/cache/package/namespaces.ts
Jamie Tanna aae889a285 fix(datasource/go): cache the publication time of each version (#45951)
* fix(datasource/go): cache the publication time of each version

The Go proxy defines that the `.info` API call is for a specific release
version of a module, this file should never be modified after it's been
created.

However, because we previously had a 30m TTL on these entries, a
repository that runs infrequently can lead to re-fetching data that
doesn't ever update.

We can fix this by introducing a separate cache namespace for the
module's creation timestamp (`Time` in the `.info` API call).

We can make sure that:

- we always merge, not replace, the entries, as the `major < 2` filter
  in `_getReleases` means a run may only see a subset of a module's
  versions, and writing back only what we saw would evict the rest
- we re-read immediately before writing, as `foo` and `foo/v2` are
  separate lookups which both walk the `v2` module, so one can overwrite
  the other's timestamps
- the key is the proxy which served the data, minus any credentials,
  since a private Artifactory `GOPROXY` is a different universe of
  timestamps to `proxy.golang.org`
- only the timestamps we successfully fetched are stored, so a proxy
  which serves no `Time` doesn't have that recorded for 100 days
- it uses its own namespace, so that a `cacheTtlOverride` on the release
  cache doesn't drag the immutable data down with it

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

* fixup! fix(datasource/go): cache the publication time of each version

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

* fixup! fixup! fix(datasource/go): cache the publication time of each version

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

---------

Co-authored-by: Claude Opus 5 <jamie.tanna+claude-code@mend.io>
2026-09-15 16:02:16 +00:00

121 lines
3.5 KiB
TypeScript

// v8 ignore file -- constant namespace list, no executable logic to cover
/* IMPORTANT:
* These namespaces below are used as part of the cacheTtlOverride feature
* It's OK to add to them (e.g. for new datasources) but we should avoid
* backwards-incompatible changes in non-major releases
*/
export const packageCacheNamespaces = [
'_test-namespace',
'changelog-bitbucket-notes@v2',
'changelog-bitbucket-release',
'changelog-bitbucket-server-notes@v2',
'changelog-bitbucket-server-release',
'changelog-forgejo-notes@v2',
'changelog-forgejo-release',
'changelog-gitea-notes@v2',
'changelog-gitea-release',
'changelog-github-notes@v2',
'changelog-github-release',
'changelog-gitlab-notes@v2',
'changelog-gitlab-release',
'datasource-apk',
'datasource-artifactory',
'datasource-aws-machine-image',
'datasource-aws-rds',
'datasource-aws-eks-addon',
'datasource-azure-bicep-resource',
'datasource-azure-pipelines-tasks',
'datasource-azure-tags',
'datasource-bazel',
'datasource-bitbucket-tags',
'datasource-bitbucket-server-tags',
'datasource-bitrise',
'datasource-buildpacks-registry',
'datasource-cdnjs',
'datasource-conan',
'datasource-conda',
'datasource-cpan',
'datasource-crate-metadata',
'datasource-crate',
'datasource-deb',
'datasource-deno',
'datasource-docker-architecture',
'datasource-docker-hub-cache',
'datasource-docker-digest',
'datasource-docker-hub-tags',
'datasource-docker-imageconfig',
'datasource-docker-labels',
'datasource-docker-releases-v2',
'datasource-docker-tags',
'datasource-dotnet-version',
'datasource-elm-package',
'datasource-endoflife-date',
'datasource-galaxy-collection',
'datasource-galaxy',
'datasource-git-refs',
'datasource-git-tags',
'datasource-git',
'datasource-forgejo-releases',
'datasource-forgejo-tags',
'datasource-gitea-releases',
'datasource-gitea-tags',
'datasource-github-digest',
'datasource-github-release-attachments',
'datasource-gitlab-packages',
'datasource-gitlab-releases',
'datasource-gitlab-tags',
'datasource-glasskube-packages',
'datasource-go-direct',
'datasource-go-proxy-timestamps',
'datasource-go-proxy',
'datasource-go',
'datasource-golang-version',
'datasource-gradle-version',
'datasource-helm',
'datasource-hermit',
'datasource-hex',
'datasource-hexpm-bob',
'datasource-java-version',
'datasource-jenkins-plugins',
'datasource-jsr',
'datasource-maven:cache-provider',
'datasource-maven:metadata-not-found',
'datasource-maven:pom-cache-provider',
'datasource-maven:postprocess-reject',
'datasource-nextcloud',
'datasource-node-version',
'datasource-npm:cache-provider',
'datasource-nuget-v3',
'datasource-orb',
'datasource-packagist',
'datasource-pod',
'datasource-python-version',
'datasource-repology',
'datasource-rpm',
'datasource-ruby-version',
'datasource-rubygems',
'datasource-rust-version',
'datasource-sbt-package',
'datasource-terraform-module',
'datasource-terraform-provider',
'datasource-terraform',
'datasource-typst:cache-provider',
'datasource-typst:registry-releases',
'datasource-unity3d',
'datasource-unity3d-packages',
'github-branches-datasource-v1',
'github-releases-datasource-v2',
'github-tags-datasource-v2',
'merge-confidence',
'preset',
'terraform-provider-hash',
'url-sha256',
] as const;
export type PackageCacheNamespace =
(typeof packageCacheNamespaces)[number] | `datasource-releases-${string}`;
export type CombinedKey =
`datasource-mem:pkg-fetch:${PackageCacheNamespace}:${string}`;