Commit Graph

60 Commits

Author SHA1 Message Date
Sebastian Poxhofer 716baf630b fix(linters): add rules for filesystem helpers and Date (#44685)
* feat(lint): add renovate/prefer-fs-util and renovate/prefer-luxon rules

Two shared-util substitution rules, both at warn level:

- renovate/prefer-fs-util flags value imports of fs, node:fs,
  fs/promises, node:fs/promises, fs-extra and fs-extra/esm in lib/
  source files outside lib/util/fs/, pointing to the scoped helpers
  from lib/util/fs. Spec files and type-only imports are exempt.
  A config-only change via no-restricted-imports was considered but
  rejected: that rule is at error severity globally and per-path warn
  severity is not expressible, so the 13 existing call sites would
  break the baseline.

- renovate/prefer-luxon flags new Date(...) and Date.now() in lib/
  source files, pointing to Luxon per best-practices. Date/time
  utility modules (lib/util/date, lib/util/pretty-time,
  lib/util/timestamp) and spec files (vi.setSystemTime etc.) are
  exempt.

Baseline: 13 prefer-fs-util and 45 prefer-luxon warnings, zero errors.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* refactor: use Luxon instead of new Date() at remaining call sites

Fixes all renovate/prefer-luxon violations for `new Date(...)`:

- `new Date().toISOString()` -> `DateTime.utc().toISO()` (byte-identical
  output) in the http cache provider, schedule logging and PR cache.
- `new Date()` -> `DateTime.now().toJSDate()` for the git commit-date
  fallback and the rubygems `syncedAt` markers (same `Date` values).
- rust-release-channel now computes the Rust 1.0 release date and nightly
  version dates via `DateTime.utc(...)`; previously `new Date(y, m, d)`
  used the local timezone while the epoch used UTC, so the comparison was
  timezone-dependent at the boundary date. Tests run with TZ=UTC, where
  behavior is unchanged.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* refactor: use lib/util/fs helpers in repository worker

Fixes renovate/prefer-fs-util violations outside bootstrap code:

- `fs.ensureDir()` -> `ensureDir()` from lib/util/fs (same fs-extra call
  underneath; it no-ops on an empty dir name, so the repository worker
  spec now simulates the init failure via a rejected `initRepo` instead
  of relying on `fs.ensureDir('')` throwing).
- `fs.remove(privateCacheDir())` -> `cachePathExists()` + `rmCache()`,
  keeping the remove-if-present semantics while asserting cacheDir
  containment.

Two call sites keep raw imports with reasoned disable comments:

- lib/util/modules.ts synchronously enumerates Renovate's own installed
  module directories at import time.
- lib/util/cache/package/impl/sqlite.ts receives cacheDir as an explicit
  argument during global initialization, before GlobalConfig (which the
  scoped cache helpers resolve against) contains cacheDir.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* feat(lint): promote prefer-fs-util and prefer-luxon to error

Both rules are narrowed to what is actually accepted practice before
being promoted:

prefer-luxon no longer flags `Date.now()`: it returns UTC-based epoch
milliseconds used for elapsed-time measurement and TTL arithmetic, which
is timezone-independent by construction. The mined reviewer feedback
behind this rule ("use Luxon for date arithmetic outside util") targets
timezone-dependent date construction/formatting, which cannot occur with
a raw millis number; the rule keeps flagging `new Date(...)`.

prefer-fs-util exempts code that legitimately needs raw fs access
because the scoped lib/util/fs helpers resolve against GlobalConfig
localDir/cacheDir, which does not exist yet or does not apply there:

- lib/logger/: log-file streams at user-configured system paths during
  bootstrap; lib/util/fs also depends on the logger (import cycle).
- lib/workers/global/: creates baseDir/cacheDir themselves and
  reads/writes user-supplied paths before GlobalConfig is seeded.
- lib/config-validator.ts: standalone CLI without GlobalConfig.
- lib/util/git/: owns the localDir lifecycle (clone, emptyDir, symlinks)
  and private-key files with sync cleanup on process exit.

Also fixes a pre-existing tsc error in prefer-fs-util.js: `importKind`
is a TypeScript-ESTree extension missing from eslint's base AST types.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* refactor(fs): make rmCache ignore missing paths

All rmCache callers use it for cleanup, where a missing path is a
no-op, so bake force: true in instead of guarding call sites with
an existence check.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* refactor(linters): exempt lib/instrumentation from prefer-fs-util

`lib/instrumentation/file-exporter.ts` landed on main while this branch
was open and imports `node:fs/promises` directly.

The exporter writes to a user-configured system path
(`RENOVATE_TRACING_FILE_EXPORTER_PATH`) outside `localDir`/`cacheDir`,
so the scoped helpers do not apply. `lib/instrumentation` is also
deliberately kept out of the module graph of instrumented libraries
(see the `⚠️` note in `lib/renovate.ts`), so it must not pull in
`lib/util/fs` and its config/logger dependencies. Exempt the directory,
as is already done for `lib/logger`.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* docs: shorten doc

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-25 16:00:44 +00:00
Jamie Tanna ff6761ed23 fix(config/global): return default values for GlobalConfig.get (#42113)
* fix(config/global): return default values for `GlobalConfig.get`

As noted in #39949, it can be awkward working with in `GlobalConfig.get`, where
we would previously need to specify the default value when calling `.get`,
which could lead to drift with the defaults for a given config option.

To reduce this risk, we can rely on a given `default` for a configuration
option, providing that as a default.

Because this now definitely returns a value that matches the config option, it
now allows us to remove `!` assertions.

* fixup! fix(config/global): return default values for `GlobalConfig.get`

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>

* fixup! fix(config/global): return default values for `GlobalConfig.get`

* test(presets): remove impossible test

As it's now not possible to set a value as `undefined` (as
`GlobalConfig` will then use the default), this test no longer validates
anything.

* test(workers/repository): add mock

Now `platform` defaults to `github`, we need to mock out the call to
fetch config.

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

* test: coverage

* test: coverage

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.6 <jamie.tanna+claude-code@mend.io>
2026-05-15 17:10:38 +00:00
Dmytro Shteflyuk 3d9899058c refactor(datasource/rpm): extract xml metadata provider (#41910)
* refactor(datasource/rpm): extract xml metadata provider

* refactor(datasource/rpm): remove unnecessary error cast

* refactor(datasource/rpm): extract repomd helpers

* refactor(datasource/rpm): cache extracted metadata file

* test(datasource/rpm): cover cache helper error paths

* fix(datasource/rpm): preserve cached metadata on refresh failure
2026-05-13 14:29:40 +00:00
renovate[bot] 766db6fc6f build(deps): update dependency upath to v3 (main) (#43121)
* build(deps): update dependency upath to v3

| datasource | package | from  | to    |
| ---------- | ------- | ----- | ----- |
| npm        | upath   | 2.0.1 | 3.0.7 |

* chore: fix types

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Michael Kriese <michael.kriese@visualon.de>
2026-05-06 12:09:33 +00:00
Jamie Tanna 9dcd32dc72 feat(util): log warning if file(s) contain hidden Unicode characters (#41353)
feat(utilgit): log warning if file(s) contain hidden Unicode characters

With the rise of prompt injection, there is an increased number of
attacks occurring using hidden Unicode characters.

These hidden characters can also confuse other tools, so it's best for
Renovate to surface these to repository owners, as we read files that
may be problematic.

To avoid multiple reads of files, we can do this every time our
`readLocalFile` function is called, as we already have the file content.

An alternate option would be that in `workers/repository` we could check
the read package files, but given `extractAllPackageFiles` may be used
by a Manager, we can't inject the logic in, without Managers needing to
implement the logic themselves.

This should be performant, and not introduce too many false-positives,
but this will also depend on how (package) files are set up in
repositories.

The list of suspicious characters has been largely compiled by Claude
Sonnet 4.5.

Co-authored-by: Claude Sonnet 4.5 <jamie.tanna+github-copilot@mend.io>
2026-02-20 14:15:45 +00:00
Sergei Zharinov 930cf6633c refactor: Rewrite imports with .ts extensions (#40700)
fix: Additional vi.mock path corrections and prettier formatting
2026-01-26 22:48:17 +00:00
Michael Kriese 9fe353adb4 test: add coverage (part1) (#40636) 2026-01-23 15:09:01 +00:00
RahulGautamSingh 76f911041a refactor: use named exports (#39196)
* use named exports

* fix test

* add missing imnport

* fix prettier
2025-11-10 12:00:35 +00:00
renovate[bot] 856f5dc5f7 build(deps): update dependency find-up to v7 (main) (#35752)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Michael Kriese <michael.kriese@visualon.de>
2025-05-06 09:42:33 +00:00
renovate[bot] eb8c08079e chore(deps): update typescript-eslint monorepo to v8 (major) (#30750)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Michael Kriese <michael.kriese@visualon.de>
2024-08-14 10:33:02 +00:00
oxdev03 5bdb8210ef chore(utils): extend fs utils with createCacheReadStream and statCach… (#30600) 2024-08-05 16:57:21 +00:00
Sebastian Poxhofer a1cad20a42 fix(manager/terraform): fix hash generation with directory (#28326) 2024-04-13 15:51:19 +00:00
Sebastian Poxhofer 481aa216b2 feat(instrumentation/reporting): add report option (#26087)
Co-authored-by: HonkingGoose <34918129+HonkingGoose@users.noreply.github.com>
Co-authored-by: Michael Kriese <michael.kriese@visualon.de>
2024-03-17 09:22:42 +00:00
Sergei Zharinov b69416ce17 refactor(prettier): Force trailing commas (#25631) 2023-11-07 15:50:29 +00:00
Sergei Zharinov 11c05fc837 refactor: Default values for GlobalConfig.get (#22967) 2023-06-25 19:34:42 +00:00
Rhys Arkins 93052ec917 feat: platform=local (#22010)
Co-authored-by: Jamie Magee <jamie.magee@gmail.com>
2023-05-10 04:30:12 +00:00
Michael Kriese 2de1b29c1f feat(fs): add isValidLocalPath function (#21433) 2023-04-12 15:13:34 +00:00
Jamie Magee 176282e65f chore: use node: protocol imports (#21181) 2023-03-28 21:05:36 +00:00
renovate[bot] 84df0c0ca7 chore(deps): update dependency @types/fs-extra to v11 (#19755)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Michael Kriese <michael.kriese@visualon.de>
2023-01-24 11:46:08 +00:00
Michael Kriese e78048dfc1 fix: no cycles (#19982) 2023-01-23 21:20:54 +00:00
Johannes Feichtner aaaa6a1cfe refactor: extract getLockFileContentMap() into fs utils (#17962) 2022-09-25 16:31:11 +02:00
Michael Kriese 10fd0f2827 fix(cache/repository): don't log error for non-existant files (#17427) 2022-08-26 12:25:35 +00:00
Yun Lai f1bcafc584 feat(fs): add localPathIsSymbolicLink and readLocalSymlink (#16673)
* fix: add localPathIsSymbolicLink and readLocalSymlink to fs module

* Update lib/util/fs/index.ts

Co-authored-by: Michael Kriese <michael.kriese@visualon.de>

* Update lib/util/fs/index.ts

* Apply suggestions from code review

Co-authored-by: Sergei Zharinov <zharinov@users.noreply.github.com>

Co-authored-by: Michael Kriese <michael.kriese@visualon.de>
Co-authored-by: Rhys Arkins <rhys@arkins.net>
Co-authored-by: Sergei Zharinov <zharinov@users.noreply.github.com>
2022-07-26 08:19:20 +00:00
Sergei Zharinov d0fe5f904e feat(fs): Scope checks for filesystem functions (#16511) 2022-07-14 07:53:26 +00:00
Sergei Zharinov e26130329d refactor(fs): Add tests for every filesystem function (#16495)
Co-authored-by: Rhys Arkins <rhys@arkins.net>
2022-07-09 18:50:45 +00:00
Sergei Zharinov 83f67c27d5 refactor(fs): Rename getSubDirectory to getParentDir (#16446)
* refactor(fs): Rename `getSubDirectory` to `getParentDir`

* Add tests for `getSiblingFileName`

* fix

* fix
2022-07-07 06:44:21 +00:00
Sergei Zharinov 2b43f273bf refactor(fs): Remove proxies.ts file (#16325)
Co-authored-by: Michael Kriese <michael.kriese@visualon.de>
2022-07-01 14:57:30 +02:00
Sergei Zharinov 851d8f4f7a refactor(fs): Move chmod to chmodLocalFile (#16306)
* refactor(fs): Move `chmod` to `chmodLocalFile`

* More refactoring and tests

* Fix tests

* Apply suggestions from code review

Co-authored-by: Michael Kriese <michael.kriese@visualon.de>

* Fix prettier

Co-authored-by: Michael Kriese <michael.kriese@visualon.de>
2022-06-29 06:03:49 +00:00
Michael Kriese 0a582d31c7 refactor: fix nullable types (#16156)
* refactor: fix nullable types

* chore: revert changes

* chore: fix lint comments

* chore: revert changes
2022-06-20 16:15:40 +00:00
Michael Kriese 5afed40ba3 fix(manager:nuget): use git to read current lockfile (#15395) 2022-05-20 04:40:54 +00:00
Michael Kriese 9f53724d90 feat(manager:npm): use local fs api (#15294) 2022-04-25 15:41:10 +02:00
Michael Kriese f5cc1de36f fix(fs): missing path normalization (#14414) 2022-02-25 14:12:43 +01:00
Oleg Krivtsov 6604de3aeb feat(manager/nuget): migrate fs.readFile to fs.readLocalFile (#14234)
Co-authored-by: Michael Kriese <michael.kriese@visualon.de>
2022-02-25 11:07:31 +01:00
Oleg Krivtsov 25e62d54a4 feat(git-submodules): handle directory artifacts in postUpgradeTasks (#13480) 2022-01-25 16:29:39 +00:00
Michael Kriese c5d50f6da3 refactor: more esm imports (#13233)
Co-authored-by: Rhys Arkins <rhys@arkins.net>
2021-12-22 11:28:20 +00:00
Michael Kriese 2b24a98359 refactor: update imports for esm (#13230)
Co-authored-by: Rhys Arkins <rhys@arkins.net>
2021-12-22 08:37:47 +00:00
Sergei Zharinov 879e59fa19 refactor(util/fs): Enable strict null checks (#12904) 2021-12-01 09:12:56 +00:00
Maksim 06d8c27043 refactor: global config (#12743)
Co-authored-by: Michael Kriese <michael.kriese@visualon.de>
2021-11-23 21:10:45 +01:00
Rhys Arkins 9150854d75 chore: rename config/admin -> config/global 2021-08-17 07:57:45 +02:00
Rhys Arkins bf69924b78 refactor: rename config admin functions to global 2021-08-17 07:57:45 +02:00
Rhys Arkins 0e91fda451 feat: centralized cache directory (#10115)
Ignore environment variables and instead use static cache directory for third party tools.

Closes #10094

BREAKING CHANGE: Renovate will now override any package manager cache locations configured in env variables.
# Conflicts:
#	lib/manager/gomod/__snapshots__/artifacts.spec.ts.snap
#	lib/manager/gomod/artifacts.ts
2021-08-17 07:57:45 +02:00
Sergei Zharinov f4976c5d1d refactor: Centralize logging for ensureCacheDir function (#10603) 2021-06-25 11:42:37 +00:00
Sergei Zharinov 11f89147ac refactor: Use exec util instead of obtaining env directly (#10584) 2021-06-24 11:36:44 +02:00
Sebastian Poxhofer eb8ad0c38e feat(terraform): Implement terraform lock files (#10469) 2021-06-17 10:17:19 +00:00
Rhys Arkins 5b25bf5e0c fix: revert terraform lock file handling (#10466)
* fix: Revert "fix(manager): optimize lockfile cache handling (#10463)"

This reverts commit 713e35e88f.

* fix: Revert "fix(terraform): use path joins instead of slashes (#10461)"

This reverts commit 2776db6a2d.

* fix: Revert "feat(terraform): update terraform lock files (#8429)"

This reverts commit dab27f28c3.
2021-06-16 17:45:39 +02:00
Sebastian Poxhofer dab27f28c3 feat(terraform): update terraform lock files (#8429) 2021-06-16 08:02:34 +00:00
Rhys Arkins a091a95383 fix(fs): only ensureDir non-empty string (#10177) 2021-05-26 15:10:30 +00:00
Rhys Arkins 79592f848a fix: Revert "refactor: localDir -> cloneDir" (#10166)
This reverts commit 0b287c763d.
2021-05-26 11:22:16 +00:00
Rhys Arkins 0b287c763d refactor: localDir -> cloneDir (#10158) 2021-05-26 10:30:23 +02:00
Sergei Zharinov fbbbce608e chore: Configure fs local dirs via admin config (#9990)
Co-authored-by: Rhys Arkins <rhys@arkins.net>
2021-05-17 13:21:28 +00:00