70 lines
2.2 KiB
JavaScript
70 lines
2.2 KiB
JavaScript
const { execFileSync } = require("child_process");
|
|
const fs = require("fs");
|
|
const path = require("path");
|
|
|
|
function commandExists(command) {
|
|
try {
|
|
execFileSync("where.exe", [command], { stdio: "ignore" });
|
|
return true;
|
|
} catch (e) {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
function run(command, args, options = {}) {
|
|
return execFileSync(command, args, Object.assign({ stdio: "inherit" }, options));
|
|
}
|
|
|
|
function addToZip(sourceDir, to, password) {
|
|
fs.mkdirSync(path.dirname(path.resolve(to)), { recursive: true });
|
|
|
|
if (password) {
|
|
if (!commandExists("7z.exe") && !commandExists("7z")) {
|
|
throw new Error("Windows password zip requires 7z in PATH");
|
|
}
|
|
const bin = commandExists("7z.exe") ? "7z.exe" : "7z";
|
|
run(bin, ["a", "-tzip", `-p${password}`, "-y", path.resolve(to), "."], { cwd: sourceDir, stdio: "inherit" });
|
|
return;
|
|
}
|
|
|
|
const destination = path.resolve(to).replace(/'/g, "''");
|
|
const source = path.resolve(sourceDir, "*").replace(/'/g, "''");
|
|
const update = fs.existsSync(to) ? " -Update" : "";
|
|
const script = `Compress-Archive -Path '${source}' -DestinationPath '${destination}'${update} -Force`;
|
|
run("powershell.exe", ["-NoProfile", "-Command", script]);
|
|
}
|
|
|
|
function addToTar(sourceDir, to) {
|
|
fs.mkdirSync(path.dirname(path.resolve(to)), { recursive: true });
|
|
const args = fs.existsSync(to) ? ["-rf", path.resolve(to), "."] : ["-cf", path.resolve(to), "."];
|
|
run("tar.exe", args, { cwd: sourceDir, stdio: "inherit" });
|
|
}
|
|
|
|
function zip(sourceDir, to, params = {}) {
|
|
if (params.type === "tar") {
|
|
addToTar(sourceDir, to);
|
|
} else {
|
|
addToZip(sourceDir, to, params.password);
|
|
}
|
|
}
|
|
|
|
function scp(from, to, params = {}) {
|
|
const source = path.resolve(from);
|
|
if (!fs.existsSync(source)) {
|
|
return;
|
|
}
|
|
|
|
if (params.pwd) {
|
|
if (!commandExists("pscp.exe") && !commandExists("pscp")) {
|
|
throw new Error("Windows scp with pwd requires pscp in PATH");
|
|
}
|
|
const bin = commandExists("pscp.exe") ? "pscp.exe" : "pscp";
|
|
run(bin, ["-pw", params.pwd, "-r", source, to]);
|
|
return;
|
|
}
|
|
|
|
run("scp.exe", ["-r", source, to]);
|
|
}
|
|
|
|
module.exports = { zip, scp };
|