-
-
Notifications
You must be signed in to change notification settings - Fork 68
London | 26-SDC-Mar | Ebrahim Beiati-Asl | Sprint 3 | implements-shell-tool #376
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
708e4ce
972ae2b
09cde63
643fefa
c01eac6
8c5c05a
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,66 @@ | ||
| #!/usr/bin/env node | ||
| const fs = require("node:fs"); | ||
| //shared line counter across all files(matches cat -n) | ||
| let globalLineCounter = 1; | ||
|
|
||
| function printFile(filePath, options) { | ||
| try { | ||
| const content = fs.readFileSync(filePath, "utf-8"); | ||
| const lines = content.split("\n"); | ||
|
|
||
| if (lines.length && lines[lines.length - 1] === "") { | ||
| lines.pop(); | ||
| } | ||
|
|
||
| lines.forEach((line) => { | ||
| let prefix = ""; | ||
|
|
||
| const shouldNumber = | ||
| options.numberMode === "all" || | ||
| (options.numberMode === "non-empty" && line.trim() !== ""); | ||
|
|
||
| if (shouldNumber) { | ||
| prefix = `${String(globalLineCounter).padStart(6)}\t`; | ||
| globalLineCounter++; | ||
| } | ||
|
|
||
| process.stdout.write(`${prefix}${line}\n`); | ||
| }); | ||
| } catch (error) { | ||
| console.error(`cat: ${filePath}: ${error.message}`); | ||
| process.exitCode = 1; | ||
| } | ||
| } | ||
|
|
||
| function main() { | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This tool behaves slightly differently than built-in
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Your
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Thank you so much for that. I'll write an integration test to find the issue. |
||
| const args = process.argv.slice(2); | ||
|
|
||
| const options = { | ||
| numberMode: "off", | ||
| }; | ||
|
|
||
| const files = []; | ||
| args.forEach((arg) => { | ||
| if (arg === "-n") { | ||
| options.numberMode = "all"; | ||
| } else if (arg === "-b") { | ||
| options.numberMode = "non-empty"; | ||
| } else { | ||
| files.push(arg); | ||
| } | ||
| }); | ||
|
|
||
| if (files.length === 0) { | ||
| console.log("cat: missing file operand"); | ||
| process.exit(1); | ||
| } | ||
|
|
||
| files.forEach((file) => { | ||
| if(options.numberMode) { | ||
| globalLineCounter = 1; //reset line counter for each file if numbering is enabled | ||
| } | ||
| printFile(file, options); | ||
| }); | ||
| } | ||
|
|
||
| main(); | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,54 @@ | ||
| #!/usr/bin/env node | ||
| const fs = require("node:fs"); | ||
| function listDirectory(dirPath, showAll, onePerLine) { | ||
| try { | ||
| const entries = fs.readdirSync(dirPath, { withFileTypes: true }); | ||
| const filtered = entries.filter( | ||
| (entry) => showAll || !entry.name.startsWith("."), | ||
| ); | ||
|
|
||
| if (onePerLine) { | ||
| filtered.forEach((entry) => console.log(entry.name)); | ||
| } else { | ||
| const names = filtered.map((entry) => entry.name); | ||
| console.log(names.join(" ")); | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. In
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. We use |
||
| } | ||
| } catch (error) { | ||
| console.error(`Error reading directory ${dirPath}: ${error.message}`); | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. What exit code should our process terminate with if it hit an error? What does your code do? |
||
| process.exitCode = 1; | ||
| } | ||
| } | ||
| function main() { | ||
| const args = process.argv.slice(2); | ||
| const showAll = args.includes("-a"); | ||
| const onePerLine = args.includes("-1"); | ||
| //remove options from args | ||
| let directories = args.filter((arg) => arg !== "-a" && arg !== "-1"); | ||
|
|
||
| if (directories.length === 0) { | ||
| directories = [process.cwd()]; | ||
| } | ||
| directories.forEach((arg, index) => { | ||
| try { | ||
| const stats = fs.statSync(arg); | ||
|
|
||
| if (stats.isDirectory()) { | ||
| if (directories.length > 1) { | ||
| console.log(`${arg}:`) | ||
| }; | ||
| listDirectory(arg, showAll, onePerLine); | ||
| //add a blank line between directory listings if there are multiple directories | ||
| if (directories.length > 1 && index < directories.length - 1){ | ||
| console.log(""); | ||
| } | ||
|
|
||
| } else { | ||
| console.log(arg); // single file | ||
| } | ||
| } catch (error) { | ||
| console.error(`Error accessing ${arg}: ${error.message}`); | ||
| process.exitCode = 1; | ||
| } | ||
| }); | ||
| } | ||
| main(); | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,75 @@ | ||
| #!/usr/bin/env node | ||
| const fs = require("node:fs"); | ||
| // Function to count lines, words, and bytes in a file | ||
| function countFileContent(content) { | ||
| const rawLines = content.split("\n"); | ||
| const lines = rawLines[rawLines.length - 1] === "" ? rawLines.length - 1 : rawLines.length; | ||
| const words = content.trim().split(/\s+/).filter(Boolean).length; // Split by whitespace and filter out empty strings | ||
| const bytes = Buffer.byteLength(content, "utf8"); | ||
| return { lines, words, bytes }; | ||
| } | ||
|
|
||
| //print counts in the format of wc according to options | ||
| function printCounts(filePath, counts, options) { | ||
| const parts = []; | ||
| if (options.line) parts.push(counts.lines); | ||
| if (options.word) parts.push(counts.words); | ||
| if (options.byte) parts.push(counts.bytes); | ||
|
|
||
| console.log(parts.join("\t"), filePath); | ||
| } | ||
|
|
||
| function main() { | ||
| const args = process.argv.slice(2); | ||
| const options = { | ||
| line: false, | ||
| word: false, | ||
| byte: false, | ||
| }; | ||
|
|
||
| //Separate options from file paths | ||
| const files = []; | ||
| args.forEach((arg) => { | ||
| if (arg === "-l") options.line = true; | ||
| else if (arg === "-w") options.word = true; | ||
| else if (arg === "-c") options.byte = true; | ||
| else files.push(arg); | ||
| }); | ||
|
|
||
| if (files.length === 0) { | ||
| console.error("No files specified"); | ||
| process.exit(1); | ||
| } | ||
| //If no specific count options are provided, default to all counts (lines, words, bytes) | ||
| if (!options.line && !options.word && !options.byte) { | ||
| options.line = true; | ||
| options.word = true; | ||
| options.byte = true; | ||
| } | ||
|
|
||
| let totalCounts = { lines: 0, words: 0, bytes: 0 }; | ||
| const multipleFiles = files.length > 1; | ||
|
|
||
| files.forEach((file) => { | ||
| try { | ||
| const content = fs.readFileSync(file, "utf-8"); | ||
| const counts = countFileContent(content); | ||
|
|
||
| // Sum counts for total if multiple files | ||
| totalCounts.lines += counts.lines; | ||
| totalCounts.words += counts.words; | ||
| totalCounts.bytes += counts.bytes; | ||
|
|
||
| printCounts(file, counts, options); | ||
| } catch (error) { | ||
| console.error(`Error reading file ${file}: ${error.message}`); | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Same question about exit codes |
||
| process.exitCode = 1; | ||
| } | ||
| }); | ||
|
|
||
| // If multiple files, print total counts | ||
| if (multipleFiles) { | ||
| printCounts("total", totalCounts, options); | ||
| } | ||
| } | ||
| main(); | ||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This will still exit 0 if e.g. a file didn't exist.