Merge pull request #26591 from vector-im/johannes/one-watcher-to-rule-them-all

This commit is contained in:
Johannes Marbach 2023-11-16 08:00:24 +01:00 committed by GitHub
commit 897bca6ca2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -19,13 +19,7 @@ const INCLUDE_LANGS = [...new Set([...fs.readdirSync(I18N_BASE_PATH), ...fs.read
// cpx includes globbed parts of the filename in the destination, but excludes
// common parents. Hence, "res/{a,b}/**": the output will be "dest/a/..." and
// "dest/b/...".
const COPY_LIST: [
sourceGlob: string,
outputPath: string,
opts?: {
directwatch?: 1;
},
][] = [
const COPY_LIST: [sourceGlob: string, outputPath: string][] = [
["res/apple-app-site-association", "webapp"],
["res/manifest.json", "webapp"],
["res/sw.js", "webapp"],
@ -35,8 +29,8 @@ const COPY_LIST: [
["res/vector-icons/**", "webapp/vector-icons"],
["res/decoder-ring/**", "webapp/decoder-ring"],
["node_modules/matrix-react-sdk/res/media/**", "webapp/media"],
["node_modules/@matrix-org/olm/olm_legacy.js", "webapp", { directwatch: 1 }],
["./config.json", "webapp", { directwatch: 1 }],
["node_modules/@matrix-org/olm/olm_legacy.js", "webapp"],
["./config.json", "webapp"],
["contribute.json", "webapp"],
];
const argv = parseArgs(process.argv.slice(2), {});
@ -60,6 +54,22 @@ if (!fs.existsSync("webapp/i18n/")) {
fs.mkdirSync("webapp/i18n/");
}
function createCpx(source: string, dest: string): Cpx {
const cpx = new Cpx(source, dest);
if (verbose) {
cpx.on("copy", (event) => {
console.log(`Copied: ${event.srcPath} --> ${event.dstPath}`);
});
}
return cpx;
}
const logWatch = (path: string) => {
if (verbose) {
console.log(`Watching: ${path}`);
}
};
function next(i: number, err?: Error): void {
errCheck(err);
@ -70,39 +80,30 @@ function next(i: number, err?: Error): void {
const ent = COPY_LIST[i];
const source = ent[0];
const dest = ent[1];
const opts = ent[2] || {};
const cpx = new Cpx(source, dest);
if (verbose) {
cpx.on("copy", (event) => {
console.log(`Copied: ${event.srcPath} --> ${event.dstPath}`);
});
cpx.on("remove", (event) => {
console.log(`Removed: ${event.path}`);
});
}
const cb = (err?: Error): void => {
next(i + 1, err);
};
if (watch) {
if (opts.directwatch) {
// cpx -w creates a watcher for the parent of any files specified,
// which in the case of config.json is '.', which inevitably takes
// ages to crawl. So we create our own watcher on the files
// instead.
const copy = (): void => {
cpx.copy(errCheck);
// which in the case of e.g. config.json is '.', which inevitably takes
// ages to crawl. To prevent this, we only use cpx for copying and resort
// to chokidar for watching.
const copy = (path: string): void => {
createCpx(path, dest).copy(errCheck);
};
chokidar.watch(source).on("add", copy).on("change", copy).on("ready", cb).on("error", errCheck);
chokidar
.watch(source)
.on("ready", () => {
logWatch(source);
cb();
})
.on("add", copy)
.on("change", copy)
.on("error", errCheck);
} else {
cpx.on("watch-ready", cb);
cpx.on("watch-error", cb);
cpx.watch();
}
} else {
cpx.copy(cb);
createCpx(source, dest).copy(cb);
}
}
@ -182,7 +183,14 @@ function watchLanguage(lang: string, dest: string, langFileMap: Record<string, s
};
[reactSdkFile, riotWebFile].forEach(function (f) {
chokidar.watch(f).on("add", makeLang).on("change", makeLang).on("error", errCheck);
chokidar
.watch(f)
.on("ready", () => {
logWatch(f);
})
.on("add", makeLang)
.on("change", makeLang)
.on("error", errCheck);
});
}