diff --git a/lib/config/definitions.js b/lib/config/definitions.js index db7100df41c4989c530382fecb7fe57ce1ad1210..16e58610c9eebeb2e214b6533d0bf6026b7fc7ed 100644 --- a/lib/config/definitions.js +++ b/lib/config/definitions.js @@ -1005,6 +1005,29 @@ const options = [ }, mergeable: true, }, + { + name: 'rust', + releaseStatus: 'unpublished', + description: 'Configuration option for Rust package management.', + stage: 'package', + type: 'json', + default: {}, + mergeable: true, + cli: false, + }, + { + name: 'cargo', + releaseStatus: 'unpublished', + description: 'Configuration object for Cargo crate renovation.', + stage: 'repository', + type: 'json', + default: { + enabled: false, + commitMessageTopic: 'Rust crate {{depName}}', + managerBranchPrefix: 'rust-', + }, + mergeable: true, + }, { name: 'supportPolicy', description: diff --git a/lib/manager/cargo/artifacts.js b/lib/manager/cargo/artifacts.js new file mode 100644 index 0000000000000000000000000000000000000000..60d8326a0efed233801f48a4b2ebb4c54d521986 --- /dev/null +++ b/lib/manager/cargo/artifacts.js @@ -0,0 +1,30 @@ +module.exports = { + getArtifacts, +}; + +async function getArtifacts( + cargoTomlFileName, + updatedDeps, + newCargoTomlContent, + config +) { + await logger.debug({ config }, `cargo.getArtifacts(${cargoTomlFileName})`); + let cargoLockFileName; + try { + cargoLockFileName = cargoTomlFileName.replace(/\.toml$/, '.lock'); + logger.debug('Updating ' + cargoLockFileName); + // TODO: Update cargo lock file + return null; + } catch (err) { + logger.warn( + { err, message: err.message }, + 'Failed to update Cargo lock file' + ); + return { + lockFileError: { + lockFile: cargoLockFileName, + stderr: err.message, + }, + }; + } +} diff --git a/lib/manager/cargo/extract.js b/lib/manager/cargo/extract.js new file mode 100644 index 0000000000000000000000000000000000000000..8ec60ac244b57ee5260f5513f9e5fec5c8dbf0d7 --- /dev/null +++ b/lib/manager/cargo/extract.js @@ -0,0 +1,9 @@ +module.exports = { + extractPackageFile, +}; + +function extractPackageFile(content, fileName) { + logger.trace(`cargo.extractPackageFile(${fileName})`); + // TODO: Extract cargo.toml dependencies + return null; +} diff --git a/lib/manager/cargo/index.js b/lib/manager/cargo/index.js new file mode 100644 index 0000000000000000000000000000000000000000..161560073db1064c84828dcf4b9f8d1b089bc0d8 --- /dev/null +++ b/lib/manager/cargo/index.js @@ -0,0 +1,14 @@ +const { extractPackageFile } = require('./extract'); +const { updateDependency } = require('./update'); +const { getArtifacts } = require('./artifacts'); + +const language = 'rust'; + +module.exports = { + extractPackageFile, + getArtifacts, + language, + updateDependency, + // TODO: support this + // supportsLockFileMaintenance: true, +}; diff --git a/lib/manager/cargo/update.js b/lib/manager/cargo/update.js new file mode 100644 index 0000000000000000000000000000000000000000..3c3fb715ae69ced06b4c4647491538d1bc967d34 --- /dev/null +++ b/lib/manager/cargo/update.js @@ -0,0 +1,9 @@ +module.exports = { + updateDependency, +}; + +function updateDependency(currentFileContent, upgrade) { + logger.debug({ config: upgrade }, 'cargo.updateDependency()'); + // TODO + return currentFileContent; +} diff --git a/lib/manager/index.js b/lib/manager/index.js index cecc51d10290b75be905c5f263ec5a9c8491b704..433e1ccf3cbb5e88d75a5db44c0e02eb31f21f0f 100644 --- a/lib/manager/index.js +++ b/lib/manager/index.js @@ -1,6 +1,7 @@ const managerList = [ 'bazel', 'buildkite', + 'cargo', 'circleci', 'composer', 'docker-compose', @@ -23,7 +24,15 @@ for (const manager of managerList) { managers[manager] = require(`./${manager}`); } -const languageList = ['docker', 'golang', 'js', 'node', 'php', 'python']; +const languageList = [ + 'docker', + 'golang', + 'js', + 'node', + 'php', + 'python', + 'rust', +]; const get = (manager, name) => managers[manager][name]; const getLanguageList = () => languageList; diff --git a/test/manager/cargo/__snapshots__/artifacts.spec.js.snap b/test/manager/cargo/__snapshots__/artifacts.spec.js.snap new file mode 100644 index 0000000000000000000000000000000000000000..9ab65d6d65bc49d07d5e3e3b923efa12cca392c9 --- /dev/null +++ b/test/manager/cargo/__snapshots__/artifacts.spec.js.snap @@ -0,0 +1,10 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`cargo.getArtifacts() catches errors 1`] = ` +Object { + "lockFileError": Object { + "lockFile": undefined, + "stderr": "Cannot read property 'replace' of undefined", + }, +} +`; diff --git a/test/manager/cargo/artifacts.spec.js b/test/manager/cargo/artifacts.spec.js new file mode 100644 index 0000000000000000000000000000000000000000..3c3a9ef6fbe87dfce7ebde2c77837363cfb20659 --- /dev/null +++ b/test/manager/cargo/artifacts.spec.js @@ -0,0 +1,16 @@ +const cargo = require('../../../lib/manager/cargo/artifacts'); + +let config; + +describe('cargo.getArtifacts()', () => { + beforeEach(() => { + jest.resetAllMocks(); + config = {}; + }); + it('returns null by default', async () => { + expect(await cargo.getArtifacts('cargo.toml', [], '', config)).toBeNull(); + }); + it('catches errors', async () => { + expect(await cargo.getArtifacts()).toMatchSnapshot(); + }); +}); diff --git a/test/manager/cargo/extract.spec.js b/test/manager/cargo/extract.spec.js new file mode 100644 index 0000000000000000000000000000000000000000..a4d7baf917c941b30bbc193a434ff6e5d733399a --- /dev/null +++ b/test/manager/cargo/extract.spec.js @@ -0,0 +1,13 @@ +const { extractPackageFile } = require('../../../lib/manager/cargo/extract'); + +describe('lib/manager/cargo/extract', () => { + describe('extractPackageFile()', () => { + let config; + beforeEach(() => { + config = {}; + }); + it('returns null for empty', () => { + expect(extractPackageFile('nothing here', config)).toBe(null); + }); + }); +}); diff --git a/test/manager/cargo/update.spec.js b/test/manager/cargo/update.spec.js new file mode 100644 index 0000000000000000000000000000000000000000..148c2484103e777ed6fab25601743adc8189a428 --- /dev/null +++ b/test/manager/cargo/update.spec.js @@ -0,0 +1,13 @@ +const { updateDependency } = require('../../../lib/manager/cargo/update'); + +describe('lib/manager/cargo/update', () => { + describe('updateDependency()', () => { + let config; + beforeEach(() => { + config = {}; + }); + it('returns same', () => { + expect(updateDependency('abc', config)).toEqual('abc'); + }); + }); +}); diff --git a/test/workers/repository/extract/__snapshots__/index.spec.js.snap b/test/workers/repository/extract/__snapshots__/index.spec.js.snap index 47c8d589f6d7449b2a0522ef1a97cd36b6277eb7..81f621ea2c5475cbfc1ebad80bb0eddd06db1bbc 100644 --- a/test/workers/repository/extract/__snapshots__/index.spec.js.snap +++ b/test/workers/repository/extract/__snapshots__/index.spec.js.snap @@ -8,6 +8,9 @@ Object { "buildkite": Array [ Object {}, ], + "cargo": Array [ + Object {}, + ], "circleci": Array [ Object {}, ],