mirror of
https://github.com/linux-odyssey/linux-odyssey.git
synced 2026-11-08 03:20:12 +08:00
Feat filegraph (#194)
* feat: update filegraph on touch command * feat: update filegraph on mkdir * feat: add different parsing opts for each command * refactor: replace axios with fetch. put handleCommand to a new file * feat: add config for mounting cli in dev stage * refactor: clean up unused validators * feat: add command handler for copy files. reuse resolvePath function * feat: add rm handler, support specific files deletion. Glob not supported yet * feat: handle discover cases that the folder is actually empty * feat: handle discover empty folder better and support rmdir * feat: handle mv command * refactor: remove unused console logs
This commit is contained in:
1 parent
a732c1d119
commit
f0a09ac4d9
19 files changed
+326
-119
No files matched your search
@@ -1,9 +1,5 @@
|
||||
import File, { FileObject } from './file.js'
|
||||
import {
|
||||
DuplicateItemError,
|
||||
ParentNotExistsError,
|
||||
FileNotExistsError,
|
||||
} from './errors.js'
|
||||
import { ParentNotExistsError, FileNotExistsError } from './errors.js'
|
||||
import { dirname } from './utils.js'
|
||||
|
||||
export interface IFileNode {
|
||||
@@ -29,15 +25,24 @@ export default class FileNode extends File implements IFileNode {
|
||||
) {
|
||||
const file = new FileNode(fileInput)
|
||||
if (file.path === this.path) {
|
||||
throw new DuplicateItemError(
|
||||
`File ${file.path} already exists in the tree: ${this.toString()}`
|
||||
)
|
||||
if (!this.discovered) {
|
||||
this.discovered = file.discovered
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
if (this.children.some((child) => child.path === file.path)) {
|
||||
throw new DuplicateItemError(
|
||||
`File ${file.path} already exists in the tree: ${this.toString()}`
|
||||
)
|
||||
let existing = false
|
||||
for (const child of this.children) {
|
||||
if (child.path === file.path) {
|
||||
existing = true
|
||||
if (!child.discovered) {
|
||||
child.discovered = file.discovered
|
||||
}
|
||||
break
|
||||
}
|
||||
}
|
||||
if (existing) {
|
||||
return
|
||||
}
|
||||
|
||||
const parentPath = dirname(file.path)
|
||||
@@ -48,7 +53,7 @@ export default class FileNode extends File implements IFileNode {
|
||||
// Recursively call addChild on the correct child node
|
||||
const childNode = this.children.find((child) => child.contains(file))
|
||||
if (childNode) {
|
||||
childNode.addChild(file)
|
||||
childNode.addChild(file, { makeParents })
|
||||
} else if (makeParents) {
|
||||
const parent = new FileNode({
|
||||
path: parentPath,
|
||||
@@ -95,6 +100,12 @@ export default class FileNode extends File implements IFileNode {
|
||||
// Update the state of this node
|
||||
this.discovered = this.discovered || fileNode.discovered
|
||||
|
||||
// the provided directory is empty, remove all children
|
||||
if (fileNode.empty) {
|
||||
this.children = []
|
||||
return
|
||||
}
|
||||
|
||||
fileNode.children.forEach((child) => {
|
||||
const existingChild = this.children.find((c) => c.path === child.path)
|
||||
if (existingChild) {
|
||||
@@ -140,4 +151,11 @@ export default class FileNode extends File implements IFileNode {
|
||||
.join('')
|
||||
return `${name}\n${childrenString}`
|
||||
}
|
||||
|
||||
include(filePath: string, type?: 'file' | 'directory'): boolean {
|
||||
if (this.path === filePath) {
|
||||
return type ? this.type === type : true
|
||||
}
|
||||
return this.children.some((child) => child.include(filePath, type))
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user