Merge pull request #3152 from Master-Guy/issues/1944

Issues/1944
This commit is contained in:
hydroflame 2022-03-20 14:21:28 -04:00 committed by GitHub
commit d2dedace2e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 45 additions and 38 deletions

@ -347,7 +347,7 @@ Kills all scripts on the current server.
ls
^^
$ ls [dir] [| grep pattern]
$ ls [dir] [--grep pattern]
Prints files and directories on the current server to the Terminal screen.
@ -358,19 +358,21 @@ followed by the files (also in alphabetical order).
The :code:`dir` optional parameter allows you to specify the directory for which to display
files.
The :code:`| grep pattern` optional parameter allows you to only display files and directories
The :code:`--grep pattern` optional parameter allows you to only display files and directories
with a certain pattern in their names.
The :code:`-l` optional parameter allows you to force each item onto a single line.
Examples::
// List files/directories with the '.script' extension in the current directory
$ ls | grep .script
$ ls -l --grep .script
// List files/directories with the '.js' extension in the root directory
$ ls / | grep .js
$ ls / -l --grep .js
// List files/directories with the word 'purchase' in the name, in the :code:`scripts` directory
$ ls scripts | grep purchase
$ ls scripts -l --grep purchase
lscpu

@ -26,7 +26,7 @@ export const TerminalHelpText: string[] = [
" hostname Displays the hostname of the machine",
" kill [script/pid] [args...] Stops the specified script on the current server ",
" killall Stops all running scripts on the current machine",
" ls [dir] [| grep pattern] Displays all files on the machine",
" ls [dir] [--grep pattern] Displays all files on the machine",
" lscpu Displays the number of CPU cores on the machine",
" mem [script] [-t n] Displays the amount of RAM required to run the script",
" mv [src] [dest] Move/rename a text or script file",
@ -295,28 +295,30 @@ export const HelpTexts: IMap<string[]> = {
" ",
],
ls: [
"Usage: ls [dir] [| grep pattern]",
"Usage: ls [dir] [-l] [--grep pattern]",
" ",
"The ls command, with no arguments, prints all files and directories on the current server's directory to the Terminal screen. ",
"The files will be displayed in alphabetical order. ",
" ",
"The 'dir' optional parameter can be used to display files/directories in another directory.",
" ",
"The '| grep pattern' optional parameter can be used to only display files whose filenames match the specified pattern.",
"The '-l' optional parameter allows you to force each item onto a single line.",
" ",
"The '--grep pattern' optional parameter can be used to only display files whose filenames match the specified pattern.",
" ",
"Examples:",
" ",
"List all files with the '.script' extension in the current directory:",
" ",
" ls | grep .script",
" ls -l --grep .script",
" ",
"List all files with the '.js' extension in the root directory:",
" ",
" ls / | grep .js",
" ls / -l --grep .js",
" ",
"List all files with the word 'purchase' in the filename, in the 'scripts' directory:",
" ",
" ls scripts | grep purchase",
" ls scripts -l --grep purchase",
" ",
],
lscpu: ["Usage: lscpu", " ", "Prints the number of CPU Cores the current server has", " "],

@ -8,6 +8,7 @@ import { BaseServer } from "../../Server/BaseServer";
import { evaluateDirectoryPath, getFirstParentDirectory, isValidDirectoryPath } from "../DirectoryHelpers";
import { IRouter } from "../../ui/Router";
import { ITerminal } from "../ITerminal";
import * as libarg from "arg"
export function ls(
terminal: ITerminal,
@ -16,44 +17,46 @@ export function ls(
server: BaseServer,
args: (string | number | boolean)[],
): void {
let flags;
try {
flags = libarg({
'-l': Boolean,
'--grep': String,
'-g': '--grep',
},
{ argv: args }
)
} catch (e) {
// catch passing only -g / --grep with no string to use as the search
incorrectUsage()
return;
}
const filter = flags['--grep']
const numArgs = args.length;
function incorrectUsage(): void {
terminal.error("Incorrect usage of ls command. Usage: ls [dir] [| grep pattern]");
terminal.error("Incorrect usage of ls command. Usage: ls [dir] [-l] [-g, --grep pattern]");
}
if (numArgs > 4 || numArgs === 2) {
if (numArgs > 4) {
return incorrectUsage();
}
// Grep
let filter = ""; // Grep
// Directory path
let prefix = terminal.cwd();
if (!prefix.endsWith("/")) {
prefix += "/";
}
// If there are 3+ arguments, then the last 3 must be for grep
if (numArgs >= 3) {
if (args[numArgs - 2] !== "grep" || args[numArgs - 3] !== "|") {
return incorrectUsage();
}
filter = args[numArgs - 1] + "";
// If first arg doesn't contain a - it must be the file/folder
const dir = (args[0] && typeof args[0] == "string" && !args[0].startsWith("-")) ? args[0] : ""
const newPath = evaluateDirectoryPath(dir + "", terminal.cwd());
prefix = newPath || "";
if (!prefix.endsWith("/")) {
prefix += "/";
}
// If the second argument is not a pipe, then it must be for listing a directory
if (numArgs >= 1 && args[0] !== "|") {
const newPath = evaluateDirectoryPath(args[0] + "", terminal.cwd());
prefix = newPath ? newPath : "";
if (prefix != null) {
if (!prefix.endsWith("/")) {
prefix += "/";
}
if (!isValidDirectoryPath(prefix)) {
return incorrectUsage();
}
}
if (!isValidDirectoryPath(prefix)) {
return incorrectUsage();
}
// Root directory, which is the same as no 'prefix' at all
@ -169,9 +172,9 @@ export function ls(
);
}
function postSegments(segments: string[], style?: any, linked?: boolean): void {
function postSegments(segments: string[], flags: any, style?: any, linked?: boolean): void {
const maxLength = Math.max(...segments.map((s) => s.length)) + 1;
const filesPerRow = Math.ceil(80 / maxLength);
const filesPerRow = flags["-l"] === true ? 1 : Math.ceil(80 / maxLength);
for (let i = 0; i < segments.length; i++) {
let row = "";
for (let col = 0; col < filesPerRow; col++) {
@ -203,6 +206,6 @@ export function ls(
{ segments: allScripts, style: { color: "yellow", fontStyle: "bold" }, linked: true },
].filter((g) => g.segments.length > 0);
for (let i = 0; i < groups.length; i++) {
postSegments(groups[i].segments, groups[i].style, groups[i].linked);
postSegments(groups[i].segments, flags, groups[i].style, groups[i].linked);
}
}