mirror of
https://github.com/bitburner-official/bitburner-src.git
synced 2024-10-23 10:13:13 +02:00
4e022c68e9
Fix cp error messages Add support for directory destinations (e.g. copy file.js directory)
108 lines
3.2 KiB
TypeScript
108 lines
3.2 KiB
TypeScript
import { ITerminal } from "../ITerminal";
|
|
import { IRouter } from "../../ui/Router";
|
|
import { IPlayer } from "../../PersonObjects/IPlayer";
|
|
import { BaseServer } from "../../Server/BaseServer";
|
|
import { isScriptFilename } from "../../Script/isScriptFilename";
|
|
import { getDestinationFilepath, areFilesEqual } from "../DirectoryHelpers";
|
|
|
|
export function cp(
|
|
terminal: ITerminal,
|
|
router: IRouter,
|
|
player: IPlayer,
|
|
server: BaseServer,
|
|
args: (string | number | boolean)[],
|
|
): void {
|
|
try {
|
|
if (args.length !== 2) {
|
|
terminal.error("Incorrect usage of cp command. Usage: cp [src] [dst]");
|
|
return;
|
|
}
|
|
// Convert a relative path source file to the absolute path.
|
|
const src = terminal.getFilepath(args[0] + "");
|
|
if (src === null) {
|
|
terminal.error("src cannot be a directory");
|
|
return;
|
|
}
|
|
|
|
// Get the destination based on the source file and the current directory
|
|
const t_dst = getDestinationFilepath(args[1] + "", src, terminal.cwd());
|
|
if (t_dst === null) {
|
|
terminal.error("error parsing dst file");
|
|
return;
|
|
}
|
|
|
|
// Convert a relative path destination file to the absolute path.
|
|
const dst = terminal.getFilepath(t_dst);
|
|
if (areFilesEqual(src, dst)) {
|
|
terminal.error("src and dst cannot be the same");
|
|
return;
|
|
}
|
|
const srcExt = src.slice(src.lastIndexOf("."));
|
|
const dstExt = dst.slice(dst.lastIndexOf("."));
|
|
if (srcExt !== dstExt) {
|
|
terminal.error("src and dst must have the same extension.");
|
|
return;
|
|
}
|
|
const filename = terminal.getFilepath(src);
|
|
if (!isScriptFilename(filename) && !filename.endsWith(".txt")) {
|
|
terminal.error("cp only works for scripts and .txt files");
|
|
return;
|
|
}
|
|
|
|
// Scp for txt files
|
|
if (filename.endsWith(".txt")) {
|
|
let txtFile = null;
|
|
for (let i = 0; i < server.textFiles.length; ++i) {
|
|
if (server.textFiles[i].fn === filename) {
|
|
txtFile = server.textFiles[i];
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (txtFile === null) {
|
|
return terminal.error("No such file exists!");
|
|
}
|
|
|
|
const tRes = server.writeToTextFile(dst, txtFile.text);
|
|
if (!tRes.success) {
|
|
terminal.error("cp failed");
|
|
return;
|
|
}
|
|
if (tRes.overwritten) {
|
|
terminal.print(`WARNING: ${dst} already exists and will be overwriten`);
|
|
terminal.print(`${dst} overwritten`);
|
|
return;
|
|
}
|
|
terminal.print(`${dst} copied`);
|
|
return;
|
|
}
|
|
|
|
// Get the current script
|
|
let sourceScript = null;
|
|
for (let i = 0; i < server.scripts.length; ++i) {
|
|
if (filename == server.scripts[i].filename) {
|
|
sourceScript = server.scripts[i];
|
|
break;
|
|
}
|
|
}
|
|
if (sourceScript == null) {
|
|
terminal.error("cp failed. No such script exists");
|
|
return;
|
|
}
|
|
|
|
const sRes = server.writeToScriptFile(dst, sourceScript.code);
|
|
if (!sRes.success) {
|
|
terminal.error(`cp failed`);
|
|
return;
|
|
}
|
|
if (sRes.overwritten) {
|
|
terminal.print(`WARNING: ${dst} already exists and will be overwritten`);
|
|
terminal.print(`${dst} overwritten`);
|
|
return;
|
|
}
|
|
terminal.print(`${dst} copied`);
|
|
} catch (e) {
|
|
terminal.error(e + "");
|
|
}
|
|
}
|