diff --git a/lib/config/admin.ts b/lib/config/admin.ts index c25361eac9024424e61e378a43706b4b4d717d9b..85960857864a2f79c18c133f0b0690c67fcd40cb 100644 --- a/lib/config/admin.ts +++ b/lib/config/admin.ts @@ -3,7 +3,7 @@ import type { RenovateConfig, RepoAdminConfig } from './types'; let adminConfig: RepoAdminConfig = {}; // TODO: once admin config work is complete, add a test to make sure this list includes all options with admin=true (#9603) -export const repoAdminOptions = [ +const repoAdminOptions = [ 'allowCustomCrateRegistries', 'allowPostUpgradeCommandTemplating', 'allowScripts', @@ -15,14 +15,20 @@ export const repoAdminOptions = [ 'dryRun', 'exposeAllEnv', 'privateKey', + 'localDir', + 'cacheDir', ]; -export function setAdminConfig(config: RenovateConfig = {}): void { +export function setAdminConfig( + config: RenovateConfig | RepoAdminConfig = {} +): RenovateConfig { adminConfig = {}; + const result = { ...config }; for (const option of repoAdminOptions) { adminConfig[option] = config[option]; - delete config[option]; // eslint-disable-line no-param-reassign + delete result[option]; // eslint-disable-line no-param-reassign } + return result; } export function getAdminConfig(): RepoAdminConfig { diff --git a/lib/config/types.ts b/lib/config/types.ts index bb9684796cb083b03aee74f75f166c2ad2cfdf76..e0cfa91a98543b17c37a39b734305ec2a99c2dbf 100644 --- a/lib/config/types.ts +++ b/lib/config/types.ts @@ -94,6 +94,8 @@ export interface RepoAdminConfig { dryRun?: boolean; exposeAllEnv?: boolean; privateKey?: string | Buffer; + localDir?: string; + cacheDir?: string; } export interface LegacyAdminConfig { diff --git a/lib/datasource/crate/index.spec.ts b/lib/datasource/crate/index.spec.ts index 4e006411363b73fea95cfa62e302723ea57e2eb8..00ae5986f2c7cb88cdf73a4d559190c9d94bb695 100644 --- a/lib/datasource/crate/index.spec.ts +++ b/lib/datasource/crate/index.spec.ts @@ -7,8 +7,8 @@ import { getPkgReleases } from '..'; import * as httpMock from '../../../test/http-mock'; import { getName, loadFixture } from '../../../test/util'; import { setAdminConfig } from '../../config/admin'; +import type { RepoAdminConfig } from '../../config/types'; import * as memCache from '../../util/cache/memory'; -import { setFsConfig } from '../../util/fs'; import { RegistryFlavor, RegistryInfo } from './types'; import { id as datasource, fetchCrateRecordsPayload, getIndexSuffix } from '.'; @@ -75,22 +75,21 @@ describe(getName(), () => { describe('getReleases', () => { let tmpDir: DirectoryResult | null; - let localDir: string | null; - let cacheDir: string | null; + let adminConfig: RepoAdminConfig; beforeEach(async () => { httpMock.setup(); tmpDir = await dir(); - localDir = join(tmpDir.path, 'local'); - cacheDir = join(tmpDir.path, 'cache'); - setFsConfig({ - localDir, - cacheDir, - }); + + adminConfig = { + localDir: join(tmpDir.path, 'local'), + cacheDir: join(tmpDir.path, 'cache'), + }; + setAdminConfig(adminConfig); + simpleGit.mockReset(); memCache.init(); - setAdminConfig(); }); afterEach(() => { @@ -232,7 +231,7 @@ describe(getName(), () => { }); it('clones cloudsmith private registry', async () => { const { mockClone } = setupGitMocks(); - setAdminConfig({ allowCustomCrateRegistries: true }); + setAdminConfig({ ...adminConfig, allowCustomCrateRegistries: true }); const url = 'https://dl.cloudsmith.io/basic/myorg/myrepo/cargo/index.git'; const res = await getPkgReleases({ datasource, @@ -246,7 +245,7 @@ describe(getName(), () => { }); it('clones other private registry', async () => { const { mockClone } = setupGitMocks(); - setAdminConfig({ allowCustomCrateRegistries: true }); + setAdminConfig({ ...adminConfig, allowCustomCrateRegistries: true }); const url = 'https://github.com/mcorbin/testregistry'; const res = await getPkgReleases({ datasource, @@ -260,7 +259,7 @@ describe(getName(), () => { }); it('clones once then reuses the cache', async () => { const { mockClone } = setupGitMocks(); - setAdminConfig({ allowCustomCrateRegistries: true }); + setAdminConfig({ ...adminConfig, allowCustomCrateRegistries: true }); const url = 'https://github.com/mcorbin/othertestregistry'; await getPkgReleases({ datasource, @@ -276,7 +275,7 @@ describe(getName(), () => { }); it('guards against race conditions while cloning', async () => { const { mockClone } = setupGitMocks(250); - setAdminConfig({ allowCustomCrateRegistries: true }); + setAdminConfig({ ...adminConfig, allowCustomCrateRegistries: true }); const url = 'https://github.com/mcorbin/othertestregistry'; await Promise.all([ @@ -302,7 +301,7 @@ describe(getName(), () => { }); it('returns null when git clone fails', async () => { setupErrorGitMock(); - setAdminConfig({ allowCustomCrateRegistries: true }); + setAdminConfig({ ...adminConfig, allowCustomCrateRegistries: true }); const url = 'https://github.com/mcorbin/othertestregistry'; const result = await getPkgReleases({ diff --git a/lib/manager/batect/extract.spec.ts b/lib/manager/batect/extract.spec.ts index 590e80b652333f4429395dccf6ade7d6fcbe5706..9596f4b7bb23a47de5a07764af128f9fee2821ec 100644 --- a/lib/manager/batect/extract.spec.ts +++ b/lib/manager/batect/extract.spec.ts @@ -1,9 +1,11 @@ import { getName } from '../../../test/util'; +import { setAdminConfig } from '../../config/admin'; +import type { RepoAdminConfig } from '../../config/types'; import { id as gitTagDatasource } from '../../datasource/git-tags'; import { id as dockerVersioning } from '../../versioning/docker'; import { id as semverVersioning } from '../../versioning/semver'; import { getDep } from '../dockerfile/extract'; -import type { PackageDependency } from '../types'; +import type { ExtractConfig, PackageDependency } from '../types'; import { extractAllPackageFiles } from './extract'; const fixturesDir = 'lib/manager/batect/__fixtures__'; @@ -25,22 +27,40 @@ function createGitDependency(repo: string, version: string): PackageDependency { }; } +const adminConfig: RepoAdminConfig = { + localDir: '', +}; + +const config: ExtractConfig = {}; + describe(getName(), () => { describe('extractPackageFile()', () => { + beforeEach(() => { + setAdminConfig(adminConfig); + }); + + afterEach(() => { + setAdminConfig(); + }); + it('returns empty array for empty configuration file', async () => { expect( - await extractAllPackageFiles({}, [`${fixturesDir}/empty/batect.yml`]) + await extractAllPackageFiles(config, [ + `${fixturesDir}/empty/batect.yml`, + ]) ).toEqual([]); }); it('returns empty array for non-object configuration file', async () => { expect( - await extractAllPackageFiles({}, [`${fixturesDir}/invalid/batect.yml`]) + await extractAllPackageFiles(config, [ + `${fixturesDir}/invalid/batect.yml`, + ]) ).toEqual([]); }); it('returns an a package file with no dependencies for configuration file without containers or includes', async () => { - const result = await extractAllPackageFiles({}, [ + const result = await extractAllPackageFiles(config, [ `${fixturesDir}/no-containers-or-includes/batect.yml`, ]); @@ -53,7 +73,7 @@ describe(getName(), () => { }); it('extracts all available images and bundles from a valid Batect configuration file, including dependencies in included files', async () => { - const result = await extractAllPackageFiles({}, [ + const result = await extractAllPackageFiles(config, [ `${fixturesDir}/valid/batect.yml`, ]); diff --git a/lib/manager/bundler/artifacts.spec.ts b/lib/manager/bundler/artifacts.spec.ts index 7b7ea59220cb58250b7006fdebef4298092d9422..05cf2d6ca7c56e4ecb50ee278e91d839f59e3afe 100644 --- a/lib/manager/bundler/artifacts.spec.ts +++ b/lib/manager/bundler/artifacts.spec.ts @@ -2,13 +2,15 @@ import { exec as _exec } from 'child_process'; import { join } from 'upath'; import { envMock, mockExecAll } from '../../../test/exec-util'; import { fs, git, mocked } from '../../../test/util'; +import { setAdminConfig } from '../../config/admin'; +import type { RepoAdminConfig } from '../../config/types'; import * as _datasource from '../../datasource'; import { setExecConfig } from '../../util/exec'; import { BinarySource } from '../../util/exec/common'; import * as docker from '../../util/exec/docker'; import * as _env from '../../util/exec/env'; -import { setFsConfig } from '../../util/fs'; -import { StatusResult } from '../../util/git'; +import type { StatusResult } from '../../util/git'; +import type { UpdateArtifactsConfig } from '../types'; import * as _bundlerHostRules from './host-rules'; import { updateArtifacts } from '.'; @@ -26,7 +28,13 @@ jest.mock('../../../lib/util/git'); jest.mock('../../../lib/util/host-rules'); jest.mock('./host-rules'); -let config; +const adminConfig: RepoAdminConfig = { + // `join` fixes Windows CI + localDir: join('/tmp/github/some/repo'), + cacheDir: join('/tmp/cache'), +}; + +const config: UpdateArtifactsConfig = {}; describe('bundler.updateArtifacts()', () => { beforeEach(async () => { @@ -35,18 +43,15 @@ describe('bundler.updateArtifacts()', () => { delete process.env.GEM_HOME; - config = { - // `join` fixes Windows CI - localDir: join('/tmp/github/some/repo'), - cacheDir: join('/tmp/cache'), - }; - env.getChildProcessEnv.mockReturnValue(envMock.basic); bundlerHostRules.findAllAuthenticatable.mockReturnValue([]); docker.resetPrefetchedImages(); - await setExecConfig(config); - setFsConfig(config); + await setExecConfig(adminConfig as never); + setAdminConfig(adminConfig); + }); + afterEach(() => { + setAdminConfig(); }); it('returns null by default', async () => { expect( @@ -120,8 +125,10 @@ describe('bundler.updateArtifacts()', () => { describe('Docker', () => { beforeEach(async () => { jest.spyOn(docker, 'removeDanglingContainers').mockResolvedValueOnce(); - await setExecConfig({ ...config, binarySource: BinarySource.Docker }); - setFsConfig({ ...config, binarySource: BinarySource.Docker }); + await setExecConfig({ + ...adminConfig, + binarySource: BinarySource.Docker, + }); }); it('.ruby-version', async () => { fs.readLocalFile.mockResolvedValueOnce('Current Gemfile.lock'); diff --git a/lib/manager/bundler/utils.ts b/lib/manager/bundler/utils.ts index c63546de5a34e11b70b23bbea056a93c3fd8336c..4c40aecceb6da4c07871e4e59a28bbc7c961a3da 100644 --- a/lib/manager/bundler/utils.ts +++ b/lib/manager/bundler/utils.ts @@ -1,4 +1,5 @@ import { join } from 'upath'; +import { getAdminConfig } from '../../config/admin'; import { logger } from '../../logger'; import { ensureDir } from '../../util/fs'; import type { UpdateArtifactsConfig } from '../types'; @@ -7,7 +8,7 @@ export async function getGemHome( config: UpdateArtifactsConfig ): Promise<string> { const cacheDir = - process.env.GEM_HOME || join(config.cacheDir, './others/gem'); + process.env.GEM_HOME || join(getAdminConfig().cacheDir, './others/gem'); await ensureDir(cacheDir); logger.debug(`Using gem home ${cacheDir}`); return cacheDir; diff --git a/lib/manager/cargo/artifacts.spec.ts b/lib/manager/cargo/artifacts.spec.ts index 021a9477bf4bd5776aa0bb8166b34846b9dfcee4..a2c8bf0fc32388ee90fff1ccae7296ab1debed99 100644 --- a/lib/manager/cargo/artifacts.spec.ts +++ b/lib/manager/cargo/artifacts.spec.ts @@ -3,10 +3,13 @@ import _fs from 'fs-extra'; import { join } from 'upath'; import { envMock, mockExecAll } from '../../../test/exec-util'; import { git, mocked } from '../../../test/util'; +import { setAdminConfig } from '../../config/admin'; +import type { RepoAdminConfig } from '../../config/types'; import { setExecConfig } from '../../util/exec'; import { BinarySource } from '../../util/exec/common'; import * as docker from '../../util/exec/docker'; import * as _env from '../../util/exec/env'; +import type { UpdateArtifactsConfig } from '../types'; import * as cargo from './artifacts'; jest.mock('fs-extra'); @@ -19,7 +22,9 @@ const fs: jest.Mocked<typeof _fs> = _fs as any; const exec: jest.Mock<typeof _exec> = _exec as any; const env = mocked(_env); -const config = { +const config: UpdateArtifactsConfig = {}; + +const adminConfig: RepoAdminConfig = { // `join` fixes Windows CI localDir: join('/tmp/github/some/repo'), }; @@ -30,9 +35,13 @@ describe('.updateArtifacts()', () => { jest.resetModules(); env.getChildProcessEnv.mockReturnValue(envMock.basic); - await setExecConfig(config); + await setExecConfig(adminConfig as never); + setAdminConfig(adminConfig); docker.resetPrefetchedImages(); }); + afterEach(() => { + setAdminConfig(); + }); it('returns null if no Cargo.lock found', async () => { fs.stat.mockRejectedValue(new Error('not found!')); const updatedDeps = ['dep1']; @@ -128,7 +137,7 @@ describe('.updateArtifacts()', () => { it('returns updated Cargo.lock with docker', async () => { fs.stat.mockResolvedValueOnce({ name: 'Cargo.lock' } as any); jest.spyOn(docker, 'removeDanglingContainers').mockResolvedValueOnce(); - await setExecConfig({ ...config, binarySource: BinarySource.Docker }); + await setExecConfig({ ...adminConfig, binarySource: BinarySource.Docker }); git.getFile.mockResolvedValueOnce('Old Cargo.lock'); const execSnapshots = mockExecAll(exec); fs.readFile.mockResolvedValueOnce('New Cargo.lock' as any); diff --git a/lib/manager/cargo/extract.spec.ts b/lib/manager/cargo/extract.spec.ts index 7c4db8abeb4fb88ea642847a8bc55860c1c6ad73..25cd4087e2b9eed8454bb062c66313ef9b6dc456 100644 --- a/lib/manager/cargo/extract.spec.ts +++ b/lib/manager/cargo/extract.spec.ts @@ -1,7 +1,10 @@ import { dir } from 'tmp-promise'; import { join } from 'upath'; import { getName, loadFixture } from '../../../test/util'; -import { setFsConfig, writeLocalFile } from '../../util/fs'; +import { setAdminConfig } from '../../config/admin'; +import type { RepoAdminConfig } from '../../config/types'; +import { writeLocalFile } from '../../util/fs'; +import type { ExtractConfig } from '../types'; import { extractPackageFile } from './extract'; const cargo1toml = loadFixture('Cargo.1.toml'); @@ -14,9 +17,21 @@ const cargo6toml = loadFixture('Cargo.6.toml'); describe(getName(), () => { describe('extractPackageFile()', () => { - let config; - beforeEach(() => { + let config: ExtractConfig; + let adminConfig: RepoAdminConfig; + + beforeEach(async () => { config = {}; + const tmpDir = await dir(); + adminConfig = { + localDir: join(tmpDir.path, 'local'), + cacheDir: join(tmpDir.path, 'cache'), + }; + + setAdminConfig(adminConfig); + }); + afterEach(() => { + setAdminConfig(); }); it('returns null for invalid toml', async () => { expect( @@ -67,35 +82,17 @@ describe(getName(), () => { expect(res.deps).toHaveLength(4); }); it('extracts registry urls from .cargo/config.toml', async () => { - const tmpDir = await dir(); - const localDir = join(tmpDir.path, 'local'); - const cacheDir = join(tmpDir.path, 'cache'); - setFsConfig({ - localDir, - cacheDir, - }); await writeLocalFile('.cargo/config.toml', cargo6configtoml); - const res = await extractPackageFile(cargo6toml, 'Cargo.toml', { ...config, - localDir, }); expect(res.deps).toMatchSnapshot(); expect(res.deps).toHaveLength(3); }); it('extracts registry urls from .cargo/config (legacy path)', async () => { - const tmpDir = await dir(); - const localDir = join(tmpDir.path, 'local'); - const cacheDir = join(tmpDir.path, 'cache'); - setFsConfig({ - localDir, - cacheDir, - }); await writeLocalFile('.cargo/config', cargo6configtoml); - const res = await extractPackageFile(cargo6toml, 'Cargo.toml', { ...config, - localDir, }); expect(res.deps).toMatchSnapshot(); expect(res.deps).toHaveLength(3); @@ -108,35 +105,19 @@ describe(getName(), () => { expect(res.deps).toHaveLength(1); }); it('fails to parse cargo config with invalid TOML', async () => { - const tmpDir = await dir(); - const localDir = join(tmpDir.path, 'local'); - const cacheDir = join(tmpDir.path, 'cache'); - setFsConfig({ - localDir, - cacheDir, - }); await writeLocalFile('.cargo/config', '[registries'); const res = await extractPackageFile(cargo6toml, 'Cargo.toml', { ...config, - localDir, }); expect(res.deps).toMatchSnapshot(); expect(res.deps).toHaveLength(3); }); it('ignore cargo config registries with missing index', async () => { - const tmpDir = await dir(); - const localDir = join(tmpDir.path, 'local'); - const cacheDir = join(tmpDir.path, 'cache'); - setFsConfig({ - localDir, - cacheDir, - }); await writeLocalFile('.cargo/config', '[registries.mine]\nfoo = "bar"'); const res = await extractPackageFile(cargo6toml, 'Cargo.toml', { ...config, - localDir, }); expect(res.deps).toMatchSnapshot(); expect(res.deps).toHaveLength(3); diff --git a/lib/manager/cocoapods/artifacts.spec.ts b/lib/manager/cocoapods/artifacts.spec.ts index 42013554b3d33ac064632789faafa2bf5e974a74..2944f67e22553af8fe0c5ac5d6b8ad26c10cf239 100644 --- a/lib/manager/cocoapods/artifacts.spec.ts +++ b/lib/manager/cocoapods/artifacts.spec.ts @@ -3,11 +3,14 @@ import _fs from 'fs-extra'; import { join } from 'upath'; import { envMock, mockExecAll } from '../../../test/exec-util'; import { git, mocked } from '../../../test/util'; +import { setAdminConfig } from '../../config/admin'; +import type { RepoAdminConfig } from '../../config/types'; import * as _datasource from '../../datasource'; import { setExecConfig } from '../../util/exec'; import { BinarySource } from '../../util/exec/common'; import * as _env from '../../util/exec/env'; -import { StatusResult } from '../../util/git'; +import type { StatusResult } from '../../util/git'; +import type { UpdateArtifactsConfig } from '../types'; import { updateArtifacts } from '.'; jest.mock('fs-extra'); @@ -24,7 +27,9 @@ const datasource = mocked(_datasource); delete process.env.CP_HOME_DIR; -const config = { +const config: UpdateArtifactsConfig = {}; + +const adminConfig: RepoAdminConfig = { localDir: join('/tmp/github/some/repo'), cacheDir: join('/tmp/cache'), }; @@ -33,7 +38,9 @@ describe('.updateArtifacts()', () => { beforeEach(async () => { jest.resetAllMocks(); env.getChildProcessEnv.mockReturnValue(envMock.basic); - await setExecConfig(config); + + await setExecConfig(adminConfig as never); + setAdminConfig(adminConfig); datasource.getPkgReleases.mockResolvedValue({ releases: [ @@ -46,6 +53,9 @@ describe('.updateArtifacts()', () => { ], }); }); + afterEach(() => { + setAdminConfig(); + }); it('returns null if no Podfile.lock found', async () => { const execSnapshots = mockExecAll(exec); expect( @@ -72,15 +82,16 @@ describe('.updateArtifacts()', () => { }); it('returns null for invalid local directory', async () => { const execSnapshots = mockExecAll(exec); - const noLocalDirConfig = { - localDir: undefined, - }; + setAdminConfig({ + localDir: '', + }); + expect( await updateArtifacts({ packageFileName: 'Podfile', updatedDeps: ['foo'], newPackageFileContent: '', - config: noLocalDirConfig, + config: {}, }) ).toBeNull(); expect(execSnapshots).toMatchSnapshot(); @@ -116,7 +127,7 @@ describe('.updateArtifacts()', () => { }); it('returns updated Podfile', async () => { const execSnapshots = mockExecAll(exec); - await setExecConfig({ ...config, binarySource: BinarySource.Docker }); + await setExecConfig({ ...adminConfig, binarySource: BinarySource.Docker }); fs.readFile.mockResolvedValueOnce('Old Podfile' as any); git.getRepoStatus.mockResolvedValueOnce({ modified: ['Podfile.lock'], @@ -134,7 +145,7 @@ describe('.updateArtifacts()', () => { }); it('returns updated Podfile and Pods files', async () => { const execSnapshots = mockExecAll(exec); - await setExecConfig({ ...config, binarySource: BinarySource.Docker }); + await setExecConfig({ ...adminConfig, binarySource: BinarySource.Docker }); fs.readFile.mockResolvedValueOnce('Old Manifest.lock' as any); fs.readFile.mockResolvedValueOnce('New Podfile' as any); fs.readFile.mockResolvedValueOnce('Pods manifest' as any); @@ -187,10 +198,7 @@ describe('.updateArtifacts()', () => { it('dynamically selects Docker image tag', async () => { const execSnapshots = mockExecAll(exec); - await setExecConfig({ - ...config, - binarySource: 'docker', - }); + await setExecConfig({ ...adminConfig, binarySource: BinarySource.Docker }); fs.readFile.mockResolvedValueOnce('COCOAPODS: 1.2.4' as any); @@ -211,10 +219,7 @@ describe('.updateArtifacts()', () => { it('falls back to the `latest` Docker image tag', async () => { const execSnapshots = mockExecAll(exec); - await setExecConfig({ - ...config, - binarySource: 'docker', - }); + await setExecConfig({ ...adminConfig, binarySource: BinarySource.Docker }); fs.readFile.mockResolvedValueOnce('COCOAPODS: 1.2.4' as any); datasource.getPkgReleases.mockResolvedValueOnce({ diff --git a/lib/manager/cocoapods/extract.spec.ts b/lib/manager/cocoapods/extract.spec.ts index fc8e923e14478d5f59dc06f31611938445348674..6ae2c5c64900ad3e17698b5e16d1a990bc882a32 100644 --- a/lib/manager/cocoapods/extract.spec.ts +++ b/lib/manager/cocoapods/extract.spec.ts @@ -1,12 +1,19 @@ import { getName, loadFixture } from '../../../test/util'; +import { setAdminConfig } from '../../config/admin'; +import type { RepoAdminConfig } from '../../config/types'; import { extractPackageFile } from '.'; const simplePodfile = loadFixture('Podfile.simple'); const complexPodfile = loadFixture('Podfile.complex'); +const adminConfig: RepoAdminConfig = { + localDir: '', +}; + describe(getName(), () => { describe('extractPackageFile()', () => { it('extracts all dependencies', async () => { + setAdminConfig(adminConfig); const simpleResult = (await extractPackageFile(simplePodfile, 'Podfile')) .deps; expect(simpleResult).toMatchSnapshot(); diff --git a/lib/manager/cocoapods/utils.ts b/lib/manager/cocoapods/utils.ts index c393af56d85983d7f723c5a04b74b5abb56aed80..e3a9af3b599faf09a7b46a3d86ff5fdd6207ba6d 100644 --- a/lib/manager/cocoapods/utils.ts +++ b/lib/manager/cocoapods/utils.ts @@ -1,4 +1,5 @@ import { join } from 'upath'; +import { getAdminConfig } from '../../config/admin'; import { logger } from '../../logger'; import { ensureDir } from '../../util/fs'; import type { UpdateArtifactsConfig } from '../types'; @@ -6,8 +7,9 @@ import type { UpdateArtifactsConfig } from '../types'; export async function getCocoaPodsHome( config: UpdateArtifactsConfig ): Promise<string> { + const adminCacheDir = getAdminConfig().cacheDir; const cacheDir = - process.env.CP_HOME_DIR || join(config.cacheDir, './others/cocoapods'); + process.env.CP_HOME_DIR || join(adminCacheDir, './others/cocoapods'); await ensureDir(cacheDir); logger.debug(`Using cocoapods home ${cacheDir}`); return cacheDir; diff --git a/lib/manager/composer/artifacts.spec.ts b/lib/manager/composer/artifacts.spec.ts index a9082620ad8523b59896338ddc4e0b80f3ba82e4..23218407a9d28f8e5f4da269697319ef68644191 100644 --- a/lib/manager/composer/artifacts.spec.ts +++ b/lib/manager/composer/artifacts.spec.ts @@ -3,6 +3,7 @@ import { join } from 'upath'; import { envMock, mockExecAll } from '../../../test/exec-util'; import { env, fs, git, mocked, partial } from '../../../test/util'; import { setAdminConfig } from '../../config/admin'; +import type { RepoAdminConfig } from '../../config/types'; import { PLATFORM_TYPE_GITHUB, PLATFORM_TYPE_GITLAB, @@ -12,9 +13,9 @@ import * as datasourcePackagist from '../../datasource/packagist'; import { setExecConfig } from '../../util/exec'; import { BinarySource } from '../../util/exec/common'; import * as docker from '../../util/exec/docker'; -import { setFsConfig } from '../../util/fs'; -import { StatusResult } from '../../util/git'; +import type { StatusResult } from '../../util/git'; import * as hostRules from '../../util/host-rules'; +import type { UpdateArtifactsConfig } from '../types'; import * as composer from './artifacts'; jest.mock('child_process'); @@ -26,12 +27,16 @@ jest.mock('../../util/git'); const exec: jest.Mock<typeof _exec> = _exec as any; const datasource = mocked(_datasource); -const config = { +const config: UpdateArtifactsConfig = { + composerIgnorePlatformReqs: true, + ignoreScripts: false, +}; + +const adminConfig: RepoAdminConfig = { + allowScripts: false, // `join` fixes Windows CI localDir: join('/tmp/github/some/repo'), cacheDir: join('/tmp/renovate/cache'), - composerIgnorePlatformReqs: true, - ignoreScripts: false, }; const repoStatus = partial<StatusResult>({ @@ -45,11 +50,13 @@ describe('.updateArtifacts()', () => { jest.resetAllMocks(); jest.resetModules(); env.getChildProcessEnv.mockReturnValue(envMock.basic); - await setExecConfig(config); - setFsConfig(config); + await setExecConfig(adminConfig as never); docker.resetPrefetchedImages(); hostRules.clear(); - setAdminConfig({ allowScripts: false }); + setAdminConfig(adminConfig); + }); + afterEach(() => { + setAdminConfig(); }); it('returns if no composer.lock found', async () => { expect( @@ -66,7 +73,7 @@ describe('.updateArtifacts()', () => { const execSnapshots = mockExecAll(exec); fs.readLocalFile.mockReturnValueOnce('Current composer.lock' as any); git.getRepoStatus.mockResolvedValue(repoStatus); - setAdminConfig({ allowScripts: true }); + setAdminConfig({ ...adminConfig, allowScripts: true }); expect( await composer.updateArtifacts({ packageFileName: 'composer.json', @@ -196,8 +203,7 @@ describe('.updateArtifacts()', () => { }); it('supports docker mode', async () => { jest.spyOn(docker, 'removeDanglingContainers').mockResolvedValueOnce(); - await setExecConfig({ ...config, binarySource: BinarySource.Docker }); - setFsConfig({ ...config, binarySource: BinarySource.Docker }); + await setExecConfig({ ...adminConfig, binarySource: BinarySource.Docker }); fs.readLocalFile.mockResolvedValueOnce('Current composer.lock' as any); const execSnapshots = mockExecAll(exec); diff --git a/lib/manager/composer/artifacts.ts b/lib/manager/composer/artifacts.ts index ed430b707b6c67257cbc5e71c33a868221f45f56..f67f3e2b6398ef05193d683ac936cd5aa33a15ae 100644 --- a/lib/manager/composer/artifacts.ts +++ b/lib/manager/composer/artifacts.ts @@ -77,9 +77,10 @@ export async function updateArtifacts({ }: UpdateArtifact): Promise<UpdateArtifactsResult[] | null> { logger.debug(`composer.updateArtifacts(${packageFileName})`); + const { allowScripts, cacheDir: adminCacheDir } = getAdminConfig(); const cacheDir = process.env.COMPOSER_CACHE_DIR || - upath.join(config.cacheDir, './others/composer'); + upath.join(adminCacheDir, './others/composer'); await ensureDir(cacheDir); logger.debug(`Using composer cache ${cacheDir}`); @@ -124,7 +125,7 @@ export async function updateArtifacts({ args += ' --ignore-platform-reqs'; } args += ' --no-ansi --no-interaction'; - if (!getAdminConfig().allowScripts || config.ignoreScripts) { + if (!allowScripts || config.ignoreScripts) { args += ' --no-scripts --no-autoloader'; } logger.debug({ cmd, args }, 'composer command'); diff --git a/lib/manager/git-submodules/extract.spec.ts b/lib/manager/git-submodules/extract.spec.ts index c277c84667ef9b313c2d66b53e1b8a6c10f4b1d6..89d28264607406f46f7314a8b7cc9d973ce841a9 100644 --- a/lib/manager/git-submodules/extract.spec.ts +++ b/lib/manager/git-submodules/extract.spec.ts @@ -1,6 +1,7 @@ import { mock } from 'jest-mock-extended'; import _simpleGit, { Response, SimpleGit } from 'simple-git'; import { getName, partial } from '../../../test/util'; +import { setAdminConfig } from '../../config/admin'; import * as hostRules from '../../util/host-rules'; import type { PackageFile } from '../types'; import extractPackageFile from './extract'; @@ -9,8 +10,6 @@ jest.mock('simple-git'); const simpleGit: jest.Mock<Partial<SimpleGit>> = _simpleGit as never; const Git: typeof _simpleGit = jest.requireActual('simple-git'); -const localDir = `${__dirname}/__fixtures__`; - describe(getName(), () => { // flaky ci tests jest.setTimeout(10 * 1000); @@ -45,19 +44,18 @@ describe(getName(), () => { }); describe('extractPackageFile()', () => { it('extracts submodules', async () => { + setAdminConfig({ localDir: `${__dirname}/__fixtures__` }); hostRules.add({ matchHost: 'github.com', token: 'abc123' }); let res: PackageFile; - expect( - await extractPackageFile('', '.gitmodules.1', { localDir }) - ).toBeNull(); - res = await extractPackageFile('', '.gitmodules.2', { localDir }); + expect(await extractPackageFile('', '.gitmodules.1', {})).toBeNull(); + res = await extractPackageFile('', '.gitmodules.2', {}); expect(res.deps).toHaveLength(1); expect(res.deps[0].currentValue).toEqual('main'); - res = await extractPackageFile('', '.gitmodules.3', { localDir }); + res = await extractPackageFile('', '.gitmodules.3', {}); expect(res.deps).toHaveLength(1); - res = await extractPackageFile('', '.gitmodules.4', { localDir }); + res = await extractPackageFile('', '.gitmodules.4', {}); expect(res.deps).toHaveLength(1); - res = await extractPackageFile('', '.gitmodules.5', { localDir }); + res = await extractPackageFile('', '.gitmodules.5', {}); expect(res.deps).toHaveLength(3); expect(res.deps[2].lookupName).toEqual( 'https://github.com/renovatebot/renovate-config.git' diff --git a/lib/manager/git-submodules/extract.ts b/lib/manager/git-submodules/extract.ts index ac41b7f6b7cf52d935c21b36d37bffb1a51106e2..ce01daf9c79ce519ac9cc78142294e82a262db55 100644 --- a/lib/manager/git-submodules/extract.ts +++ b/lib/manager/git-submodules/extract.ts @@ -1,6 +1,7 @@ import URL from 'url'; import Git, { SimpleGit } from 'simple-git'; import upath from 'upath'; +import { getAdminConfig } from '../../config/admin'; import * as datasourceGitRefs from '../../datasource/git-refs'; import { logger } from '../../logger'; import { getHttpUrl, getRemoteUrlWithToken } from '../../util/git/url'; @@ -87,8 +88,9 @@ export default async function extractPackageFile( fileName: string, config: ManagerConfig ): Promise<PackageFile | null> { - const git = Git(config.localDir); - const gitModulesPath = upath.join(config.localDir, fileName); + const { localDir } = getAdminConfig(); + const git = Git(localDir); + const gitModulesPath = upath.join(localDir, fileName); const depNames = await getModules(git, gitModulesPath); diff --git a/lib/manager/git-submodules/update.spec.ts b/lib/manager/git-submodules/update.spec.ts index 4b239cead696d07cf46b1018691f830694508f36..9887e7ceb89c07968ccc8a5c29217fa1614a1001 100644 --- a/lib/manager/git-submodules/update.spec.ts +++ b/lib/manager/git-submodules/update.spec.ts @@ -1,6 +1,9 @@ import _simpleGit from 'simple-git'; import { dir } from 'tmp-promise'; +import { join } from 'upath'; import { getName } from '../../../test/util'; +import { setAdminConfig } from '../../config/admin'; +import type { RepoAdminConfig } from '../../config/types'; import type { Upgrade } from '../types'; import updateDependency from './update'; @@ -10,9 +13,16 @@ const simpleGit: any = _simpleGit; describe(getName(), () => { describe('updateDependency', () => { let upgrade: Upgrade; + let adminConfig: RepoAdminConfig; beforeAll(async () => { + upgrade = { depName: 'renovate' }; + const tmpDir = await dir(); - upgrade = { localDir: tmpDir.path, depName: 'renovate' }; + adminConfig = { localDir: join(tmpDir.path) }; + setAdminConfig(adminConfig); + }); + afterAll(() => { + setAdminConfig(); }); it('returns null on error', async () => { simpleGit.mockReturnValue({ diff --git a/lib/manager/git-submodules/update.ts b/lib/manager/git-submodules/update.ts index a62933fd64c9cb045794ab057b8078b64949b572..da05a5ae460d19454a2060cc0f4c1c2c2bb2c149 100644 --- a/lib/manager/git-submodules/update.ts +++ b/lib/manager/git-submodules/update.ts @@ -1,5 +1,6 @@ import Git from 'simple-git'; import upath from 'upath'; +import { getAdminConfig } from '../../config/admin'; import { logger } from '../../logger'; import type { UpdateDependencyConfig } from '../types'; @@ -7,8 +8,9 @@ export default async function updateDependency({ fileContent, upgrade, }: UpdateDependencyConfig): Promise<string | null> { - const git = Git(upgrade.localDir); - const submoduleGit = Git(upath.join(upgrade.localDir, upgrade.depName)); + const { localDir } = getAdminConfig(); + const git = Git(localDir); + const submoduleGit = Git(upath.join(localDir, upgrade.depName)); try { await git.submoduleUpdate(['--init', upgrade.depName]); diff --git a/lib/manager/gitlabci/extract.spec.ts b/lib/manager/gitlabci/extract.spec.ts index d739dcaae0329bf7667c718680137f0811281eda..ae3f1f30765e569cf1f3e3c17bf76c790fedaabb 100644 --- a/lib/manager/gitlabci/extract.spec.ts +++ b/lib/manager/gitlabci/extract.spec.ts @@ -1,19 +1,33 @@ import { getName, logger } from '../../../test/util'; -import type { PackageDependency } from '../types'; +import { setAdminConfig } from '../../config/admin'; +import type { RepoAdminConfig } from '../../config/types'; +import type { ExtractConfig, PackageDependency } from '../types'; import { extractAllPackageFiles } from './extract'; +const config: ExtractConfig = {}; + +const adminConfig: RepoAdminConfig = { localDir: '' }; + describe(getName(), () => { + beforeEach(() => { + setAdminConfig(adminConfig); + }); + + afterEach(() => { + setAdminConfig(); + }); + describe('extractAllPackageFiles()', () => { it('returns null for empty', async () => { expect( - await extractAllPackageFiles({}, [ + await extractAllPackageFiles(config, [ 'lib/manager/gitlabci/__fixtures__/gitlab-ci.2.yaml', ]) ).toBeNull(); }); it('extracts multiple included image lines', async () => { - const res = await extractAllPackageFiles({}, [ + const res = await extractAllPackageFiles(config, [ 'lib/manager/gitlabci/__fixtures__/gitlab-ci.3.yaml', ]); expect(res).toMatchSnapshot(); @@ -29,7 +43,7 @@ describe(getName(), () => { }); it('extracts named services', async () => { - const res = await extractAllPackageFiles({}, [ + const res = await extractAllPackageFiles(config, [ 'lib/manager/gitlabci/__fixtures__/gitlab-ci.5.yaml', ]); expect(res).toMatchSnapshot(); @@ -38,7 +52,7 @@ describe(getName(), () => { }); it('extracts multiple image lines', async () => { - const res = await extractAllPackageFiles({}, [ + const res = await extractAllPackageFiles(config, [ 'lib/manager/gitlabci/__fixtures__/gitlab-ci.yaml', ]); expect(res).toMatchSnapshot(); @@ -56,7 +70,7 @@ describe(getName(), () => { }); it('extracts multiple image lines with comments', async () => { - const res = await extractAllPackageFiles({}, [ + const res = await extractAllPackageFiles(config, [ 'lib/manager/gitlabci/__fixtures__/gitlab-ci.1.yaml', ]); expect(res).toMatchSnapshot(); @@ -72,7 +86,7 @@ describe(getName(), () => { }); it('catches errors', async () => { - const res = await extractAllPackageFiles({}, [ + const res = await extractAllPackageFiles(config, [ 'lib/manager/gitlabci/__fixtures__/gitlab-ci.4.yaml', ]); expect(res).toBeNull(); diff --git a/lib/manager/gomod/artifacts.spec.ts b/lib/manager/gomod/artifacts.spec.ts index 50e4b014d58a60519dd2bf95edf2c7e658e5436c..0d5f5db94803288170c46f37189b90102e721ee9 100644 --- a/lib/manager/gomod/artifacts.spec.ts +++ b/lib/manager/gomod/artifacts.spec.ts @@ -3,13 +3,15 @@ import _fs from 'fs-extra'; import { join } from 'upath'; import { envMock, mockExecAll } from '../../../test/exec-util'; import { git, mocked } from '../../../test/util'; +import { setAdminConfig } from '../../config/admin'; +import type { RepoAdminConfig } from '../../config/types'; import { setExecConfig } from '../../util/exec'; import { BinarySource } from '../../util/exec/common'; import * as docker from '../../util/exec/docker'; import * as _env from '../../util/exec/env'; -import { setFsConfig } from '../../util/fs'; -import { StatusResult } from '../../util/git'; +import type { StatusResult } from '../../util/git'; import * as _hostRules from '../../util/host-rules'; +import type { UpdateArtifactsConfig } from '../types'; import * as gomod from './artifacts'; jest.mock('fs-extra'); @@ -36,10 +38,13 @@ require gopkg.in/russross/blackfriday.v1 v1.0.0 replace github.com/pkg/errors => ../errors `; -const config = { +const adminConfig: RepoAdminConfig = { // `join` fixes Windows CI localDir: join('/tmp/github/some/repo'), cacheDir: join('/tmp/renovate/cache'), +}; + +const config: UpdateArtifactsConfig = { constraints: { go: '1.14' }, }; @@ -58,10 +63,13 @@ describe('.updateArtifacts()', () => { delete process.env.GOPATH; env.getChildProcessEnv.mockReturnValue({ ...envMock.basic, ...goEnv }); - await setExecConfig(config); - setFsConfig(config); + await setExecConfig(adminConfig as never); + setAdminConfig(adminConfig); docker.resetPrefetchedImages(); }); + afterEach(() => { + setAdminConfig(); + }); it('returns if no go.sum found', async () => { const execSnapshots = mockExecAll(exec); expect( @@ -147,8 +155,7 @@ describe('.updateArtifacts()', () => { }); it('supports docker mode without credentials', async () => { jest.spyOn(docker, 'removeDanglingContainers').mockResolvedValueOnce(); - await setExecConfig({ ...config, binarySource: BinarySource.Docker }); - setFsConfig({ ...config, binarySource: BinarySource.Docker }); + await setExecConfig({ ...adminConfig, binarySource: BinarySource.Docker }); fs.readFile.mockResolvedValueOnce('Current go.sum' as any); fs.readFile.mockResolvedValueOnce(null as any); // vendor modules filename const execSnapshots = mockExecAll(exec); @@ -192,8 +199,7 @@ describe('.updateArtifacts()', () => { }); it('supports docker mode with credentials', async () => { jest.spyOn(docker, 'removeDanglingContainers').mockResolvedValueOnce(); - await setExecConfig({ ...config, binarySource: BinarySource.Docker }); - setFsConfig({ ...config, binarySource: BinarySource.Docker }); + await setExecConfig({ ...adminConfig, binarySource: BinarySource.Docker }); hostRules.find.mockReturnValueOnce({ token: 'some-token', }); @@ -219,8 +225,7 @@ describe('.updateArtifacts()', () => { }); it('supports docker mode with goModTidy', async () => { jest.spyOn(docker, 'removeDanglingContainers').mockResolvedValueOnce(); - await setExecConfig({ ...config, binarySource: BinarySource.Docker }); - setFsConfig({ ...config, binarySource: BinarySource.Docker }); + await setExecConfig({ ...adminConfig, binarySource: BinarySource.Docker }); hostRules.find.mockReturnValueOnce({}); fs.readFile.mockResolvedValueOnce('Current go.sum' as any); fs.readFile.mockResolvedValueOnce(null as any); // vendor modules filename diff --git a/lib/manager/gradle-wrapper/artifacts-real.spec.ts b/lib/manager/gradle-wrapper/artifacts-real.spec.ts index befff2cee444813b836ed9d9698cd9a25745f2f3..3df946849148e16742aa2e485731e48795dab03f 100644 --- a/lib/manager/gradle-wrapper/artifacts-real.spec.ts +++ b/lib/manager/gradle-wrapper/artifacts-real.spec.ts @@ -3,17 +3,23 @@ import Git from 'simple-git'; import { resolve } from 'upath'; import * as httpMock from '../../../test/http-mock'; import { getName, git, partial } from '../../../test/util'; +import { setAdminConfig } from '../../config/admin'; +import type { RepoAdminConfig } from '../../config/types'; import { setExecConfig } from '../../util/exec'; -import { setFsConfig } from '../../util/fs'; -import { StatusResult } from '../../util/git'; +import type { StatusResult } from '../../util/git'; import { ifSystemSupportsGradle } from '../gradle/__testutil__/gradle'; +import type { UpdateArtifactsConfig } from '../types'; import * as dcUpdate from '.'; jest.mock('../../util/git'); const fixtures = resolve(__dirname, './__fixtures__'); -const config = { + +const adminConfig: RepoAdminConfig = { localDir: resolve(fixtures, './testFiles'), +}; + +const config: UpdateArtifactsConfig = { newValue: '5.6.4', }; @@ -37,14 +43,15 @@ describe(getName(), () => { beforeEach(async () => { jest.resetAllMocks(); - await setExecConfig(config); - setFsConfig(config); + await setExecConfig(adminConfig as never); + setAdminConfig(adminConfig); httpMock.setup(); }); afterEach(async () => { await Git(fixtures).checkout(['HEAD', '--', '.']); httpMock.reset(); + setAdminConfig(); }); it('replaces existing value', async () => { @@ -160,17 +167,20 @@ describe(getName(), () => { }); it('gradlew failed', async () => { - const cfg = { ...config, localDir: resolve(fixtures, './wrongCmd') }; + const wrongCmdConfig = { + ...adminConfig, + localDir: resolve(fixtures, './wrongCmd'), + }; - await setExecConfig(cfg); - setFsConfig(cfg); + await setExecConfig(wrongCmdConfig); + setAdminConfig(wrongCmdConfig); const res = await dcUpdate.updateArtifacts({ packageFileName: 'gradle/wrapper/gradle-wrapper.properties', updatedDeps: [], newPackageFileContent: await readString( `./testFiles/gradle/wrapper/gradle-wrapper.properties` ), - config: cfg, + config, }); expect(res[0].artifactError.lockFile).toEqual( @@ -186,13 +196,12 @@ describe(getName(), () => { }); it('gradlew not found', async () => { + setAdminConfig({ localDir: 'some-dir' }); const res = await dcUpdate.updateArtifacts({ packageFileName: 'gradle-wrapper.properties', updatedDeps: [], newPackageFileContent: undefined, - config: { - localDir: 'some-dir', - }, + config: {}, }); expect(res).toBeNull(); @@ -234,7 +243,7 @@ describe(getName(), () => { expect( await readString( - config.localDir, + adminConfig.localDir, `./gradle/wrapper/gradle-wrapper.properties` ) ).toEqual(newContent); diff --git a/lib/manager/gradle-wrapper/artifacts.spec.ts b/lib/manager/gradle-wrapper/artifacts.spec.ts index 178960701efacf2496f1ab6d17de46ac65c18bcb..16f92f1dd04732d6a7243b077eabf6e897a7fc9c 100644 --- a/lib/manager/gradle-wrapper/artifacts.spec.ts +++ b/lib/manager/gradle-wrapper/artifacts.spec.ts @@ -12,11 +12,13 @@ import { git, partial, } from '../../../test/util'; +import { setAdminConfig } from '../../config/admin'; +import type { RepoAdminConfig } from '../../config/types'; import { setExecConfig } from '../../util/exec'; import { BinarySource } from '../../util/exec/common'; import { resetPrefetchedImages } from '../../util/exec/docker'; -import { setFsConfig } from '../../util/fs'; -import { StatusResult } from '../../util/git'; +import type { StatusResult } from '../../util/git'; +import type { UpdateArtifactsConfig } from '../types'; import * as dcUpdate from '.'; jest.mock('child_process'); @@ -26,11 +28,16 @@ jest.mock('../../util/exec/env'); const exec: jest.Mock<typeof _exec> = _exec as any; const fixtures = resolve(__dirname, './__fixtures__'); -const config = { + +const adminConfig: RepoAdminConfig = { localDir: resolve(fixtures, './testFiles'), +}; + +const dockerAdminConfig = { ...adminConfig, binarySource: BinarySource.Docker }; + +const config: UpdateArtifactsConfig = { newValue: '5.6.4', }; -const dockerConfig = { ...config, binarySource: BinarySource.Docker }; addReplacingSerializer('gradlew.bat', '<gradlew>'); addReplacingSerializer('./gradlew', '<gradlew>'); @@ -50,8 +57,8 @@ describe(getName(), () => { LC_ALL: 'en_US', }); - await setExecConfig(config); - setFsConfig(config); + await setExecConfig(adminConfig as never); + setAdminConfig(adminConfig); resetPrefetchedImages(); fs.readLocalFile.mockResolvedValue('test'); @@ -59,6 +66,7 @@ describe(getName(), () => { afterEach(() => { httpMock.reset(); + setAdminConfig(); }); it('replaces existing value', async () => { @@ -97,13 +105,12 @@ describe(getName(), () => { }); it('gradlew not found', async () => { + setAdminConfig({ ...adminConfig, localDir: 'some-dir' }); const res = await dcUpdate.updateArtifacts({ packageFileName: 'gradle-wrapper.properties', updatedDeps: [], newPackageFileContent: undefined, - config: { - localDir: 'some-dir', - }, + config: {}, }); expect(res).toBeNull(); @@ -148,7 +155,10 @@ describe(getName(), () => { packageFileName: 'gradle-wrapper.properties', updatedDeps: [], newPackageFileContent: `distributionSha256Sum=336b6898b491f6334502d8074a6b8c2d73ed83b92123106bd4bf837f04111043\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-6.3-bin.zip`, - config: dockerConfig, + config: { + ...config, + ...dockerAdminConfig, + }, }); expect(result).toHaveLength(1); diff --git a/lib/manager/gradle-wrapper/artifacts.ts b/lib/manager/gradle-wrapper/artifacts.ts index e6f4ddcf5f20dffe0a803782b155d1e8e0a7f689..e377604b26d4c9673f00099cc9035ff22b1727ac 100644 --- a/lib/manager/gradle-wrapper/artifacts.ts +++ b/lib/manager/gradle-wrapper/artifacts.ts @@ -1,5 +1,6 @@ import { stat } from 'fs-extra'; import { resolve } from 'upath'; +import { getAdminConfig } from '../../config/admin'; import { TEMPORARY_ERROR } from '../../constants/error-messages'; import { logger } from '../../logger'; import { ExecOptions, exec } from '../../util/exec'; @@ -54,7 +55,7 @@ export async function updateArtifacts({ config, }: UpdateArtifact): Promise<UpdateArtifactsResult[] | null> { try { - const projectDir = config.localDir; + const { localDir: projectDir } = getAdminConfig(); logger.debug({ updatedDeps }, 'gradle-wrapper.updateArtifacts()'); const gradlew = gradleWrapperFileName(config); const gradlewPath = resolve(projectDir, `./${gradlew}`); diff --git a/lib/manager/gradle/index-real.spec.ts b/lib/manager/gradle/index-real.spec.ts index 5643b0c05199a1fbbe55204493ffad67d3e1e406..0b126bff9b398a56242cb6b211643c81a646d21d 100644 --- a/lib/manager/gradle/index-real.spec.ts +++ b/lib/manager/gradle/index-real.spec.ts @@ -1,6 +1,8 @@ import fsExtra from 'fs-extra'; import tmp, { DirectoryResult } from 'tmp-promise'; import { getName } from '../../../test/util'; +import { setAdminConfig } from '../../config/admin'; +import type { RepoAdminConfig } from '../../config/types'; import type { ExtractConfig } from '../types'; import { ifSystemSupportsGradle } from './__testutil__/gradle'; import * as manager from '.'; @@ -19,11 +21,14 @@ describe(getName(), () => { let workingDir: DirectoryResult; let testRunConfig: ExtractConfig; let successFile: string; + let adminConfig: RepoAdminConfig; beforeEach(async () => { workingDir = await tmp.dir({ unsafeCleanup: true }); successFile = ''; - testRunConfig = { ...baseConfig, localDir: workingDir.path }; + adminConfig = { localDir: workingDir.path }; + setAdminConfig(adminConfig); + testRunConfig = { ...baseConfig }; await fsExtra.copy(`${fixtures}/minimal-project`, workingDir.path); await fsExtra.copy(`${fixtures}/gradle-wrappers/6`, workingDir.path); @@ -42,6 +47,10 @@ allprojects { successFile = `${workingDir.path}/${SUCCESS_FILE_NAME}`; }); + afterEach(() => { + setAdminConfig(); + }); + it('executes an executable gradle wrapper', async () => { const gradlew = await fsExtra.stat(`${workingDir.path}/gradlew`); await manager.executeGradle(testRunConfig, workingDir.path, gradlew); diff --git a/lib/manager/gradle/index.spec.ts b/lib/manager/gradle/index.spec.ts index c2c1712047e788c8a7985899438c3ada894f5d99..7171b2ac817aa2b474bda45f4d1857d32f1deb50 100644 --- a/lib/manager/gradle/index.spec.ts +++ b/lib/manager/gradle/index.spec.ts @@ -10,11 +10,13 @@ import { loadFixture, mocked, } from '../../../test/util'; +import { setAdminConfig } from '../../config/admin'; +import type { RepoAdminConfig } from '../../config/types'; import { setExecConfig } from '../../util/exec'; import { BinarySource } from '../../util/exec/common'; import * as docker from '../../util/exec/docker'; import * as _env from '../../util/exec/env'; -import { setFsConfig } from '../../util/fs'; +import type { ExtractConfig } from '../types'; import { extractAllPackageFiles, updateDependency } from '.'; jest.mock('child_process'); @@ -26,17 +28,21 @@ const fs = mocked(_fs); jest.mock('../../util/exec/env'); const env = mocked(_env); +const adminConfig: RepoAdminConfig = { + localDir: join('/foo/bar'), +}; + +const dockerAdminConfig = { + ...adminConfig, + binarySource: BinarySource.Docker, +}; + const gradleOutput = { stdout: 'gradle output', stderr: '', }; -const utilConfig = { - localDir: join('/foo/bar'), -}; - -const config = { - ...utilConfig, +const config: ExtractConfig = { gradle: { timeout: 60, }, @@ -83,8 +89,12 @@ describe(getName(), () => { } beforeAll(async () => { - await setExecConfig(utilConfig); - setFsConfig(utilConfig); + await setExecConfig(adminConfig as never); + setAdminConfig(adminConfig); + }); + + afterAll(() => { + setAdminConfig(); }); beforeEach(() => { @@ -205,9 +215,8 @@ describe(getName(), () => { }); it('should use docker if required', async () => { - const dockerConfig = { ...config, binarySource: BinarySource.Docker }; jest.spyOn(docker, 'removeDanglingContainers').mockResolvedValueOnce(); - await setExecConfig(dockerConfig); + await setExecConfig(dockerAdminConfig); const execSnapshots = setupMocks({ wrapperFilename: null }); const dependencies = await extractAllPackageFiles(config, [ 'build.gradle', @@ -217,9 +226,8 @@ describe(getName(), () => { }); it('should use docker even if gradlew is available', async () => { - const dockerConfig = { ...config, binarySource: BinarySource.Docker }; jest.spyOn(docker, 'removeDanglingContainers').mockResolvedValueOnce(); - await setExecConfig(dockerConfig); + await setExecConfig(dockerAdminConfig); const execSnapshots = setupMocks(); const dependencies = await extractAllPackageFiles(config, [ 'build.gradle', @@ -229,9 +237,8 @@ describe(getName(), () => { }); it('should use docker even if gradlew.bat is available on Windows', async () => { - const dockerConfig = { ...config, binarySource: BinarySource.Docker }; jest.spyOn(docker, 'removeDanglingContainers').mockResolvedValueOnce(); - await setExecConfig(dockerConfig); + await setExecConfig(dockerAdminConfig); jest.spyOn(os, 'platform').mockReturnValueOnce('win32'); const execSnapshots = setupMocks({ wrapperFilename: 'gradlew.bat' }); const dependencies = await extractAllPackageFiles(config, [ diff --git a/lib/manager/gradle/index.ts b/lib/manager/gradle/index.ts index c83bf3d78383c9b494deb2929bac46700c920c87..a463bb45e5d8b3f884a28671d8ea535964616666 100644 --- a/lib/manager/gradle/index.ts +++ b/lib/manager/gradle/index.ts @@ -1,6 +1,7 @@ import { Stats } from 'fs'; import { stat } from 'fs-extra'; import upath from 'upath'; +import { getAdminConfig } from '../../config/admin'; import { TEMPORARY_ERROR } from '../../constants/error-messages'; import { LANGUAGE_JAVA } from '../../constants/languages'; import * as datasourceMaven from '../../datasource/maven'; @@ -92,12 +93,11 @@ export async function extractAllPackageFiles( ): Promise<PackageFile[] | null> { let rootBuildGradle: string | undefined; let gradlew: Stats | null; + const { localDir } = getAdminConfig(); for (const packageFile of packageFiles) { const dirname = upath.dirname(packageFile); const gradlewPath = upath.join(dirname, gradleWrapperFileName(config)); - gradlew = await stat(upath.join(config.localDir, gradlewPath)).catch( - () => null - ); + gradlew = await stat(upath.join(localDir, gradlewPath)).catch(() => null); if (['build.gradle', 'build.gradle.kts'].includes(packageFile)) { rootBuildGradle = packageFile; @@ -116,7 +116,7 @@ export async function extractAllPackageFiles( } logger.debug('Extracting dependencies from all gradle files'); - const cwd = upath.join(config.localDir, upath.dirname(rootBuildGradle)); + const cwd = upath.join(localDir, upath.dirname(rootBuildGradle)); await createRenovateGradlePlugin(cwd); await executeGradle(config, cwd, gradlew); diff --git a/lib/manager/helmv3/artifacts.spec.ts b/lib/manager/helmv3/artifacts.spec.ts index 506d17a6cdb4bae9527ed6dcbea15b76275b2c41..0fcb69da2be1ecec0ff21cd8c03db16d3bbda722 100644 --- a/lib/manager/helmv3/artifacts.spec.ts +++ b/lib/manager/helmv3/artifacts.spec.ts @@ -3,10 +3,13 @@ import _fs from 'fs-extra'; import { join } from 'upath'; import { envMock, mockExecAll } from '../../../test/exec-util'; import { git, mocked } from '../../../test/util'; +import { setAdminConfig } from '../../config/admin'; +import type { RepoAdminConfig } from '../../config/types'; import { setExecConfig } from '../../util/exec'; import { BinarySource } from '../../util/exec/common'; import * as docker from '../../util/exec/docker'; import * as _env from '../../util/exec/env'; +import type { UpdateArtifactsConfig } from '../types'; import * as helmv3 from './artifacts'; jest.mock('fs-extra'); @@ -19,20 +22,25 @@ const fs: jest.Mocked<typeof _fs> = _fs as any; const exec: jest.Mock<typeof _exec> = _exec as any; const env = mocked(_env); -const config = { - // `join` fixes Windows CI - localDir: join('/tmp/github/some/repo'), +const adminConfig: RepoAdminConfig = { + localDir: join('/tmp/github/some/repo'), // `join` fixes Windows CI }; +const config: UpdateArtifactsConfig = {}; + describe('.updateArtifacts()', () => { beforeEach(async () => { jest.resetAllMocks(); jest.resetModules(); env.getChildProcessEnv.mockReturnValue(envMock.basic); - await setExecConfig(config); + await setExecConfig(adminConfig as never); + setAdminConfig(adminConfig); docker.resetPrefetchedImages(); }); + afterEach(() => { + setAdminConfig(); + }); it('returns null if no Chart.lock found', async () => { const updatedDeps = ['dep1']; expect( @@ -102,7 +110,7 @@ describe('.updateArtifacts()', () => { it('returns updated Chart.lock with docker', async () => { jest.spyOn(docker, 'removeDanglingContainers').mockResolvedValueOnce(); - await setExecConfig({ ...config, binarySource: BinarySource.Docker }); + await setExecConfig({ ...adminConfig, binarySource: BinarySource.Docker }); git.getFile.mockResolvedValueOnce('Old Chart.lock'); const execSnapshots = mockExecAll(exec); fs.readFile.mockResolvedValueOnce('New Chart.lock' as any); diff --git a/lib/manager/mix/artifacts.spec.ts b/lib/manager/mix/artifacts.spec.ts index 84f1fa93f8db0f462af496537a856d6ca17c13ab..16824a564bb1c739d254fdb1555d32c85fe1bed8 100644 --- a/lib/manager/mix/artifacts.spec.ts +++ b/lib/manager/mix/artifacts.spec.ts @@ -1,27 +1,37 @@ import { join } from 'upath'; import { envMock, exec, mockExecAll } from '../../../test/exec-util'; import { env, fs, getName } from '../../../test/util'; +import { setAdminConfig } from '../../config/admin'; +import type { RepoAdminConfig } from '../../config/types'; import { setExecConfig } from '../../util/exec'; import { BinarySource } from '../../util/exec/common'; import * as docker from '../../util/exec/docker'; +import type { UpdateArtifactsConfig } from '../types'; import { updateArtifacts } from '.'; jest.mock('child_process'); jest.mock('../../util/exec/env'); jest.mock('../../util/fs'); -const config = { +const adminConfig: RepoAdminConfig = { // `join` fixes Windows CI localDir: join('/tmp/github/some/repo'), }; +const config: UpdateArtifactsConfig = {}; + describe(getName(), () => { beforeEach(async () => { jest.resetAllMocks(); jest.resetModules(); env.getChildProcessEnv.mockReturnValue(envMock.basic); - await setExecConfig(config); + await setExecConfig(adminConfig as never); + setAdminConfig(adminConfig); + }); + + afterEach(() => { + setAdminConfig(); }); it('returns null if no mix.lock found', async () => { @@ -74,10 +84,7 @@ describe(getName(), () => { it('returns updated mix.lock', async () => { jest.spyOn(docker, 'removeDanglingContainers').mockResolvedValueOnce(); - await setExecConfig({ - ...config, - binarySource: BinarySource.Docker, - }); + await setExecConfig({ ...adminConfig, binarySource: BinarySource.Docker }); fs.readLocalFile.mockResolvedValueOnce('Old mix.lock'); const execSnapshots = mockExecAll(exec); fs.readLocalFile.mockResolvedValueOnce('New mix.lock'); diff --git a/lib/manager/mix/extract.spec.ts b/lib/manager/mix/extract.spec.ts index 4c3050b92ef45ec086fbbd448ccdd718e270be01..0a452b6d3909653b0a814e02a5ff3a7f9f9e8094 100644 --- a/lib/manager/mix/extract.spec.ts +++ b/lib/manager/mix/extract.spec.ts @@ -1,9 +1,14 @@ import { getName, loadFixture } from '../../../test/util'; +import { setAdminConfig } from '../../config/admin'; import { extractPackageFile } from '.'; const sample = loadFixture('mix.exs'); describe(getName(), () => { + beforeEach(() => { + setAdminConfig({ localDir: '' }); + }); + describe('extractPackageFile()', () => { it('returns empty for invalid dependency file', async () => { expect( diff --git a/lib/manager/npm/post-update/index.ts b/lib/manager/npm/post-update/index.ts index 0be43d8b51b76dabf9b3746f647fd03ed65c160b..ec10665961747fe23597e310f6fec0918efbba58 100644 --- a/lib/manager/npm/post-update/index.ts +++ b/lib/manager/npm/post-update/index.ts @@ -1,6 +1,7 @@ import is from '@sindresorhus/is'; import { parseSyml } from '@yarnpkg/parsers'; import upath from 'upath'; +import { getAdminConfig } from '../../../config/admin'; import { SYSTEM_INSUFFICIENT_DISK_SPACE } from '../../../constants/error-messages'; import { id as npmId } from '../../../datasource/npm'; import { logger } from '../../../logger'; @@ -133,9 +134,10 @@ export async function writeExistingFiles( { packageFiles: npmFiles.map((n) => n.packageFile) }, 'Writing package.json files' ); + const { localDir } = getAdminConfig(); for (const packageFile of npmFiles) { const basedir = upath.join( - config.localDir, + localDir, upath.dirname(packageFile.packageFile) ); const npmrc: string = packageFile.npmrc || config.npmrc; @@ -163,7 +165,7 @@ export async function writeExistingFiles( } const { npmLock } = packageFile; if (npmLock) { - const npmLockPath = upath.join(config.localDir, npmLock); + const npmLockPath = upath.join(localDir, npmLock); if ( process.env.RENOVATE_REUSE_PACKAGE_LOCK === 'false' || config.reuseLockFiles === false @@ -225,11 +227,12 @@ export async function writeUpdatedPackageFiles( logger.debug('No files found'); return; } + const { localDir } = getAdminConfig(); for (const packageFile of config.updatedPackageFiles) { if (packageFile.name.endsWith('package-lock.json')) { logger.debug(`Writing package-lock file: ${packageFile.name}`); await outputFile( - upath.join(config.localDir, packageFile.name), + upath.join(localDir, packageFile.name), packageFile.contents ); continue; // eslint-disable-line @@ -258,7 +261,7 @@ export async function writeUpdatedPackageFiles( logger.warn({ err }, 'Error adding token to package files'); } await outputFile( - upath.join(config.localDir, packageFile.name), + upath.join(localDir, packageFile.name), JSON.stringify(massagedFile) ); } @@ -470,9 +473,10 @@ export async function getAdditionalFiles( } catch (err) { logger.warn({ err }, 'Error getting token for packageFile'); } + const { localDir } = getAdminConfig(); for (const npmLock of dirs.npmLockDirs) { const lockFileDir = upath.dirname(npmLock); - const fullLockFileDir = upath.join(config.localDir, lockFileDir); + const fullLockFileDir = upath.join(localDir, lockFileDir); const npmrcContent = await getNpmrcContent(fullLockFileDir); await updateNpmrcContent( fullLockFileDir, @@ -535,7 +539,7 @@ export async function getAdditionalFiles( for (const yarnLock of dirs.yarnLockDirs) { const lockFileDir = upath.dirname(yarnLock); - const fullLockFileDir = upath.join(config.localDir, lockFileDir); + const fullLockFileDir = upath.join(localDir, lockFileDir); const npmrcContent = await getNpmrcContent(fullLockFileDir); await updateNpmrcContent( fullLockFileDir, @@ -548,7 +552,7 @@ export async function getAdditionalFiles( (upgrade) => upgrade.yarnLock === yarnLock ); const res = await yarn.generateLockFile( - upath.join(config.localDir, lockFileDir), + upath.join(localDir, lockFileDir), env, config, upgrades @@ -594,7 +598,7 @@ export async function getAdditionalFiles( name: lockFileName, contents: res.lockFile, }); - await updateYarnOffline(lockFileDir, config.localDir, updatedArtifacts); + await updateYarnOffline(lockFileDir, localDir, updatedArtifacts); } } await resetNpmrcContent(fullLockFileDir, npmrcContent); @@ -602,7 +606,7 @@ export async function getAdditionalFiles( for (const pnpmShrinkwrap of dirs.pnpmShrinkwrapDirs) { const lockFileDir = upath.dirname(pnpmShrinkwrap); - const fullLockFileDir = upath.join(config.localDir, lockFileDir); + const fullLockFileDir = upath.join(localDir, lockFileDir); const npmrcContent = await getNpmrcContent(fullLockFileDir); await updateNpmrcContent( fullLockFileDir, @@ -614,7 +618,7 @@ export async function getAdditionalFiles( (upgrade) => upgrade.pnpmShrinkwrap === pnpmShrinkwrap ); const res = await pnpm.generateLockFile( - upath.join(config.localDir, lockFileDir), + upath.join(localDir, lockFileDir), env, config, upgrades @@ -681,7 +685,7 @@ export async function getAdditionalFiles( const skipInstalls = lockFile === 'npm-shrinkwrap.json' ? false : config.skipInstalls; const fullLearnaFileDir = upath.join( - config.localDir, + localDir, getSubDirectory(lernaJsonFile) ); const npmrcContent = await getNpmrcContent(fullLearnaFileDir); @@ -753,7 +757,7 @@ export async function getAdditionalFiles( ); if (existingContent) { logger.trace('Found lock file'); - const lockFilePath = upath.join(config.localDir, filename); + const lockFilePath = upath.join(localDir, filename); logger.trace('Checking against ' + lockFilePath); try { let newContent: string; diff --git a/lib/manager/nuget/artifacts.spec.ts b/lib/manager/nuget/artifacts.spec.ts index e98ff5a29aea5b1325be0fd2f85360d0067f9036..877d8de308442eb8162d017326e07baee465783b 100644 --- a/lib/manager/nuget/artifacts.spec.ts +++ b/lib/manager/nuget/artifacts.spec.ts @@ -2,12 +2,14 @@ import { exec as _exec } from 'child_process'; import { join } from 'upath'; import { envMock, mockExecAll } from '../../../test/exec-util'; import { fs, mocked } from '../../../test/util'; +import { setAdminConfig } from '../../config/admin'; +import type { RepoAdminConfig } from '../../config/types'; import { setExecConfig } from '../../util/exec'; import { BinarySource } from '../../util/exec/common'; import * as docker from '../../util/exec/docker'; import * as _env from '../../util/exec/env'; -import { setFsConfig } from '../../util/fs'; import * as _hostRules from '../../util/host-rules'; +import type { UpdateArtifactsConfig } from '../types'; import * as nuget from './artifacts'; import { getConfiguredRegistries as _getConfiguredRegistries, @@ -31,12 +33,14 @@ const getRandomString: jest.Mock<typeof _getRandomString> = _getRandomString as any; const hostRules = mocked(_hostRules); -const config = { +const adminConfig: RepoAdminConfig = { // `join` fixes Windows CI localDir: join('/tmp/github/some/repo'), cacheDir: join('/tmp/renovate/cache'), }; +const config: UpdateArtifactsConfig = {}; + describe('updateArtifacts', () => { beforeEach(async () => { jest.resetAllMocks(); @@ -47,10 +51,15 @@ describe('updateArtifacts', () => { Promise.resolve(dirName) ); getRandomString.mockReturnValue('not-so-random' as any); - await setExecConfig(config); - setFsConfig(config); + await setExecConfig(adminConfig as never); + setAdminConfig(adminConfig); docker.resetPrefetchedImages(); }); + + afterEach(() => { + setAdminConfig(); + }); + it('aborts if no lock file found', async () => { const execSnapshots = mockExecAll(exec); fs.getSiblingFileName.mockReturnValueOnce('packages.lock.json'); @@ -145,8 +154,7 @@ describe('updateArtifacts', () => { it('supports docker mode', async () => { jest.spyOn(docker, 'removeDanglingContainers').mockResolvedValueOnce(); - await setExecConfig({ ...config, binarySource: BinarySource.Docker }); - setFsConfig({ ...config, binarySource: BinarySource.Docker }); + await setExecConfig({ ...adminConfig, binarySource: BinarySource.Docker }); const execSnapshots = mockExecAll(exec); fs.getSiblingFileName.mockReturnValueOnce('packages.lock.json'); fs.readLocalFile.mockResolvedValueOnce('Current packages.lock.json' as any); diff --git a/lib/manager/nuget/artifacts.ts b/lib/manager/nuget/artifacts.ts index 79c724dce648a4ff89d5f6697323de1426dff3c4..f36891f0d94bb8f11c52d767b1ec61234f155ef2 100644 --- a/lib/manager/nuget/artifacts.ts +++ b/lib/manager/nuget/artifacts.ts @@ -1,4 +1,5 @@ import { join } from 'path'; +import { getAdminConfig } from '../../config/admin'; import { TEMPORARY_ERROR } from '../../constants/error-messages'; import { id, parseRegistryUrl } from '../../datasource/nuget'; import { logger } from '../../logger'; @@ -28,8 +29,9 @@ async function addSourceCmds( config: UpdateArtifactsConfig, nugetConfigFile: string ): Promise<string[]> { + const { localDir } = getAdminConfig(); const registries = - (await getConfiguredRegistries(packageFileName, config.localDir)) || + (await getConfiguredRegistries(packageFileName, localDir)) || getDefaultRegistries(); const result = []; for (const registry of registries) { diff --git a/lib/manager/nuget/extract.spec.ts b/lib/manager/nuget/extract.spec.ts index 532b9e61dede9a569951c8ebc394bceee157c3fa..95ac00b0600dd25656f5d5807fcd7c922b50a494 100644 --- a/lib/manager/nuget/extract.spec.ts +++ b/lib/manager/nuget/extract.spec.ts @@ -1,16 +1,23 @@ -import { readFileSync } from 'fs'; import * as upath from 'upath'; -import { getName } from '../../../test/util'; +import { getName, loadFixture } from '../../../test/util'; +import { setAdminConfig } from '../../config/admin'; +import type { RepoAdminConfig } from '../../config/types'; import type { ExtractConfig } from '../types'; import { extractPackageFile } from './extract'; +const config: ExtractConfig = {}; + +const adminConfig: RepoAdminConfig = { + localDir: upath.resolve('lib/manager/nuget/__fixtures__'), +}; + describe(getName(), () => { describe('extractPackageFile()', () => { - let config: ExtractConfig; beforeEach(() => { - config = { - localDir: upath.resolve('lib/manager/nuget/__fixtures__'), - }; + setAdminConfig(adminConfig); + }); + afterEach(() => { + setAdminConfig(); }); it('returns empty for invalid csproj', async () => { expect( @@ -20,41 +27,28 @@ describe(getName(), () => { it('extracts package version dependency', async () => { const packageFile = 'with-centralized-package-versions/Directory.Packages.props'; - const sample = readFileSync( - upath.join(config.localDir, packageFile), - 'utf8' - ); + const sample = loadFixture(packageFile); const res = await extractPackageFile(sample, packageFile, config); expect(res.deps).toMatchSnapshot(); expect(res.deps).toHaveLength(1); }); it('extracts all dependencies', async () => { const packageFile = 'sample.csproj'; - const sample = readFileSync( - upath.join(config.localDir, packageFile), - 'utf8' - ); + const sample = loadFixture(packageFile); const res = await extractPackageFile(sample, packageFile, config); expect(res.deps).toMatchSnapshot(); expect(res.deps).toHaveLength(17); }); it('extracts all dependencies from global packages file', async () => { const packageFile = 'packages.props'; - const sample = readFileSync( - upath.join(config.localDir, packageFile), - 'utf8' - ); + const sample = loadFixture(packageFile); const res = await extractPackageFile(sample, packageFile, config); expect(res.deps).toMatchSnapshot(); expect(res.deps).toHaveLength(17); }); it('considers NuGet.config', async () => { const packageFile = 'with-config-file/with-config-file.csproj'; - const contents = readFileSync( - upath.join(config.localDir, packageFile), - 'utf8' - ); - + const contents = loadFixture(packageFile); expect( await extractPackageFile(contents, packageFile, config) ).toMatchSnapshot(); @@ -62,10 +56,7 @@ describe(getName(), () => { it('considers lower-case nuget.config', async () => { const packageFile = 'with-lower-case-config-file/with-lower-case-config-file.csproj'; - const contents = readFileSync( - upath.join(config.localDir, packageFile), - 'utf8' - ); + const contents = loadFixture(packageFile); expect( await extractPackageFile(contents, packageFile, config) @@ -74,10 +65,7 @@ describe(getName(), () => { it('considers pascal-case NuGet.Config', async () => { const packageFile = 'with-pascal-case-config-file/with-pascal-case-config-file.csproj'; - const contents = readFileSync( - upath.join(config.localDir, packageFile), - 'utf8' - ); + const contents = loadFixture(packageFile); expect( await extractPackageFile(contents, packageFile, config) @@ -86,10 +74,7 @@ describe(getName(), () => { it('handles malformed NuGet.config', async () => { const packageFile = 'with-malformed-config-file/with-malformed-config-file.csproj'; - const contents = readFileSync( - upath.join(config.localDir, packageFile), - 'utf8' - ); + const contents = loadFixture(packageFile); expect( await extractPackageFile(contents, packageFile, config) @@ -98,10 +83,7 @@ describe(getName(), () => { it('handles NuGet.config without package sources', async () => { const packageFile = 'without-package-sources/without-package-sources.csproj'; - const contents = readFileSync( - upath.join(config.localDir, packageFile), - 'utf8' - ); + const contents = loadFixture(packageFile); expect( await extractPackageFile(contents, packageFile, config) @@ -110,10 +92,7 @@ describe(getName(), () => { it('ignores local feed in NuGet.config', async () => { const packageFile = 'with-local-feed-in-config-file/with-local-feed-in-config-file.csproj'; - const contents = readFileSync( - upath.join(config.localDir, packageFile), - 'utf8' - ); + const contents = loadFixture(packageFile); expect( await extractPackageFile(contents, packageFile, config) @@ -121,15 +100,9 @@ describe(getName(), () => { }); it('extracts registry URLs independently', async () => { const packageFile = 'multiple-package-files/one/one.csproj'; - const contents = readFileSync( - upath.join(config.localDir, packageFile), - 'utf8' - ); + const contents = loadFixture(packageFile); const otherPackageFile = 'multiple-package-files/two/two.csproj'; - const otherContents = readFileSync( - upath.join(config.localDir, packageFile), - 'utf8' - ); + const otherContents = loadFixture(otherPackageFile); expect( await extractPackageFile(contents, packageFile, config) ).toMatchSnapshot(); diff --git a/lib/manager/nuget/extract.ts b/lib/manager/nuget/extract.ts index 0cebc39edff5831a88e9acd7c529ab7564e6e893..27a6ebecafbb53e1f15f0bc326c92ccec6e5ca6d 100644 --- a/lib/manager/nuget/extract.ts +++ b/lib/manager/nuget/extract.ts @@ -1,4 +1,5 @@ import { XmlDocument, XmlElement, XmlNode } from 'xmldoc'; +import { getAdminConfig } from '../../config/admin'; import * as datasourceNuget from '../../datasource/nuget'; import { logger } from '../../logger'; import { getSiblingFileName, localPathExists } from '../../util/fs'; @@ -70,10 +71,8 @@ export async function extractPackageFile( ): Promise<PackageFile | null> { logger.trace({ packageFile }, 'nuget.extractPackageFile()'); - const registries = await getConfiguredRegistries( - packageFile, - config.localDir - ); + const { localDir } = getAdminConfig(); + const registries = await getConfiguredRegistries(packageFile, localDir); const registryUrls = registries ? registries.map((registry) => registry.url) : undefined; diff --git a/lib/manager/pip_requirements/artifacts.spec.ts b/lib/manager/pip_requirements/artifacts.spec.ts index 456744ce6a8f82fb571e467edcfe3b7236254944..4cad75929c76e35c1700ccdd9038567edb6d32ce 100644 --- a/lib/manager/pip_requirements/artifacts.spec.ts +++ b/lib/manager/pip_requirements/artifacts.spec.ts @@ -1,4 +1,6 @@ import _fs from 'fs-extra'; +import { setAdminConfig } from '../../config/admin'; +import type { UpdateArtifactsConfig } from '../types'; import { updateArtifacts } from './artifacts'; const fs: jest.Mocked<typeof _fs> = _fs as any; @@ -7,7 +9,7 @@ jest.mock('fs-extra'); jest.mock('child_process'); jest.mock('../../util/exec'); -const config = {}; +const config: UpdateArtifactsConfig = {}; const newPackageFileContent = `atomicwrites==1.4.0 \ --hash=sha256:03472c30eb2c5d1ba9227e4c2ca66ab8287fbfbbda3888aa93dc2e28fc6811b4 \ @@ -17,6 +19,7 @@ describe('.updateArtifacts()', () => { beforeEach(() => { jest.resetAllMocks(); jest.resetModules(); + setAdminConfig({ localDir: '' }); }); it('returns null if no updatedDeps were provided', async () => { expect( diff --git a/lib/manager/pip_setup/__snapshots__/extract.spec.ts.snap b/lib/manager/pip_setup/__snapshots__/extract.spec.ts.snap index 4316f62fbe5485e681b0d4f4b54374e2896d3bca..cfeee48ee63fd5f9d49606fb8bf5b7a2cae014cc 100644 --- a/lib/manager/pip_setup/__snapshots__/extract.spec.ts.snap +++ b/lib/manager/pip_setup/__snapshots__/extract.spec.ts.snap @@ -7,7 +7,7 @@ Array [ Object { "cmd": "python --version", "options": Object { - "cwd": null, + "cwd": "/tmp/foo/bar", "encoding": "utf-8", "env": Object { "HOME": "/home/user", @@ -25,7 +25,7 @@ Array [ Object { "cmd": "python3 --version", "options": Object { - "cwd": null, + "cwd": "/tmp/foo/bar", "encoding": "utf-8", "env": Object { "HOME": "/home/user", @@ -43,7 +43,7 @@ Array [ Object { "cmd": "python3.8 --version", "options": Object { - "cwd": null, + "cwd": "/tmp/foo/bar", "encoding": "utf-8", "env": Object { "HOME": "/home/user", diff --git a/lib/manager/pip_setup/extract.spec.ts b/lib/manager/pip_setup/extract.spec.ts index cf8d187a70bbf281c38341c1d0f811c67df21c32..37c254d32e286ab6b6aaec4bcc993d37ced88433 100644 --- a/lib/manager/pip_setup/extract.spec.ts +++ b/lib/manager/pip_setup/extract.spec.ts @@ -1,5 +1,6 @@ import { envMock, exec, mockExecSequence } from '../../../test/exec-util'; import { env, getName } from '../../../test/util'; +import { setAdminConfig } from '../../config/admin'; import { getPythonAlias, parsePythonVersion, @@ -17,6 +18,7 @@ describe(getName(), () => { resetModule(); env.getChildProcessEnv.mockReturnValue(envMock.basic); + setAdminConfig({ localDir: '/tmp/foo/bar' }); }); describe('parsePythonVersion', () => { it('returns major and minor version numbers', () => { diff --git a/lib/manager/pip_setup/index.spec.ts b/lib/manager/pip_setup/index.spec.ts index 28acf04ee1f80363fc7f73f258f2a5ec2c29ca9b..fffa8ae536a337168a7ca984c4cce3f6618b0936 100644 --- a/lib/manager/pip_setup/index.spec.ts +++ b/lib/manager/pip_setup/index.spec.ts @@ -6,10 +6,12 @@ import { mockExecSequence, } from '../../../test/exec-util'; import { env, getName, loadFixture } from '../../../test/util'; +import { setAdminConfig } from '../../config/admin'; +import type { RepoAdminConfig } from '../../config/types'; import { setExecConfig } from '../../util/exec'; import { BinarySource } from '../../util/exec/common'; import * as fs from '../../util/fs'; -import { setFsConfig } from '../../util/fs'; +import type { ExtractConfig } from '../types'; import * as extract from './extract'; import { extractPackageFile } from '.'; @@ -17,11 +19,13 @@ const packageFile = 'setup.py'; const content = loadFixture(packageFile); const jsonContent = loadFixture('setup.py.json'); -const config = { +const adminConfig: RepoAdminConfig = { localDir: '/tmp/github/some/repo', cacheDir: '/tmp/renovate/cache', }; +const config: ExtractConfig = {}; + jest.mock('child_process'); jest.mock('../../util/exec/env'); @@ -44,14 +48,18 @@ describe(getName(), () => { jest.resetModules(); extract.resetModule(); - await setExecConfig(config); - setFsConfig(config); + await setExecConfig(adminConfig as never); + setAdminConfig(adminConfig); env.getChildProcessEnv.mockReturnValue(envMock.basic); // do not copy extract.py jest.spyOn(fs, 'writeLocalFile').mockResolvedValue(); }); + afterEach(() => { + setAdminConfig(); + }); + it('returns found deps', async () => { const execSnapshots = mockExecSequence(exec, [ ...pythonVersionCallResults, diff --git a/lib/manager/pipenv/artifacts.spec.ts b/lib/manager/pipenv/artifacts.spec.ts index e7830f9eb08c17122e876f48ee82bb22ecb617e4..64951dc94edecc8b06363f94b5ddb6f92dd370d9 100644 --- a/lib/manager/pipenv/artifacts.spec.ts +++ b/lib/manager/pipenv/artifacts.spec.ts @@ -3,12 +3,14 @@ import _fs from 'fs-extra'; import { join } from 'upath'; import { envMock, mockExecAll } from '../../../test/exec-util'; import { git, mocked } from '../../../test/util'; +import { setAdminConfig } from '../../config/admin'; +import type { RepoAdminConfig } from '../../config/types'; import { setExecConfig } from '../../util/exec'; import { BinarySource } from '../../util/exec/common'; import * as docker from '../../util/exec/docker'; import * as _env from '../../util/exec/env'; -import { setFsConfig } from '../../util/fs'; import type { StatusResult } from '../../util/git'; +import type { UpdateArtifactsConfig } from '../types'; import * as pipenv from './artifacts'; jest.mock('fs-extra'); @@ -22,13 +24,14 @@ const fs: jest.Mocked<typeof _fs> = _fs as any; const exec: jest.Mock<typeof _exec> = _exec as any; const env = mocked(_env); -const config = { +const adminConfig: RepoAdminConfig = { // `join` fixes Windows CI localDir: join('/tmp/github/some/repo'), cacheDir: join('/tmp/renovate/cache'), }; +const dockerAdminConfig = { ...adminConfig, binarySource: BinarySource.Docker }; -const dockerConfig = { ...config, binarySource: BinarySource.Docker }; +const config: UpdateArtifactsConfig = {}; const lockMaintenanceConfig = { ...config, isLockFileMaintenance: true }; describe('.updateArtifacts()', () => { @@ -41,8 +44,8 @@ describe('.updateArtifacts()', () => { LC_ALL: 'en_US', }); - await setExecConfig(config); - setFsConfig(config); + await setExecConfig(adminConfig as never); + setAdminConfig(adminConfig); docker.resetPrefetchedImages(); pipFileLock = { _meta: { requires: {} }, @@ -109,8 +112,7 @@ describe('.updateArtifacts()', () => { }); it('supports docker mode', async () => { jest.spyOn(docker, 'removeDanglingContainers').mockResolvedValueOnce(); - await setExecConfig(dockerConfig); - setFsConfig(dockerConfig); + await setExecConfig(dockerAdminConfig); pipFileLock._meta.requires.python_version = '3.7'; fs.readFile.mockResolvedValueOnce(JSON.stringify(pipFileLock) as any); const execSnapshots = mockExecAll(exec); @@ -123,7 +125,7 @@ describe('.updateArtifacts()', () => { packageFileName: 'Pipfile', updatedDeps: [], newPackageFileContent: 'some new content', - config: dockerConfig, + config: { ...config, ...dockerAdminConfig }, }) ).not.toBeNull(); expect(execSnapshots).toMatchSnapshot(); @@ -161,8 +163,7 @@ describe('.updateArtifacts()', () => { }); it('uses pipenv version from Pipfile', async () => { jest.spyOn(docker, 'removeDanglingContainers').mockResolvedValueOnce(); - await setExecConfig(dockerConfig); - setFsConfig(dockerConfig); + await setExecConfig(dockerAdminConfig); pipFileLock.default.pipenv.version = '==2020.8.13'; fs.readFile.mockResolvedValueOnce(JSON.stringify(pipFileLock) as any); const execSnapshots = mockExecAll(exec); @@ -175,15 +176,14 @@ describe('.updateArtifacts()', () => { packageFileName: 'Pipfile', updatedDeps: [], newPackageFileContent: 'some new content', - config: dockerConfig, + config: { ...config, ...dockerAdminConfig }, }) ).not.toBeNull(); expect(execSnapshots).toMatchSnapshot(); }); it('uses pipenv version from Pipfile dev packages', async () => { jest.spyOn(docker, 'removeDanglingContainers').mockResolvedValueOnce(); - await setExecConfig(dockerConfig); - setFsConfig(dockerConfig); + await setExecConfig(dockerAdminConfig); pipFileLock.develop.pipenv.version = '==2020.8.13'; fs.readFile.mockResolvedValueOnce(JSON.stringify(pipFileLock) as any); const execSnapshots = mockExecAll(exec); @@ -196,15 +196,14 @@ describe('.updateArtifacts()', () => { packageFileName: 'Pipfile', updatedDeps: [], newPackageFileContent: 'some new content', - config: dockerConfig, + config: { ...config, ...dockerAdminConfig }, }) ).not.toBeNull(); expect(execSnapshots).toMatchSnapshot(); }); it('uses pipenv version from config', async () => { jest.spyOn(docker, 'removeDanglingContainers').mockResolvedValueOnce(); - await setExecConfig(dockerConfig); - setFsConfig(dockerConfig); + await setExecConfig(dockerAdminConfig); pipFileLock.default.pipenv.version = '==2020.8.13'; fs.readFile.mockResolvedValueOnce(JSON.stringify(pipFileLock) as any); const execSnapshots = mockExecAll(exec); @@ -217,7 +216,7 @@ describe('.updateArtifacts()', () => { packageFileName: 'Pipfile', updatedDeps: [], newPackageFileContent: 'some new content', - config: { ...dockerConfig, constraints: { pipenv: '==2020.1.1' } }, + config: { ...dockerAdminConfig, constraints: { pipenv: '==2020.1.1' } }, }) ).not.toBeNull(); expect(execSnapshots).toMatchSnapshot(); diff --git a/lib/manager/poetry/artifacts.spec.ts b/lib/manager/poetry/artifacts.spec.ts index 52289eb2935b3e481a989ca820dcc4d1702baca7..85a77bc6cf639abf5de6e8020f8b3d00262b20a7 100644 --- a/lib/manager/poetry/artifacts.spec.ts +++ b/lib/manager/poetry/artifacts.spec.ts @@ -3,12 +3,15 @@ import _fs from 'fs-extra'; import { join } from 'upath'; import { envMock, mockExecAll } from '../../../test/exec-util'; import { loadFixture, mocked } from '../../../test/util'; +import { setAdminConfig } from '../../config/admin'; +import type { RepoAdminConfig } from '../../config/types'; import * as _datasource from '../../datasource'; import { setExecConfig } from '../../util/exec'; import { BinarySource } from '../../util/exec/common'; import * as docker from '../../util/exec/docker'; import * as _env from '../../util/exec/env'; import * as _hostRules from '../../util/host-rules'; +import type { UpdateArtifactsConfig } from '../types'; import { updateArtifacts } from './artifacts'; const pyproject10toml = loadFixture('pyproject.10.toml'); @@ -25,15 +28,18 @@ const env = mocked(_env); const datasource = mocked(_datasource); const hostRules = mocked(_hostRules); -const config = { +const adminConfig: RepoAdminConfig = { localDir: join('/tmp/github/some/repo'), }; +const config: UpdateArtifactsConfig = {}; + describe('.updateArtifacts()', () => { beforeEach(async () => { jest.resetAllMocks(); env.getChildProcessEnv.mockReturnValue(envMock.basic); - await setExecConfig(config); + await setExecConfig(adminConfig as never); + setAdminConfig(adminConfig); docker.resetPrefetchedImages(); }); it('returns null if no poetry.lock found', async () => { @@ -128,10 +134,7 @@ describe('.updateArtifacts()', () => { }); it('returns updated poetry.lock using docker', async () => { jest.spyOn(docker, 'removeDanglingContainers').mockResolvedValueOnce(); - await setExecConfig({ - ...config, - binarySource: BinarySource.Docker, - }); + await setExecConfig({ ...adminConfig, binarySource: BinarySource.Docker }); fs.readFile.mockResolvedValueOnce('[metadata]\n' as any); const execSnapshots = mockExecAll(exec); fs.readFile.mockReturnValueOnce('New poetry.lock' as any); @@ -157,10 +160,7 @@ describe('.updateArtifacts()', () => { }); it('returns updated poetry.lock using docker (constraints)', async () => { jest.spyOn(docker, 'removeDanglingContainers').mockResolvedValueOnce(); - await setExecConfig({ - ...config, - binarySource: BinarySource.Docker, - }); + await setExecConfig({ ...adminConfig, binarySource: BinarySource.Docker }); fs.readFile.mockResolvedValueOnce( '[metadata]\npython-versions = "~2.7 || ^3.4"' as any ); diff --git a/lib/manager/types.ts b/lib/manager/types.ts index d1af311bcc1c4e6139e5c0aa8be845ed2c848d96..40b7f21c2b953b3e6cb03112b3621a94645ddf67 100644 --- a/lib/manager/types.ts +++ b/lib/manager/types.ts @@ -11,7 +11,6 @@ export type Result<T> = T | Promise<T>; export interface ManagerConfig { binarySource?: string; - localDir?: string; registryUrls?: string[]; } @@ -21,7 +20,6 @@ export interface ManagerData<T> { export interface ExtractConfig { binarySource?: string; - localDir?: string; registryUrls?: string[]; endpoint?: string; gradle?: { timeout?: number }; @@ -44,7 +42,6 @@ export interface CustomExtractConfig extends ExtractConfig { export interface UpdateArtifactsConfig extends ManagerConfig { isLockFileMaintenance?: boolean; constraints?: Record<string, string>; - cacheDir?: string; composerIgnorePlatformReqs?: boolean; currentValue?: string; postUpdateOptions?: string[]; @@ -185,7 +182,6 @@ export interface Upgrade<T = Record<string, any>> isLockfileUpdate?: boolean; currentRawValue?: any; depGroup?: string; - localDir?: string; name?: string; newDigest?: string; newFrom?: string; @@ -278,7 +274,6 @@ export interface ManagerApi { // TODO: name and properties used by npm manager export interface PostUpdateConfig extends ManagerConfig, Record<string, any> { - cacheDir?: string; updatedPackageFiles?: File[]; postUpdateOptions?: string[]; skipInstalls?: boolean; diff --git a/lib/platform/azure/index.ts b/lib/platform/azure/index.ts index 0e8f4bf7533c755a07fb4ad4ac74054e47975235..6abee9274b30c640f0a2bef8a0833d096bd3bf27 100644 --- a/lib/platform/azure/index.ts +++ b/lib/platform/azure/index.ts @@ -138,7 +138,6 @@ export async function getJsonFile( export async function initRepo({ repository, - localDir, cloneSubmodules, }: RepoParams): Promise<RepoResult> { logger.debug(`initRepo("${repository}")`); @@ -178,7 +177,6 @@ export async function initRepo({ const url = repo.remoteUrl || manualUrl; await git.initRepo({ ...config, - localDir, url, extraCloneOpts: getStorageExtraCloneOpts(opts), gitAuthorName: global.gitAuthor?.name, diff --git a/lib/platform/bitbucket-server/index.spec.ts b/lib/platform/bitbucket-server/index.spec.ts index 69c3d2a5c4fb46f705c3aacf199da6fa538d2c5d..45d6d558ff97fbd8bb1ea1d516a19a5acd0b0712 100644 --- a/lib/platform/bitbucket-server/index.spec.ts +++ b/lib/platform/bitbucket-server/index.spec.ts @@ -195,7 +195,6 @@ describe(getName(), () => { await bitbucket.initRepo({ endpoint: 'https://stash.renovatebot.com/vcs/', repository: 'SOME/repo', - localDir: '', ...config, }); return scope; @@ -294,7 +293,6 @@ describe(getName(), () => { await bitbucket.initRepo({ endpoint: 'https://stash.renovatebot.com/vcs/', repository: 'SOME/repo', - localDir: '', }) ).toMatchSnapshot(); expect(httpMock.getTrace()).toMatchSnapshot(); @@ -318,7 +316,6 @@ describe(getName(), () => { const res = await bitbucket.initRepo({ endpoint: 'https://stash.renovatebot.com/vcs/', repository: 'SOME/repo', - localDir: '', }); expect(git.initRepo).toHaveBeenCalledWith( expect.objectContaining({ url: sshLink('SOME', 'repo') }) @@ -345,7 +342,6 @@ describe(getName(), () => { const res = await bitbucket.initRepo({ endpoint: 'https://stash.renovatebot.com/vcs/', repository: 'SOME/repo', - localDir: '', }); expect(git.initRepo).toHaveBeenCalledWith( expect.objectContaining({ @@ -379,7 +375,6 @@ describe(getName(), () => { const res = await bitbucket.initRepo({ endpoint: 'https://stash.renovatebot.com/vcs/', repository: 'SOME/repo', - localDir: '', }); expect(git.initRepo).toHaveBeenCalledWith( expect.objectContaining({ @@ -404,7 +399,6 @@ describe(getName(), () => { bitbucket.initRepo({ endpoint: 'https://stash.renovatebot.com/vcs/', repository: 'SOME/repo', - localDir: '', }) ).rejects.toThrow(REPOSITORY_EMPTY); expect(httpMock.getTrace()).toMatchSnapshot(); diff --git a/lib/platform/bitbucket-server/index.ts b/lib/platform/bitbucket-server/index.ts index c6b9ec421ed97e1cf3ed94b83670a39cf3c39e7c..4f0a81e3d533909804a14334663991849b4f9a12 100644 --- a/lib/platform/bitbucket-server/index.ts +++ b/lib/platform/bitbucket-server/index.ts @@ -145,13 +145,10 @@ export async function getJsonFile( // Initialize BitBucket Server by getting base branch export async function initRepo({ repository, - localDir, cloneSubmodules, ignorePrAuthor, }: RepoParams): Promise<RepoResult> { - logger.debug( - `initRepo("${JSON.stringify({ repository, localDir }, null, 2)}")` - ); + logger.debug(`initRepo("${JSON.stringify({ repository }, null, 2)}")`); const opts = hostRules.find({ hostType: defaults.hostType, url: defaults.endpoint, @@ -215,7 +212,6 @@ export async function initRepo({ await git.initRepo({ ...config, - localDir, url: gitUrl, gitAuthorName: global.gitAuthor?.name, gitAuthorEmail: global.gitAuthor?.email, diff --git a/lib/platform/bitbucket/index.spec.ts b/lib/platform/bitbucket/index.spec.ts index 6a0e40e0048bdc5e3fb95fa7c9448e0d4836b11d..d0247622756d6816a5314b981e734d747e756341 100644 --- a/lib/platform/bitbucket/index.spec.ts +++ b/lib/platform/bitbucket/index.spec.ts @@ -84,7 +84,6 @@ describe(getName(), () => { await bitbucket.initRepo({ repository: 'some/repo', - localDir: '', ...config, }); @@ -149,7 +148,6 @@ describe(getName(), () => { expect( await bitbucket.initRepo({ repository: 'some/repo', - localDir: '', }) ).toMatchSnapshot(); expect(httpMock.getTrace()).toMatchSnapshot(); diff --git a/lib/platform/bitbucket/index.ts b/lib/platform/bitbucket/index.ts index e1c4eae8aba5018acfc157dd03fd7458b3e30e76..342e3c4659245440b343aab4fa1a687ff3f36e82 100644 --- a/lib/platform/bitbucket/index.ts +++ b/lib/platform/bitbucket/index.ts @@ -121,7 +121,6 @@ export async function getJsonFile( // Initialize bitbucket by getting base branch and SHA export async function initRepo({ repository, - localDir, cloneSubmodules, ignorePrAuthor, }: RepoParams): Promise<RepoResult> { @@ -178,7 +177,6 @@ export async function initRepo({ await git.initRepo({ ...config, - localDir, url, gitAuthorName: global.gitAuthor?.name, gitAuthorEmail: global.gitAuthor?.email, diff --git a/lib/platform/gitea/index.spec.ts b/lib/platform/gitea/index.spec.ts index 7fca3de799ce9a66784b879e8c59e9e8f6914604..8d42f712ec1ba855aca4d0466934a43329f44150 100644 --- a/lib/platform/gitea/index.spec.ts +++ b/lib/platform/gitea/index.spec.ts @@ -184,7 +184,6 @@ describe(getName(), () => { return gitea.initRepo({ repository: mockRepo.full_name, - localDir: '', ...config, }); } @@ -251,7 +250,6 @@ describe(getName(), () => { describe('initRepo', () => { const initRepoCfg: RepoParams = { repository: mockRepo.full_name, - localDir: '', }; it('should propagate API errors', async () => { diff --git a/lib/platform/gitea/index.ts b/lib/platform/gitea/index.ts index e7f97546a445c251c92b4d8913437f1d7b3bf575..a09a65b261d490e3893a0b40377afefc3534d27e 100644 --- a/lib/platform/gitea/index.ts +++ b/lib/platform/gitea/index.ts @@ -39,7 +39,6 @@ import { smartLinks } from './utils'; interface GiteaRepoConfig { repository: string; - localDir: string; mergeMethod: helper.PRMergeMethod; prList: Promise<Pr[]> | null; @@ -226,14 +225,12 @@ const platform: Platform = { async initRepo({ repository, - localDir, cloneSubmodules, }: RepoParams): Promise<RepoResult> { let repo: helper.Repo; config = {} as any; config.repository = repository; - config.localDir = localDir; config.cloneSubmodules = cloneSubmodules; // Attempt to fetch information about repository diff --git a/lib/platform/github/index.ts b/lib/platform/github/index.ts index 749cb7d13f575c9aacacd69f104c627708a8d6ed..18a7ca783828e27eecf8330cbb14ec674d086df0 100644 --- a/lib/platform/github/index.ts +++ b/lib/platform/github/index.ts @@ -168,14 +168,13 @@ export async function initRepo({ repository, forkMode, forkToken, - localDir, renovateUsername, cloneSubmodules, ignorePrAuthor, }: RepoParams): Promise<RepoResult> { logger.debug(`initRepo("${repository}")`); // config is used by the platform api itself, not necessary for the app layer to know - config = { localDir, repository, cloneSubmodules, ignorePrAuthor } as any; + config = { repository, cloneSubmodules, ignorePrAuthor } as any; // istanbul ignore if if (endpoint) { // Necessary for Renovate Pro - do not remove diff --git a/lib/platform/github/types.ts b/lib/platform/github/types.ts index b765520e03607bab18fc130ef64c30eb518ffc0d..8b6736a10c931bb7fd9f774632c8bc654ca191d0 100644 --- a/lib/platform/github/types.ts +++ b/lib/platform/github/types.ts @@ -69,7 +69,6 @@ export interface LocalRepoConfig { defaultBranch: string; repositoryOwner: string; repository: string | null; - localDir: string; isGhe: boolean; renovateUsername: string; productLinks: any; diff --git a/lib/platform/gitlab/index.spec.ts b/lib/platform/gitlab/index.spec.ts index 713f02c3ef75b42b19026315bf84ea37a9f8109f..a436586ac9898b0ec2cbbc72c8b326767e4922a2 100644 --- a/lib/platform/gitlab/index.spec.ts +++ b/lib/platform/gitlab/index.spec.ts @@ -164,7 +164,6 @@ describe(getName(), () => { async function initRepo( repoParams: RepoParams = { repository: 'some/repo', - localDir: '', }, repoResp = null, scope = httpMock.scope(gitlabApiHost) @@ -191,7 +190,6 @@ describe(getName(), () => { .reply(200, okReturn); await gitlab.initRepo({ repository: 'some/repo/project', - localDir: '', }); expect(httpMock.getTrace()).toMatchSnapshot(); }); @@ -203,7 +201,6 @@ describe(getName(), () => { await expect( gitlab.initRepo({ repository: 'some/repo', - localDir: '', }) ).rejects.toThrow('always error'); expect(httpMock.getTrace()).toMatchSnapshot(); @@ -216,7 +213,6 @@ describe(getName(), () => { await expect( gitlab.initRepo({ repository: 'some/repo', - localDir: '', }) ).rejects.toThrow(REPOSITORY_ARCHIVED); expect(httpMock.getTrace()).toMatchSnapshot(); @@ -229,7 +225,6 @@ describe(getName(), () => { await expect( gitlab.initRepo({ repository: 'some/repo', - localDir: '', }) ).rejects.toThrow(REPOSITORY_MIRRORED); expect(httpMock.getTrace()).toMatchSnapshot(); @@ -242,7 +237,6 @@ describe(getName(), () => { await expect( gitlab.initRepo({ repository: 'some/repo', - localDir: '', }) ).rejects.toThrow(REPOSITORY_DISABLED); expect(httpMock.getTrace()).toMatchSnapshot(); @@ -255,7 +249,6 @@ describe(getName(), () => { await expect( gitlab.initRepo({ repository: 'some/repo', - localDir: '', }) ).rejects.toThrow(REPOSITORY_DISABLED); expect(httpMock.getTrace()).toMatchSnapshot(); @@ -268,7 +261,6 @@ describe(getName(), () => { await expect( gitlab.initRepo({ repository: 'some/repo', - localDir: '', }) ).rejects.toThrow(REPOSITORY_EMPTY); expect(httpMock.getTrace()).toMatchSnapshot(); @@ -281,7 +273,6 @@ describe(getName(), () => { await expect( gitlab.initRepo({ repository: 'some/repo', - localDir: '', }) ).rejects.toThrow(REPOSITORY_EMPTY); expect(httpMock.getTrace()).toMatchSnapshot(); @@ -296,7 +287,6 @@ describe(getName(), () => { }); await gitlab.initRepo({ repository: 'some/repo/project', - localDir: '', }); expect(httpMock.getTrace()).toMatchSnapshot(); }); @@ -306,7 +296,6 @@ describe(getName(), () => { await initRepo( { repository: 'some/repo/project', - localDir: '', }, { default_branch: 'master', @@ -322,7 +311,6 @@ describe(getName(), () => { await initRepo( { repository: 'some/repo/project', - localDir: '', }, { default_branch: 'master', diff --git a/lib/platform/gitlab/index.ts b/lib/platform/gitlab/index.ts index 6faaf766cc14ce0ef00ea339cd9ea079c9d15b51..87f86415f444f411b4992ee43a979fee004243e6 100755 --- a/lib/platform/gitlab/index.ts +++ b/lib/platform/gitlab/index.ts @@ -52,7 +52,6 @@ import type { let config: { repository: string; - localDir: string; email: string; prList: any[]; issueList: GitlabIssue[]; @@ -166,13 +165,11 @@ export async function getJsonFile( // Initialize GitLab by getting base branch export async function initRepo({ repository, - localDir, cloneSubmodules, ignorePrAuthor, }: RepoParams): Promise<RepoResult> { config = {} as any; config.repository = urlEscape(repository); - config.localDir = localDir; config.cloneSubmodules = cloneSubmodules; config.ignorePrAuthor = ignorePrAuthor; diff --git a/lib/platform/types.ts b/lib/platform/types.ts index d52a7e6a909c0bfb9ac96b7c577e71bfe5e7b74a..240425ace74b9ff8481cd59c05d28ea23e6642e2 100644 --- a/lib/platform/types.ts +++ b/lib/platform/types.ts @@ -27,7 +27,6 @@ export interface RepoResult { } export interface RepoParams { - localDir: string; repository: string; endpoint?: string; forkMode?: string; diff --git a/lib/util/exec/common.ts b/lib/util/exec/common.ts index 3be896bbfcba1b89d2ffdbcfc179519cdfdf26b1..3c09ad1947cccb2f42e276a711b62c5972111be0 100644 --- a/lib/util/exec/common.ts +++ b/lib/util/exec/common.ts @@ -13,8 +13,6 @@ export enum BinarySource { export interface ExecConfig { binarySource: Opt<BinarySource>; - localDir: Opt<string>; - cacheDir: Opt<string>; } export type VolumesPair = [string, string]; diff --git a/lib/util/exec/docker/index.ts b/lib/util/exec/docker/index.ts index 2ae548575aeb0d0b666580eca80c2595ae328688..b58a9d82d37c3a600f1c09d8a3a0870c69c65c00 100644 --- a/lib/util/exec/docker/index.ts +++ b/lib/util/exec/docker/index.ts @@ -1,3 +1,4 @@ +import is from '@sindresorhus/is'; import { getAdminConfig } from '../../../config/admin'; import { SYSTEM_INSUFFICIENT_MEMORY } from '../../../constants/error-messages'; import { getPkgReleases } from '../../../datasource'; @@ -31,12 +32,12 @@ export function resetPrefetchedImages(): void { } function expandVolumeOption(x: VolumeOption): VolumesPair | null { - if (typeof x === 'string') { + if (is.nonEmptyString(x)) { return [x, x]; } if (Array.isArray(x) && x.length === 2) { const [from, to] = x; - if (typeof from === 'string' && typeof to === 'string') { + if (is.nonEmptyString(from) && is.nonEmptyString(to)) { return [from, to]; } } @@ -195,8 +196,13 @@ export async function generateDockerCommand( const volumes = options.volumes || []; const preCommands = options.preCommands || []; const postCommands = options.postCommands || []; - const { localDir, cacheDir } = config; - const { dockerUser, dockerChildPrefix, dockerImagePrefix } = getAdminConfig(); + const { + localDir, + cacheDir, + dockerUser, + dockerChildPrefix, + dockerImagePrefix, + } = getAdminConfig(); const result = ['docker run --rm']; const containerName = getContainerName(image, dockerChildPrefix); const containerLabel = getContainerLabel(dockerChildPrefix); diff --git a/lib/util/exec/exec.spec.ts b/lib/util/exec/exec.spec.ts index 387c15d46c36db1919556bd5a43bd399c7bf3dff..b0b1c3cae367cf821ca3fc3afa5408b47af36087 100644 --- a/lib/util/exec/exec.spec.ts +++ b/lib/util/exec/exec.spec.ts @@ -28,7 +28,7 @@ interface TestInput { inOpts: ExecOptions; outCmd: string[]; outOpts: RawExecOptions[]; - adminConfig?: RepoAdminConfig; + adminConfig?: Partial<RepoAdminConfig>; } describe(getName(), () => { @@ -40,10 +40,7 @@ describe(getName(), () => { const defaultCwd = `-w "${cwd}"`; const defaultVolumes = `-v "${cwd}":"${cwd}" -v "${cacheDir}":"${cacheDir}"`; - const execConfig = { - cacheDir, - localDir: cwd, - }; + const execConfig = {}; beforeEach(() => { dockerModule.resetPrefetchedImages(); @@ -56,7 +53,6 @@ describe(getName(), () => { afterEach(() => { process.env = processEnvOrig; - setAdminConfig(); }); const image = 'image'; @@ -721,7 +717,7 @@ describe(getName(), () => { callback(null, { stdout: '', stderr: '' }); return undefined; }); - setAdminConfig(adminConfig); + setAdminConfig({ cacheDir, localDir: cwd, ...adminConfig }); await exec(cmd as string, inOpts); expect(actualCmd).toEqual(outCommand); diff --git a/lib/util/exec/index.ts b/lib/util/exec/index.ts index c2205e02c4035cae9252e3063874f69fc62f4dec..a01b886e5e0d83c39b0874fff385858e4b58fc25 100644 --- a/lib/util/exec/index.ts +++ b/lib/util/exec/index.ts @@ -22,8 +22,6 @@ import { getChildProcessEnv } from './env'; const execConfig: ExecConfig = { binarySource: null, - localDir: null, - cacheDir: null, }; export async function setExecConfig( @@ -99,10 +97,11 @@ export async function exec( const extraEnv = { ...opts.extraEnv, ...customEnvVariables }; let cwd; // istanbul ignore if + const { localDir } = getAdminConfig(); if (cwdFile) { - cwd = join(execConfig.localDir, dirname(cwdFile)); + cwd = join(localDir, dirname(cwdFile)); } - cwd = cwd || opts.cwd || execConfig.localDir; + cwd = cwd || opts.cwd || localDir; const childEnv = createChildEnv(env, extraEnv); const execOptions: ExecOptions = { ...opts }; diff --git a/lib/util/fs/index.spec.ts b/lib/util/fs/index.spec.ts index c79946db3fccf178a17371800720e6637f6922b7..b8a05915e28bc5c51ba1ef1dfba2cc3e9534fe57 100644 --- a/lib/util/fs/index.spec.ts +++ b/lib/util/fs/index.spec.ts @@ -1,16 +1,20 @@ import { withDir } from 'tmp-promise'; import { getName } from '../../../test/util'; +import { setAdminConfig } from '../../config/admin'; import { findLocalSiblingOrParent, getSubDirectory, localPathExists, readLocalFile, - setFsConfig, writeLocalFile, } from '.'; describe(getName(), () => { describe('readLocalFile', () => { + beforeEach(() => { + setAdminConfig({ localDir: '' }); + }); + it('reads buffer', async () => { expect(await readLocalFile(__filename)).toBeInstanceOf(Buffer); }); @@ -46,7 +50,7 @@ describe(getName(), () => { it('returns path for file', async () => { await withDir( async (localDir) => { - setFsConfig({ + setAdminConfig({ localDir: localDir.path, }); diff --git a/lib/util/fs/index.ts b/lib/util/fs/index.ts index 0e978cd4a666a20b18facda3953acdb91746a3c7..71f4c42bf3bc6c8479f51c1c8b152c31cb732ab9 100644 --- a/lib/util/fs/index.ts +++ b/lib/util/fs/index.ts @@ -1,18 +1,10 @@ import * as fs from 'fs-extra'; import { isAbsolute, join, parse } from 'upath'; -import type { RenovateConfig } from '../../config/types'; +import { getAdminConfig } from '../../config/admin'; import { logger } from '../../logger'; export * from './proxies'; -let localDir = ''; -let cacheDir = ''; - -export function setFsConfig(config: Partial<RenovateConfig>): void { - localDir = config.localDir; - cacheDir = config.cacheDir; -} - export function getSubDirectory(fileName: string): string { return parse(fileName).dir; } @@ -34,6 +26,7 @@ export async function readLocalFile( fileName: string, encoding?: string ): Promise<string | Buffer> { + const { localDir } = getAdminConfig(); const localFileName = join(localDir, fileName); try { const fileContent = await fs.readFile(localFileName, encoding); @@ -48,11 +41,13 @@ export async function writeLocalFile( fileName: string, fileContent: string ): Promise<void> { + const { localDir } = getAdminConfig(); const localFileName = join(localDir, fileName); await fs.outputFile(localFileName, fileContent); } export async function deleteLocalFile(fileName: string): Promise<void> { + const { localDir } = getAdminConfig(); if (localDir) { const localFileName = join(localDir, fileName); await fs.remove(localFileName); @@ -64,6 +59,7 @@ export async function renameLocalFile( fromFile: string, toFile: string ): Promise<void> { + const { localDir } = getAdminConfig(); await fs.move(join(localDir, fromFile), join(localDir, toFile)); } @@ -74,6 +70,7 @@ export async function ensureDir(dirName: string): Promise<void> { // istanbul ignore next export async function ensureLocalDir(dirName: string): Promise<void> { + const { localDir } = getAdminConfig(); const localDirName = join(localDir, dirName); await fs.ensureDir(localDirName); } @@ -82,6 +79,7 @@ export async function ensureCacheDir( dirName: string, envPathVar?: string ): Promise<string> { + const { cacheDir } = getAdminConfig(); const envCacheDirName = envPathVar ? process.env[envPathVar] : null; const cacheDirName = envCacheDirName || join(cacheDir, dirName); await fs.ensureDir(cacheDirName); @@ -94,10 +92,12 @@ export async function ensureCacheDir( * without risk of that information leaking to other repositories/users. */ export function privateCacheDir(): string { + const { cacheDir } = getAdminConfig(); return join(cacheDir, '__renovate-private-cache'); } export function localPathExists(pathName: string): Promise<boolean> { + const { localDir } = getAdminConfig(); // Works for both files as well as directories return fs .stat(join(localDir, pathName)) diff --git a/lib/util/git/index.spec.ts b/lib/util/git/index.spec.ts index b0ae4b96ce60c02438837f3825ff530a5bfd5666..bf9445b65f77e5a886f85df12a0262ea5625eeb3 100644 --- a/lib/util/git/index.spec.ts +++ b/lib/util/git/index.spec.ts @@ -2,6 +2,7 @@ import fs from 'fs-extra'; import Git from 'simple-git'; import tmp from 'tmp-promise'; import { getName } from '../../../test/util'; +import { setAdminConfig } from '../../config/admin'; import * as git from '.'; describe(getName(), () => { @@ -68,8 +69,8 @@ describe(getName(), () => { await repo.clone(base.path, '.', ['--bare']); await repo.addConfig('commit.gpgsign', 'false'); tmpDir = await tmp.dir({ unsafeCleanup: true }); + setAdminConfig({ localDir: tmpDir.path }); await git.initRepo({ - localDir: tmpDir.path, url: origin.path, gitAuthorName: 'Jest', gitAuthorEmail: 'Jest@example.com', @@ -105,7 +106,6 @@ describe(getName(), () => { await repo.commit('Add submodule'); await git.initRepo({ cloneSubmodules: true, - localDir: tmpDir.path, url: base.path, }); await git.syncGit(); @@ -370,7 +370,6 @@ describe(getName(), () => { await git.checkoutBranch('develop'); await git.initRepo({ - localDir: tmpDir.path, url: base.path, }); @@ -392,7 +391,6 @@ describe(getName(), () => { await repo.checkout(defaultBranch); await git.initRepo({ - localDir: tmpDir.path, url: base.path, }); @@ -400,7 +398,6 @@ describe(getName(), () => { expect(git.branchExists('renovate/test')).toBe(true); await git.initRepo({ - localDir: tmpDir.path, url: base.path, }); @@ -429,7 +426,6 @@ describe(getName(), () => { await repo.commit('Add submodule'); await git.initRepo({ cloneSubmodules: true, - localDir: tmpDir.path, url: base.path, }); await git.syncGit(); @@ -440,7 +436,6 @@ describe(getName(), () => { it('should use extra clone configuration', async () => { await fs.emptyDir(tmpDir.path); await git.initRepo({ - localDir: tmpDir.path, url: origin.path, extraCloneOpts: { '-c': 'extra.clone.config=test-extra-config-value', diff --git a/lib/util/git/index.ts b/lib/util/git/index.ts index db1a25825e372b8938c403744d604d19562eddb3..01629bd80012e91466653befdaba669eba82bc53 100644 --- a/lib/util/git/index.ts +++ b/lib/util/git/index.ts @@ -7,6 +7,7 @@ import Git, { StatusResult as StatusResult_, } from 'simple-git'; import { join } from 'upath'; +import { getAdminConfig } from '../../config/admin'; import { configFileNames } from '../../config/app-strings'; import { RenovateConfig } from '../../config/types'; import { @@ -36,7 +37,6 @@ export type DiffResult = DiffResult_; export type CommitSha = string; interface StorageConfig { - localDir: string; currentBranch?: string; url: string; extraCloneOpts?: GitOptions; @@ -171,7 +171,8 @@ export async function initRepo(args: StorageConfig): Promise<void> { config.ignoredAuthors = []; config.additionalBranches = []; config.branchIsModified = {}; - git = Git(config.localDir); + const { localDir } = getAdminConfig(); + git = Git(localDir); gitInitialized = false; await fetchBranchCommits(); } @@ -252,8 +253,9 @@ export async function syncGit(): Promise<void> { return; } gitInitialized = true; - logger.debug('Initializing git repository into ' + config.localDir); - const gitHead = join(config.localDir, '.git/HEAD'); + const { localDir } = getAdminConfig(); + logger.debug('Initializing git repository into ' + localDir); + const gitHead = join(localDir, '.git/HEAD'); let clone = true; if (await fs.exists(gitHead)) { @@ -277,7 +279,7 @@ export async function syncGit(): Promise<void> { } } if (clone) { - await fs.emptyDir(config.localDir); + await fs.emptyDir(localDir); const cloneStart = Date.now(); try { // clone only the default branch @@ -690,7 +692,8 @@ export async function commitFiles({ await writePrivateKey(); privateKeySet = true; } - await configSigningKey(config.localDir); + const { localDir } = getAdminConfig(); + await configSigningKey(localDir); try { await git.reset(ResetMode.HARD); await git.raw(['clean', '-fd']); @@ -701,7 +704,7 @@ export async function commitFiles({ // istanbul ignore if if (file.name === '|delete|') { deleted.push(file.contents as string); - } else if (await isDirectory(join(config.localDir, file.name))) { + } else if (await isDirectory(join(localDir, file.name))) { fileNames.push(file.name); await gitAdd(file.name); } else { @@ -713,7 +716,7 @@ export async function commitFiles({ } else { contents = file.contents; } - await fs.outputFile(join(config.localDir, file.name), contents); + await fs.outputFile(join(localDir, file.name), contents); } } // istanbul ignore if diff --git a/lib/util/index.ts b/lib/util/index.ts index 67239ec5cd4a21003a24fc49b956368df1e1d4de..0d7c8fbf0f079ab32703f3441143c5be0f1a4918 100644 --- a/lib/util/index.ts +++ b/lib/util/index.ts @@ -1,14 +1,3 @@ -import type { RenovateConfig } from '../config/types'; -import { setExecConfig } from './exec'; -import { setFsConfig } from './fs'; - -export async function setUtilConfig( - config: Partial<RenovateConfig> -): Promise<void> { - await setExecConfig(config); - setFsConfig(config); -} - export function sampleSize(array: string[], n: number): string[] { const length = array == null ? 0 : array.length; if (!length || n < 1) { diff --git a/lib/workers/branch/index.spec.ts b/lib/workers/branch/index.spec.ts index e092459f7eab6b95a64cfb8b8e0a62274b75cd9d..f3157d31580089eac1a788afd19ad85fbef03fae 100644 --- a/lib/workers/branch/index.spec.ts +++ b/lib/workers/branch/index.spec.ts @@ -7,6 +7,7 @@ import { platform, } from '../../../test/util'; import { setAdminConfig } from '../../config/admin'; +import type { RepoAdminConfig } from '../../config/types'; import { MANAGER_LOCKFILE_ERROR, REPOSITORY_CHANGED, @@ -62,6 +63,8 @@ const sanitize = mocked(_sanitize); const fs = mocked(_fs); const limits = mocked(_limits); +const adminConfig: RepoAdminConfig = { localDir: '', cacheDir: '' }; + describe(getName(), () => { describe('processBranch', () => { const updatedPackageFiles: PackageFilesResult = { @@ -94,7 +97,7 @@ describe(getName(), () => { body: '', }, }); - setAdminConfig(); + setAdminConfig(adminConfig); sanitize.sanitize.mockImplementation((input) => input); }); afterEach(() => { @@ -382,7 +385,7 @@ describe(getName(), () => { git.branchExists.mockReturnValue(true); commit.commitFilesToBranch.mockResolvedValueOnce(null); automerge.tryBranchAutomerge.mockResolvedValueOnce('automerged'); - setAdminConfig({ dryRun: true }); + setAdminConfig({ ...adminConfig, dryRun: true }); await branchWorker.processBranch(config); expect(automerge.tryBranchAutomerge).toHaveBeenCalledTimes(1); expect(prWorker.ensurePr).toHaveBeenCalledTimes(0); @@ -634,7 +637,7 @@ describe(getName(), () => { checkExisting.prAlreadyExisted.mockResolvedValueOnce({ state: PrState.Closed, } as Pr); - setAdminConfig({ dryRun: true }); + setAdminConfig({ ...adminConfig, dryRun: true }); expect(await branchWorker.processBranch(config)).toMatchSnapshot(); }); @@ -644,7 +647,7 @@ describe(getName(), () => { state: PrState.Open, } as Pr); git.isBranchModified.mockResolvedValueOnce(true); - setAdminConfig({ dryRun: true }); + setAdminConfig({ ...adminConfig, dryRun: true }); expect(await branchWorker.processBranch(config)).toMatchSnapshot(); }); @@ -666,7 +669,7 @@ describe(getName(), () => { git.isBranchModified.mockResolvedValueOnce(true); schedule.isScheduledNow.mockReturnValueOnce(false); commit.commitFilesToBranch.mockResolvedValueOnce(null); - setAdminConfig({ dryRun: true }); + setAdminConfig({ ...adminConfig, dryRun: true }); expect( await branchWorker.processBranch({ ...config, @@ -699,7 +702,7 @@ describe(getName(), () => { pr: {}, } as EnsurePrResult); commit.commitFilesToBranch.mockResolvedValueOnce(null); - setAdminConfig({ dryRun: true }); + setAdminConfig({ ...adminConfig, dryRun: true }); expect( await branchWorker.processBranch({ ...config, @@ -773,12 +776,12 @@ describe(getName(), () => { schedule.isScheduledNow.mockReturnValueOnce(false); commit.commitFilesToBranch.mockResolvedValueOnce(null); - const adminConfig = { + setAdminConfig({ + ...adminConfig, allowedPostUpgradeCommands: ['^echo {{{versioning}}}$'], allowPostUpgradeCommandTemplating: true, exposeAllEnv: true, - }; - setAdminConfig(adminConfig); + }); const result = await branchWorker.processBranch({ ...config, @@ -853,12 +856,12 @@ describe(getName(), () => { schedule.isScheduledNow.mockReturnValueOnce(false); commit.commitFilesToBranch.mockResolvedValueOnce(null); - const adminConfig = { + setAdminConfig({ + ...adminConfig, allowedPostUpgradeCommands: ['^exit 1$'], allowPostUpgradeCommandTemplating: true, exposeAllEnv: true, - }; - setAdminConfig(adminConfig); + }); exec.exec.mockRejectedValue(new Error('Meh, this went wrong!')); @@ -922,12 +925,12 @@ describe(getName(), () => { schedule.isScheduledNow.mockReturnValueOnce(false); commit.commitFilesToBranch.mockResolvedValueOnce(null); - const adminConfig = { + setAdminConfig({ + ...adminConfig, allowedPostUpgradeCommands: ['^echo {{{versioning}}}$'], allowPostUpgradeCommandTemplating: false, exposeAllEnv: true, - }; - setAdminConfig(adminConfig); + }); const result = await branchWorker.processBranch({ ...config, postUpgradeTasks: { @@ -1002,12 +1005,12 @@ describe(getName(), () => { schedule.isScheduledNow.mockReturnValueOnce(false); commit.commitFilesToBranch.mockResolvedValueOnce(null); - const adminConfig = { + setAdminConfig({ + ...adminConfig, allowedPostUpgradeCommands: ['^echo {{{depName}}}$'], allowPostUpgradeCommandTemplating: true, exposeAllEnv: true, - }; - setAdminConfig(adminConfig); + }); const inconfig: BranchConfig = { ...config, @@ -1136,12 +1139,12 @@ describe(getName(), () => { schedule.isScheduledNow.mockReturnValueOnce(false); commit.commitFilesToBranch.mockResolvedValueOnce(null); - const adminConfig = { + setAdminConfig({ + ...adminConfig, allowedPostUpgradeCommands: ['^echo hardcoded-string$'], allowPostUpgradeCommandTemplating: true, trustLevel: 'high', - }; - setAdminConfig(adminConfig); + }); const inconfig: BranchConfig = { ...config, diff --git a/lib/workers/branch/lock-files/index.spec.ts b/lib/workers/branch/lock-files/index.spec.ts index dc73ebb3cb843f9a4d86deb7ffabcdf3fae09dfb..947caf80d64a7b24dff73a3860f5dfa4e14d74f9 100644 --- a/lib/workers/branch/lock-files/index.spec.ts +++ b/lib/workers/branch/lock-files/index.spec.ts @@ -1,4 +1,5 @@ import { getName, git, mocked } from '../../../../test/util'; +import { setAdminConfig } from '../../../config/admin'; import { getConfig } from '../../../config/defaults'; import * as _lockFiles from '../../../manager/npm/post-update'; import * as _lerna from '../../../manager/npm/post-update/lerna'; @@ -9,7 +10,7 @@ import type { PostUpdateConfig } from '../../../manager/types'; import * as _fs from '../../../util/fs/proxies'; import * as _hostRules from '../../../util/host-rules'; -const defaultConfig = getConfig(); +const config: PostUpdateConfig = getConfig(); const fs = mocked(_fs); const lockFiles = mocked(_lockFiles); @@ -29,12 +30,10 @@ const { writeUpdatedPackageFiles, getAdditionalFiles } = lockFiles; describe(getName(), () => { describe('writeUpdatedPackageFiles', () => { - let config: PostUpdateConfig; beforeEach(() => { - config = { - ...defaultConfig, + setAdminConfig({ localDir: 'some-tmp-dir', - }; + }); fs.outputFile = jest.fn(); }); it('returns if no updated packageFiles', async () => { @@ -70,12 +69,10 @@ describe(getName(), () => { }); }); describe('getAdditionalFiles', () => { - let config: PostUpdateConfig; beforeEach(() => { - config = { - ...defaultConfig, + setAdminConfig({ localDir: 'some-tmp-dir', - }; + }); git.getFile.mockResolvedValueOnce('some lock file contents'); npm.generateLockFile = jest.fn(); npm.generateLockFile.mockResolvedValueOnce({ diff --git a/lib/workers/global/index.ts b/lib/workers/global/index.ts index d7715983fe8c8c2771a19faa93e1a32437dd7a0b..6d096d4f8c4ce39b93e573c34fda55cc5f98c881 100644 --- a/lib/workers/global/index.ts +++ b/lib/workers/global/index.ts @@ -14,7 +14,7 @@ import type { } from '../../config/types'; import { CONFIG_PRESETS_INVALID } from '../../constants/error-messages'; import { getProblems, logger, setMeta } from '../../logger'; -import { setUtilConfig } from '../../util'; +import { setExecConfig } from '../../util/exec'; import * as hostRules from '../../util/host-rules'; import * as repositoryWorker from '../repository'; import { autodiscoverRepositories } from './autodiscover'; @@ -103,7 +103,7 @@ export async function start(): Promise<number> { break; } const repoConfig = await getRepositoryConfig(config, repository); - await setUtilConfig(repoConfig); + await setExecConfig(repoConfig); if (repoConfig.hostRules) { hostRules.clear(); repoConfig.hostRules.forEach((rule) => hostRules.add(rule)); diff --git a/lib/workers/repository/index.spec.ts b/lib/workers/repository/index.spec.ts index c6c6f5e5c1f922caa537e32cac31cf3b6ff38be4..cbc9cd3d543a0b673b520bc7802a91466be4defc 100644 --- a/lib/workers/repository/index.spec.ts +++ b/lib/workers/repository/index.spec.ts @@ -1,6 +1,7 @@ import { mock } from 'jest-mock-extended'; import { RenovateConfig, getConfig, getName, mocked } from '../../../test/util'; +import { setAdminConfig } from '../../config/admin'; import * as _process from './process'; import { ExtractResult } from './process/extract-update'; import { renovateRepository } from '.'; @@ -17,6 +18,7 @@ describe(getName(), () => { let config: RenovateConfig; beforeEach(() => { config = getConfig(); + setAdminConfig({ localDir: '' }); }); it('runs', async () => { process.extractDependencies.mockResolvedValue(mock<ExtractResult>()); diff --git a/lib/workers/repository/index.ts b/lib/workers/repository/index.ts index 162ac84aeb1e41fb9c5e4e9515ac0754682eb227..ecce455412db6a37b05c6c4345cd00ed1d3bb387 100644 --- a/lib/workers/repository/index.ts +++ b/lib/workers/repository/index.ts @@ -1,5 +1,5 @@ import fs from 'fs-extra'; -import { setAdminConfig } from '../../config/admin'; +import { getAdminConfig, setAdminConfig } from '../../config/admin'; import type { RenovateConfig } from '../../config/types'; import { logger, setMeta } from '../../logger'; import { deleteLocalFile, privateCacheDir } from '../../util/fs'; @@ -28,16 +28,16 @@ export async function renovateRepository( repoConfig: RenovateConfig ): Promise<ProcessResult> { splitInit(); - let config = { ...repoConfig }; - setAdminConfig(config); + let config = setAdminConfig(repoConfig); setMeta({ repository: config.repository }); logger.info({ renovateVersion }, 'Repository started'); logger.trace({ config }); let repoResult: ProcessResult; queue.clear(); + const { localDir } = getAdminConfig(); try { - await fs.ensureDir(config.localDir); - logger.debug('Using localDir: ' + config.localDir); + await fs.ensureDir(localDir); + logger.debug('Using localDir: ' + localDir); config = await initRepo(config); addSplit('init'); const { branches, branchList, packageFiles } = await extractDependencies( @@ -57,7 +57,7 @@ export async function renovateRepository( const errorRes = await handleError(config, err); repoResult = processResult(config, errorRes); } - if (config.localDir && !config.persistRepoData) { + if (localDir && !config.persistRepoData) { try { await deleteLocalFile('.'); } catch (err) /* istanbul ignore if */ { diff --git a/lib/workers/repository/init/cache.spec.ts b/lib/workers/repository/init/cache.spec.ts index 6dbb39a1264897f63550b7df78b593863cb2bbc1..52af4a3f35c1b54dc8c0360fe6f8c65601697583 100644 --- a/lib/workers/repository/init/cache.spec.ts +++ b/lib/workers/repository/init/cache.spec.ts @@ -1,4 +1,5 @@ import { RenovateConfig, getConfig, getName } from '../../../../test/util'; +import { setAdminConfig } from '../../../config/admin'; import { initializeCaches } from './cache'; describe(getName(), () => { @@ -6,6 +7,7 @@ describe(getName(), () => { let config: RenovateConfig; beforeEach(() => { config = { ...getConfig() }; + setAdminConfig({ cacheDir: '' }); }); it('initializes', async () => { expect(await initializeCaches(config)).toBeUndefined(); diff --git a/lib/workers/repository/init/index.spec.ts b/lib/workers/repository/init/index.spec.ts index 54e9a8e7f1de9dd312d40cd12a35c2fa750036c5..b453a079a3f929a957e915603e891bba0722e032 100644 --- a/lib/workers/repository/init/index.spec.ts +++ b/lib/workers/repository/init/index.spec.ts @@ -1,4 +1,5 @@ import { getName, logger, mocked } from '../../../../test/util'; +import { setAdminConfig } from '../../../config/admin'; import * as _secrets from '../../../config/secrets'; import * as _onboarding from '../onboarding/branch'; import * as _apis from './apis'; @@ -22,6 +23,13 @@ const onboarding = mocked(_onboarding); const secrets = mocked(_secrets); describe(getName(), () => { + beforeEach(() => { + setAdminConfig({ localDir: '', cacheDir: '' }); + }); + afterEach(() => { + setAdminConfig(); + }); + describe('initRepo', () => { it('runs', async () => { apis.initApis.mockResolvedValue({} as never); diff --git a/lib/workers/repository/stats.ts b/lib/workers/repository/stats.ts index 7384796e3efeac8603da72a95b927d0d197fd0ec..3d15ec92fd74e4332c6d4004f97da70b04b44ca9 100644 --- a/lib/workers/repository/stats.ts +++ b/lib/workers/repository/stats.ts @@ -5,6 +5,7 @@ import type { RequestStats } from '../../util/http/types'; export function printRequestStats(): void { const httpRequests = memCache.get<RequestStats[]>('http-requests'); + // istanbul ignore next if (!httpRequests) { return; }