core: support hydrooj patch

pull/549/head
undefined 2 years ago
parent 4d7190b9b4
commit 90e4b8040e
No known key found for this signature in database

@ -0,0 +1,21 @@
import child from 'child_process';
import fs from 'fs';
import path from 'path';
import superagent from 'superagent';
if (!process.argv[2]) throw new Error('No target specified');
// TODO support module other than packages
const target = process.argv[2].startsWith('packages/') ? process.argv[2] : `packages/${process.argv[2]}`;
const result = child.execSync(`git diff ${target}`);
const patch = result.toString().replace(new RegExp(`${target}/`, 'g'), '');
const filename = `${path.basename(target)}.patch`;
fs.writeFileSync(filename, patch);
superagent.post('https://hydro.ac/paste')
.set('accept', 'application/json')
.send({ body: patch, filename })
.end((err, res) => {
if (err) throw err;
console.log('Paste created on ', res.text);
});

@ -25,7 +25,8 @@
"lint:ui:ci": "yarn workspace @hydrooj/ui-default lint --ext .js,.ts,.jsx,.tsx .",
"debug": "node --trace-warnings --async-stack-traces --trace-deprecation packages/hydrooj/bin/hydrooj --debug --template",
"start": "packages/hydrooj/bin/hydrooj",
"postinstall": "node build/prepare.js"
"postinstall": "node build/prepare.js",
"gen-patch": "node -r @hydrooj/utils/lib/register build/gen-patch.ts"
},
"version": "1.0.0",
"license": "AGPL-3.0-only",

@ -204,6 +204,7 @@ if (!argv.args[0] || argv.args[0] === 'cli') {
fs.removeSync(newAddonPath);
console.log(`Successfully uninstalled ${name}.`);
});
require('../src/commands/patch').register(cli);
cli.help();
cli.parse();
if (!cli.matchedCommand) {

@ -0,0 +1,31 @@
import child from 'child_process';
import { CAC } from 'cac';
import fs from 'fs-extra';
import superagent from 'superagent';
import { Logger } from '@hydrooj/utils';
const logger = new Logger('patch');
export function register(cli: CAC) {
cli.command('patch <module> <patch>').action(async (filename, patch) => {
const mod = require.resolve(filename);
if (!mod) {
logger.error('Module %s not found', filename);
return;
}
logger.info('Patching %s', mod);
const res = await superagent.get(patch);
logger.info('Downloaded patch');
for (let i = 0; i <= 100; i++) {
const fp = `${mod}.${i}.patch`;
if (fs.existsSync(fp)) continue;
patch = fp;
break;
}
await fs.writeFile(patch, res.text);
child.execSync(`patch ${mod} -o ${mod} < ${patch}`);
logger.info('Patched %s', mod);
});
// TODO: support revert patch
}
Loading…
Cancel
Save