myt/myvc-pull.js

134 lines
4.0 KiB
JavaScript
Raw Normal View History

2020-11-16 13:23:28 +00:00
2020-12-04 16:30:26 +00:00
const MyVC = require('./myvc');
2020-11-14 01:38:56 +00:00
const fs = require('fs-extra');
2021-10-14 08:34:40 +00:00
const nodegit = require('nodegit');
2022-02-02 04:05:31 +00:00
const ExporterEngine = require('./lib').ExporterEngine;
2020-12-02 07:35:26 +00:00
class Pull {
get usage() {
return {
description: 'Incorporate database routine changes into workspace',
params: {
force: 'Do it even if there are local changes',
checkout: 'Move to same database commit before pull',
update: 'Update routine file even is shasum is the same'
},
operand: 'remote'
};
}
get localOpts() {
return {
alias: {
force: 'f',
checkout: 'c',
update: 'u'
},
boolean: [
'force',
'checkout',
'update'
]
};
}
2020-12-02 07:35:26 +00:00
async run(myvc, opts) {
const conn = await myvc.dbConnect();
const repo = await myvc.openRepo();
if (!opts.force) {
async function hasChanges(diff) {
if (diff)
for (const patch of await diff.patches()) {
const match = patch
.newFile()
.path()
.match(/^routines\/(.+)\.sql$/);
if (match) return true;
}
return false;
}
// Check for unstaged changes
const unstagedDiff = await myvc.getUnstaged(repo);
if (await hasChanges(unstagedDiff))
throw new Error('You have unstaged changes, save them before pull');
// Check for staged changes
const stagedDiff = await myvc.getStaged(repo);
if (await hasChanges(stagedDiff))
throw new Error('You have staged changes, save them before pull');
}
// Checkout to remote commit
if (opts.checkout) {
const version = await myvc.fetchDbVersion();
if (version && version.gitCommit) {
const now = parseInt(new Date().toJSON());
const branchName = `myvc-pull_${now}`;
console.log(`Creating branch '${branchName}' from database commit.`);
const commit = await repo.getCommit(version.gitCommit);
const branch = await nodegit.Branch.create(repo,
`myvc-pull_${now}`, commit, () => {});
await repo.checkoutBranch(branch);
}
2021-10-14 08:34:40 +00:00
}
2020-12-02 07:35:26 +00:00
// Export routines to SQL files
console.log(`Incorporating routine changes.`);
2022-02-02 04:05:31 +00:00
const engine = new ExporterEngine(conn, opts.myvcDir);
await engine.init();
const shaSums = engine.shaSums;
2020-12-02 07:35:26 +00:00
const exportDir = `${opts.myvcDir}/routines`;
2020-12-19 01:06:06 +00:00
if (!await fs.pathExists(exportDir))
await fs.mkdir(exportDir);
// Delete old schemas
2020-12-19 01:06:06 +00:00
const schemas = await fs.readdir(exportDir);
for (const schema of schemas) {
if (opts.schemas.indexOf(schema) == -1)
await fs.remove(`${exportDir}/${schema}`, {recursive: true});
}
2020-12-02 07:35:26 +00:00
2022-02-02 04:05:31 +00:00
for (const schema in shaSums) {
if (!await fs.pathExists(`${exportDir}/${schema}`))
delete shaSums[schema];
}
// Export objects to SQL files
2020-12-02 07:35:26 +00:00
for (const schema of opts.schemas) {
let schemaDir = `${exportDir}/${schema}`;
2020-12-02 07:35:26 +00:00
if (!await fs.pathExists(schemaDir))
await fs.mkdir(schemaDir);
2022-02-02 04:05:31 +00:00
if (!shaSums[schema])
shaSums[schema] = {};
const sums = shaSums[schema];
for (const exporter of engine.exporters) {
const type = exporter.objectType;
const oldSums = sums[type] || {};
sums[type] = {};
await exporter.export(exportDir, schema, sums[type], oldSums, opts.update);
}
2020-12-02 07:35:26 +00:00
}
2022-02-02 04:05:31 +00:00
await engine.saveShaSums();
2020-11-14 01:38:56 +00:00
}
}
2020-12-02 07:35:26 +00:00
module.exports = Pull;
2020-11-14 01:38:56 +00:00
2020-12-02 07:35:26 +00:00
if (require.main === module)
new MyVC().run(Pull);