@fnndsc/brasa 0.56.2 → 0.56.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/buildinfo.json +1 -1
- package/dist/builtins/berth/berth.d.ts +11 -0
- package/dist/builtins/berth/berth.js +53 -22
- package/dist/builtins/berth/berth.js.map +1 -1
- package/dist/builtins/berth/berthCube.d.ts +17 -2
- package/dist/builtins/berth/berthCube.js +22 -10
- package/dist/builtins/berth/berthCube.js.map +1 -1
- package/dist/builtins/debug.d.ts +24 -3
- package/dist/builtins/debug.js +66 -13
- package/dist/builtins/debug.js.map +1 -1
- package/dist/builtins/fs/acl.args.d.ts +5 -38
- package/dist/builtins/fs/acl.args.js +6 -72
- package/dist/builtins/fs/acl.args.js.map +1 -1
- package/dist/builtins/fs/acl.d.ts +100 -10
- package/dist/builtins/fs/acl.js +222 -68
- package/dist/builtins/fs/acl.js.map +1 -1
- package/dist/builtins/fs/cat.args.d.ts +14 -15
- package/dist/builtins/fs/cat.args.js +13 -40
- package/dist/builtins/fs/cat.args.js.map +1 -1
- package/dist/builtins/fs/cat.d.ts +40 -3
- package/dist/builtins/fs/cat.js +89 -10
- package/dist/builtins/fs/cat.js.map +1 -1
- package/dist/builtins/fs/cd.d.ts +24 -6
- package/dist/builtins/fs/cd.js +71 -18
- package/dist/builtins/fs/cd.js.map +1 -1
- package/dist/builtins/fs/configWrite.d.ts +24 -8
- package/dist/builtins/fs/configWrite.js +77 -36
- package/dist/builtins/fs/configWrite.js.map +1 -1
- package/dist/builtins/fs/cp.d.ts +39 -4
- package/dist/builtins/fs/cp.js +120 -55
- package/dist/builtins/fs/cp.js.map +1 -1
- package/dist/builtins/fs/download.d.ts +12 -1
- package/dist/builtins/fs/download.js +24 -4
- package/dist/builtins/fs/download.js.map +1 -1
- package/dist/builtins/fs/du.d.ts +59 -33
- package/dist/builtins/fs/du.js +111 -79
- package/dist/builtins/fs/du.js.map +1 -1
- package/dist/builtins/fs/edit.d.ts +19 -4
- package/dist/builtins/fs/edit.js +77 -16
- package/dist/builtins/fs/edit.js.map +1 -1
- package/dist/builtins/fs/find.d.ts +25 -0
- package/dist/builtins/fs/find.js +76 -5
- package/dist/builtins/fs/find.js.map +1 -1
- package/dist/builtins/fs/mkdir.d.ts +28 -18
- package/dist/builtins/fs/mkdir.js +95 -66
- package/dist/builtins/fs/mkdir.js.map +1 -1
- package/dist/builtins/fs/mv.d.ts +34 -4
- package/dist/builtins/fs/mv.js +129 -64
- package/dist/builtins/fs/mv.js.map +1 -1
- package/dist/builtins/fs/pull.args.d.ts +56 -17
- package/dist/builtins/fs/pull.args.js +16 -66
- package/dist/builtins/fs/pull.args.js.map +1 -1
- package/dist/builtins/fs/pull.d.ts +62 -0
- package/dist/builtins/fs/pull.js +86 -22
- package/dist/builtins/fs/pull.js.map +1 -1
- package/dist/builtins/fs/pwd.d.ts +19 -5
- package/dist/builtins/fs/pwd.js +62 -8
- package/dist/builtins/fs/pwd.js.map +1 -1
- package/dist/builtins/fs/rm.d.ts +58 -21
- package/dist/builtins/fs/rm.js +99 -82
- package/dist/builtins/fs/rm.js.map +1 -1
- package/dist/builtins/fs/rmdir.d.ts +29 -11
- package/dist/builtins/fs/rmdir.js +87 -36
- package/dist/builtins/fs/rmdir.js.map +1 -1
- package/dist/builtins/fs/touch.d.ts +44 -9
- package/dist/builtins/fs/touch.js +91 -27
- package/dist/builtins/fs/touch.js.map +1 -1
- package/dist/builtins/fs/transferJobs.d.ts +64 -0
- package/dist/builtins/fs/transferJobs.js +98 -0
- package/dist/builtins/fs/transferJobs.js.map +1 -0
- package/dist/builtins/fs/tree.d.ts +36 -9
- package/dist/builtins/fs/tree.js +126 -36
- package/dist/builtins/fs/tree.js.map +1 -1
- package/dist/builtins/fs/upload.d.ts +35 -3
- package/dist/builtins/fs/upload.js +99 -14
- package/dist/builtins/fs/upload.js.map +1 -1
- package/dist/builtins/fs/xattr.args.d.ts +12 -33
- package/dist/builtins/fs/xattr.args.js +17 -95
- package/dist/builtins/fs/xattr.args.js.map +1 -1
- package/dist/builtins/fs/xattr.d.ts +98 -8
- package/dist/builtins/fs/xattr.js +163 -24
- package/dist/builtins/fs/xattr.js.map +1 -1
- package/dist/builtins/games/bytes.d.ts +201 -5
- package/dist/builtins/games/bytes.js +255 -54
- package/dist/builtins/games/bytes.js.map +1 -1
- package/dist/builtins/games/chimes.d.ts +180 -3
- package/dist/builtins/games/chimes.js +203 -26
- package/dist/builtins/games/chimes.js.map +1 -1
- package/dist/builtins/games/chrislab.d.ts +101 -3
- package/dist/builtins/games/chrislab.js +117 -17
- package/dist/builtins/games/chrislab.js.map +1 -1
- package/dist/builtins/games/cowsay.d.ts +93 -2
- package/dist/builtins/games/cowsay.js +90 -31
- package/dist/builtins/games/cowsay.js.map +1 -1
- package/dist/builtins/games/figlet.d.ts +70 -2
- package/dist/builtins/games/figlet.js +83 -6
- package/dist/builtins/games/figlet.js.map +1 -1
- package/dist/builtins/games/lab.d.ts +104 -5
- package/dist/builtins/games/lab.js +144 -6
- package/dist/builtins/games/lab.js.map +1 -1
- package/dist/builtins/games/lolcat.d.ts +61 -1
- package/dist/builtins/games/lolcat.js +59 -24
- package/dist/builtins/games/lolcat.js.map +1 -1
- package/dist/builtins/games/morse.d.ts +36 -1
- package/dist/builtins/games/morse.js +50 -2
- package/dist/builtins/games/morse.js.map +1 -1
- package/dist/builtins/games/numbers.d.ts +241 -5
- package/dist/builtins/games/numbers.js +298 -23
- package/dist/builtins/games/numbers.js.map +1 -1
- package/dist/builtins/games/play.d.ts +96 -6
- package/dist/builtins/games/play.js +137 -6
- package/dist/builtins/games/play.js.map +1 -1
- package/dist/builtins/games/qr.d.ts +40 -1
- package/dist/builtins/games/qr.js +51 -2
- package/dist/builtins/games/qr.js.map +1 -1
- package/dist/builtins/games/show.d.ts +131 -6
- package/dist/builtins/games/show.js +208 -20
- package/dist/builtins/games/show.js.map +1 -1
- package/dist/builtins/games/sky.d.ts +178 -4
- package/dist/builtins/games/sky.js +228 -12
- package/dist/builtins/games/sky.js.map +1 -1
- package/dist/builtins/games/text.d.ts +258 -7
- package/dist/builtins/games/text.js +310 -29
- package/dist/builtins/games/text.js.map +1 -1
- package/dist/builtins/games/trek.d.ts +67 -3
- package/dist/builtins/games/trek.js +63 -10
- package/dist/builtins/games/trek.js.map +1 -1
- package/dist/builtins/games/wtf.d.ts +58 -1
- package/dist/builtins/games/wtf.js +67 -6
- package/dist/builtins/games/wtf.js.map +1 -1
- package/dist/builtins/help.d.ts +38 -2
- package/dist/builtins/help.js +76 -769
- package/dist/builtins/help.js.map +1 -1
- package/dist/builtins/helpSections.js +4 -1
- package/dist/builtins/helpSections.js.map +1 -1
- package/dist/builtins/net/connect.d.ts +36 -3
- package/dist/builtins/net/connect.js +84 -26
- package/dist/builtins/net/connect.js.map +1 -1
- package/dist/builtins/net/cubepath.d.ts +49 -5
- package/dist/builtins/net/cubepath.js +69 -27
- package/dist/builtins/net/cubepath.js.map +1 -1
- package/dist/builtins/net/logout.d.ts +13 -4
- package/dist/builtins/net/logout.js +49 -3
- package/dist/builtins/net/logout.js.map +1 -1
- package/dist/builtins/net/netstat.d.ts +29 -4
- package/dist/builtins/net/netstat.js +64 -23
- package/dist/builtins/net/netstat.js.map +1 -1
- package/dist/builtins/net/pacs.d.ts +169 -15
- package/dist/builtins/net/pacs.js +92 -33
- package/dist/builtins/net/pacs.js.map +1 -1
- package/dist/builtins/net/query.args.d.ts +95 -0
- package/dist/builtins/net/query.args.js +26 -0
- package/dist/builtins/net/query.args.js.map +1 -0
- package/dist/builtins/net/query.d.ts +98 -5
- package/dist/builtins/net/query.js +89 -83
- package/dist/builtins/net/query.js.map +1 -1
- package/dist/builtins/net/status.d.ts +5 -3
- package/dist/builtins/net/status.js +5 -12
- package/dist/builtins/net/status.js.map +1 -1
- package/dist/builtins/parametersofplugin.d.ts +82 -3
- package/dist/builtins/parametersofplugin.js +79 -23
- package/dist/builtins/parametersofplugin.js.map +1 -1
- package/dist/builtins/proc.d.ts +210 -3
- package/dist/builtins/proc.js +210 -119
- package/dist/builtins/proc.js.map +1 -1
- package/dist/builtins/res/compute.d.ts +67 -3
- package/dist/builtins/res/compute.js +121 -35
- package/dist/builtins/res/compute.js.map +1 -1
- package/dist/builtins/res/dicom.d.ts +52 -3
- package/dist/builtins/res/dicom.js +82 -34
- package/dist/builtins/res/dicom.js.map +1 -1
- package/dist/builtins/res/expect.d.ts +52 -3
- package/dist/builtins/res/expect.js +92 -29
- package/dist/builtins/res/expect.js.map +1 -1
- package/dist/builtins/res/feed.d.ts +475 -3
- package/dist/builtins/res/feed.js +253 -158
- package/dist/builtins/res/feed.js.map +1 -1
- package/dist/builtins/res/files.d.ts +517 -3
- package/dist/builtins/res/files.js +124 -44
- package/dist/builtins/res/files.js.map +1 -1
- package/dist/builtins/res/gather.d.ts +113 -3
- package/dist/builtins/res/gather.js +153 -44
- package/dist/builtins/res/gather.js.map +1 -1
- package/dist/builtins/res/gather.process.d.ts +27 -19
- package/dist/builtins/res/gather.process.js +29 -59
- package/dist/builtins/res/gather.process.js.map +1 -1
- package/dist/builtins/res/group.d.ts +284 -3
- package/dist/builtins/res/group.js +147 -76
- package/dist/builtins/res/group.js.map +1 -1
- package/dist/builtins/res/image.d.ts +30 -2
- package/dist/builtins/res/image.js +62 -10
- package/dist/builtins/res/image.js.map +1 -1
- package/dist/builtins/res/play.d.ts +71 -9
- package/dist/builtins/res/play.js +124 -82
- package/dist/builtins/res/play.js.map +1 -1
- package/dist/builtins/res/plugininstance.d.ts +307 -2
- package/dist/builtins/res/plugininstance.js +122 -50
- package/dist/builtins/res/plugininstance.js.map +1 -1
- package/dist/builtins/res/pluginmeta.d.ts +244 -2
- package/dist/builtins/res/pluginmeta.js +98 -40
- package/dist/builtins/res/pluginmeta.js.map +1 -1
- package/dist/builtins/res/record.d.ts +37 -3
- package/dist/builtins/res/record.js +127 -57
- package/dist/builtins/res/record.js.map +1 -1
- package/dist/builtins/res/resourceList.d.ts +136 -0
- package/dist/builtins/res/resourceList.js +51 -0
- package/dist/builtins/res/resourceList.js.map +1 -0
- package/dist/builtins/res/tag.d.ts +244 -3
- package/dist/builtins/res/tag.js +97 -41
- package/dist/builtins/res/tag.js.map +1 -1
- package/dist/builtins/res/user.d.ts +122 -3
- package/dist/builtins/res/user.js +83 -21
- package/dist/builtins/res/user.js.map +1 -1
- package/dist/builtins/res/workflow.d.ts +244 -2
- package/dist/builtins/res/workflow.js +97 -40
- package/dist/builtins/res/workflow.js.map +1 -1
- package/dist/builtins/store.d.ts +85 -3
- package/dist/builtins/store.js +135 -68
- package/dist/builtins/store.js.map +1 -1
- package/dist/builtins/sys/apropos.d.ts +80 -5
- package/dist/builtins/sys/apropos.js +121 -15
- package/dist/builtins/sys/apropos.js.map +1 -1
- package/dist/builtins/sys/cal.d.ts +44 -5
- package/dist/builtins/sys/cal.js +57 -10
- package/dist/builtins/sys/cal.js.map +1 -1
- package/dist/builtins/sys/command.d.ts +20 -0
- package/dist/builtins/sys/command.js +31 -0
- package/dist/builtins/sys/command.js.map +1 -1
- package/dist/builtins/sys/context.d.ts +13 -3
- package/dist/builtins/sys/context.js +51 -4
- package/dist/builtins/sys/context.js.map +1 -1
- package/dist/builtins/sys/date.d.ts +56 -5
- package/dist/builtins/sys/date.js +63 -9
- package/dist/builtins/sys/date.js.map +1 -1
- package/dist/builtins/sys/echo.d.ts +63 -2
- package/dist/builtins/sys/echo.js +87 -8
- package/dist/builtins/sys/echo.js.map +1 -1
- package/dist/builtins/sys/fortune.d.ts +27 -2
- package/dist/builtins/sys/fortune.js +44 -2
- package/dist/builtins/sys/fortune.js.map +1 -1
- package/dist/builtins/sys/grep.d.ts +245 -11
- package/dist/builtins/sys/grep.js +418 -131
- package/dist/builtins/sys/grep.js.map +1 -1
- package/dist/builtins/sys/joblets.d.ts +66 -7
- package/dist/builtins/sys/joblets.js +101 -14
- package/dist/builtins/sys/joblets.js.map +1 -1
- package/dist/builtins/sys/motd.d.ts +37 -3
- package/dist/builtins/sys/motd.js +49 -8
- package/dist/builtins/sys/motd.js.map +1 -1
- package/dist/builtins/sys/notes.d.ts +75 -3
- package/dist/builtins/sys/notes.js +90 -29
- package/dist/builtins/sys/notes.js.map +1 -1
- package/dist/builtins/sys/physicalmode.d.ts +24 -3
- package/dist/builtins/sys/physicalmode.js +68 -14
- package/dist/builtins/sys/physicalmode.js.map +1 -1
- package/dist/builtins/sys/tasks.d.ts +74 -5
- package/dist/builtins/sys/tasks.js +102 -14
- package/dist/builtins/sys/tasks.js.map +1 -1
- package/dist/builtins/sys/textFilters.d.ts +673 -41
- package/dist/builtins/sys/textFilters.js +718 -263
- package/dist/builtins/sys/textFilters.js.map +1 -1
- package/dist/builtins/sys/timing.d.ts +24 -3
- package/dist/builtins/sys/timing.js +67 -14
- package/dist/builtins/sys/timing.js.map +1 -1
- package/dist/builtins/sys/variables.d.ts +70 -4
- package/dist/builtins/sys/variables.js +103 -31
- package/dist/builtins/sys/variables.js.map +1 -1
- package/dist/builtins/sys/version.d.ts +27 -2
- package/dist/builtins/sys/version.js +48 -3
- package/dist/builtins/sys/version.js.map +1 -1
- package/dist/builtins/sys/weather.d.ts +92 -15
- package/dist/builtins/sys/weather.js +71 -45
- package/dist/builtins/sys/weather.js.map +1 -1
- package/dist/builtins/sys/whoami.d.ts +38 -18
- package/dist/builtins/sys/whoami.js +112 -8
- package/dist/builtins/sys/whoami.js.map +1 -1
- package/dist/builtins/utils.d.ts +0 -37
- package/dist/builtins/utils.js +0 -86
- package/dist/builtins/utils.js.map +1 -1
- package/dist/chris/chrisCommands.js +58 -152
- package/dist/chris/chrisCommands.js.map +1 -1
- package/dist/chris/commandFallback.d.ts +12 -0
- package/dist/chris/commandFallback.js +47 -0
- package/dist/chris/commandFallback.js.map +1 -1
- package/dist/chris/filesystem.js +7 -5
- package/dist/chris/filesystem.js.map +1 -1
- package/dist/chris/help.js +0 -1018
- package/dist/chris/help.js.map +1 -1
- package/dist/chris/kinds.d.ts +21 -0
- package/dist/chris/kinds.js +114 -2
- package/dist/chris/kinds.js.map +1 -1
- package/dist/chris/mounts.d.ts +4 -4
- package/dist/chris/mounts.js +9 -16
- package/dist/chris/mounts.js.map +1 -1
- package/dist/chris/navigation.d.ts +2 -3
- package/dist/chris/navigation.js +6 -20
- package/dist/chris/navigation.js.map +1 -1
- package/dist/chris/pacsResources.d.ts +259 -0
- package/dist/chris/pacsResources.js +168 -0
- package/dist/chris/pacsResources.js.map +1 -0
- package/dist/core/commandDeclaration.d.ts +97 -7
- package/dist/core/commandDeclaration.js +21 -0
- package/dist/core/commandDeclaration.js.map +1 -1
- package/dist/core/commandParse.js +65 -17
- package/dist/core/commandParse.js.map +1 -1
- package/dist/core/commandRegistry.d.ts +4 -3
- package/dist/core/commandRegistry.js +36 -8
- package/dist/core/commandRegistry.js.map +1 -1
- package/dist/core/commandSchema.js +5 -2
- package/dist/core/commandSchema.js.map +1 -1
- package/dist/core/commandUsage.d.ts +15 -0
- package/dist/core/commandUsage.js +59 -7
- package/dist/core/commandUsage.js.map +1 -1
- package/dist/core/coreCommands.js +63 -212
- package/dist/core/coreCommands.js.map +1 -1
- package/dist/core/paths.d.ts +29 -1
- package/dist/core/paths.js +15 -2
- package/dist/core/paths.js.map +1 -1
- package/dist/core/preprocess.d.ts +3 -4
- package/dist/core/preprocess.js +4 -5
- package/dist/core/preprocess.js.map +1 -1
- package/dist/lib/completer/declared.js +7 -4
- package/dist/lib/completer/declared.js.map +1 -1
- package/dist/lib/completer/index.js +2 -7
- package/dist/lib/completer/index.js.map +1 -1
- package/dist/lib/parser.d.ts +0 -8
- package/dist/lib/parser.js +0 -11
- package/dist/lib/parser.js.map +1 -1
- package/dist/lib/vfs/vfs.d.ts +2 -1
- package/dist/lib/vfs/vfs.js +5 -4
- package/dist/lib/vfs/vfs.js.map +1 -1
- package/dist/notes.json +1 -1
- package/package.json +5 -5
|
@@ -1,8 +1,40 @@
|
|
|
1
1
|
import { type CommandEnvelope } from '@fnndsc/menu';
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
3
|
+
* `upload [-j N] <source> <destination>`: the declaration.
|
|
4
4
|
*
|
|
5
|
-
* @
|
|
6
|
-
*
|
|
5
|
+
* @example
|
|
6
|
+
* ```ts
|
|
7
|
+
* commands_register({ declarations: [uploadCommand] }, 'backend');
|
|
8
|
+
* ```
|
|
9
|
+
*/
|
|
10
|
+
export declare const uploadCommand: import("../../core/commandDeclaration.js").CommandDeclaration<{
|
|
11
|
+
readonly operands: readonly [{
|
|
12
|
+
readonly name: "source";
|
|
13
|
+
readonly kind: "hostPath";
|
|
14
|
+
readonly summary: "What to upload from this machine's disk: a file, a folder, or a wildcard chili matches there";
|
|
15
|
+
}, {
|
|
16
|
+
readonly name: "destination";
|
|
17
|
+
readonly kind: "cfsPath";
|
|
18
|
+
readonly summary: "The ChRIS folder it goes into";
|
|
19
|
+
}];
|
|
20
|
+
readonly options: {
|
|
21
|
+
readonly jobs: {
|
|
22
|
+
readonly short: "j";
|
|
23
|
+
readonly long: "jobs";
|
|
24
|
+
readonly summary: `Move N files at once, 1 to ${number} (1 is one at a time); without it $TRANSFER_JOBS, else ${number}`;
|
|
25
|
+
readonly value: {
|
|
26
|
+
readonly name: "N";
|
|
27
|
+
readonly kind: "int";
|
|
28
|
+
readonly min: 1;
|
|
29
|
+
readonly max: number;
|
|
30
|
+
};
|
|
31
|
+
};
|
|
32
|
+
};
|
|
33
|
+
}>;
|
|
34
|
+
/**
|
|
35
|
+
* `upload` over words already split: the declaration's parse and handler.
|
|
36
|
+
*
|
|
37
|
+
* @param args - The words after `upload`.
|
|
38
|
+
* @returns The upload summary, or the refusal of a bad line.
|
|
7
39
|
*/
|
|
8
40
|
export declare function builtin_upload(args: string[]): Promise<CommandEnvelope>;
|
|
@@ -1,18 +1,43 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @file
|
|
3
|
-
*
|
|
2
|
+
* @file `upload`: files, folders or the matches of a wildcard on this
|
|
3
|
+
* machine's disk, into ChRIS, with progress.
|
|
4
|
+
*
|
|
5
|
+
* The destination is where the store keeps it (`storePath_resolve`): an
|
|
6
|
+
* upload into a link lands in the folder the link points at.
|
|
7
|
+
*
|
|
8
|
+
* Declared in one record (`uploadCommand`): a host path operand, then one
|
|
9
|
+
* CFS path. The host path is never globbed by the line: chili matches a
|
|
10
|
+
* wildcard in it against the engine's disk.
|
|
11
|
+
*
|
|
12
|
+
* Key components:
|
|
13
|
+
* - uploadCommand: the declaration.
|
|
14
|
+
* - builtin_upload: the declaration run over words already split.
|
|
15
|
+
*
|
|
16
|
+
* Typical usage:
|
|
17
|
+
* ```ts
|
|
18
|
+
* await builtin_upload(['~/data/file.csv', '/home/user/uploads/']);
|
|
19
|
+
* ```
|
|
20
|
+
*
|
|
21
|
+
* Dependencies: chili's transfer, cumin's listing cache, the session's surface.
|
|
22
|
+
*
|
|
23
|
+
* @module
|
|
4
24
|
*/
|
|
5
25
|
import chalk from 'chalk';
|
|
6
|
-
import { path_resolve } from '../utils.js';
|
|
26
|
+
import { path_resolve, storePath_resolve } from '../utils.js';
|
|
7
27
|
import { files_uploadWithProgress as chefs_upload_cmd, bytes_format } from '@fnndsc/chili/commands/fs/upload.js';
|
|
8
28
|
import { listCache_get } from '@fnndsc/cumin';
|
|
9
29
|
import { sink_get } from '../../core/sink.js';
|
|
10
|
-
import { shellArguments_pathnameExpansion } from '../../lib/parser.js';
|
|
11
30
|
import { surface_get } from '../../core/surface.js';
|
|
12
31
|
import { repl_confirm } from '../../core/question.js';
|
|
32
|
+
import { command_declare } from '../../core/commandDeclaration.js';
|
|
33
|
+
import { declaredCommand_run } from '../../core/commandParse.js';
|
|
13
34
|
import { errorStack } from '@fnndsc/fond';
|
|
14
35
|
import { envelope_ok, envelope_error } from '@fnndsc/menu';
|
|
15
36
|
import { exitCode_set } from '../../core/handlerRun.js';
|
|
37
|
+
import { commandCancellation_enable, commandCancellation_signalGet } from '../../core/cancellation.js';
|
|
38
|
+
import { TRANSFER_JOBS_OPTION, transferJobs_resolve, transferLeftovers_render } from './transferJobs.js';
|
|
39
|
+
/** The characters that make a host path a pattern chili matches against the disk. */
|
|
40
|
+
const HOST_WILDCARD = /[*?[]/;
|
|
16
41
|
/**
|
|
17
42
|
* Asks the issuing surface to confirm replacement of an existing CFS target.
|
|
18
43
|
*
|
|
@@ -27,18 +52,59 @@ async function uploadConfirmation_request(message) {
|
|
|
27
52
|
throw new Error('Operation cancelled by user.');
|
|
28
53
|
}
|
|
29
54
|
}
|
|
55
|
+
/** What an `upload` line may hold: one place on this machine, then one ChRIS path. */
|
|
56
|
+
const UPLOAD_GRAMMAR = {
|
|
57
|
+
operands: [
|
|
58
|
+
{ name: 'source', kind: 'hostPath', summary: "What to upload from this machine's disk: a file, a folder, or a wildcard chili matches there" },
|
|
59
|
+
{ name: 'destination', kind: 'cfsPath', summary: 'The ChRIS folder it goes into' },
|
|
60
|
+
],
|
|
61
|
+
options: {
|
|
62
|
+
jobs: TRANSFER_JOBS_OPTION,
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
/**
|
|
66
|
+
* `upload [-j N] <source> <destination>`: the declaration.
|
|
67
|
+
*
|
|
68
|
+
* @example
|
|
69
|
+
* ```ts
|
|
70
|
+
* commands_register({ declarations: [uploadCommand] }, 'backend');
|
|
71
|
+
* ```
|
|
72
|
+
*/
|
|
73
|
+
export const uploadCommand = command_declare({
|
|
74
|
+
name: 'upload',
|
|
75
|
+
grammar: UPLOAD_GRAMMAR,
|
|
76
|
+
help: {
|
|
77
|
+
summary: 'Upload local files, directories, or glob matches to ChRIS',
|
|
78
|
+
description: 'Upload local files, directories, or glob matches to ChRIS with progress tracking. A progress bar shows the file count and percentage complete, the estimated time remaining (ETA) and the data transferred; summary statistics follow the upload. The files of a folder move 8 at a time (-j N, or the session variable TRANSFER_JOBS, says how many, 1 to 32); a file that fails is tried once more, the rest continue, and the summary names each that failed.',
|
|
79
|
+
category: 'Files',
|
|
80
|
+
examples: [
|
|
81
|
+
'upload ~/data/file.csv /home/user/uploads/',
|
|
82
|
+
'upload ~/Pictures/earthandmoon* .',
|
|
83
|
+
'upload ./results/ ~/data/',
|
|
84
|
+
'upload ~/experiment/data /home/user/projects/',
|
|
85
|
+
'upload -j 1 ./results/ ~/data/ # one at a time',
|
|
86
|
+
],
|
|
87
|
+
},
|
|
88
|
+
handler: async (args) => upload_run(args.operands.source, args.operands.destination, args.options.jobs),
|
|
89
|
+
});
|
|
90
|
+
/**
|
|
91
|
+
* `upload` over words already split: the declaration's parse and handler.
|
|
92
|
+
*
|
|
93
|
+
* @param args - The words after `upload`.
|
|
94
|
+
* @returns The upload summary, or the refusal of a bad line.
|
|
95
|
+
*/
|
|
96
|
+
export async function builtin_upload(args) {
|
|
97
|
+
return declaredCommand_run(uploadCommand, args);
|
|
98
|
+
}
|
|
30
99
|
/**
|
|
31
100
|
* Uploads a local file or directory to ChRIS.
|
|
32
101
|
*
|
|
33
|
-
* @param
|
|
102
|
+
* @param localPath - The host path, as typed: a wildcard in it is matched on the engine's disk.
|
|
103
|
+
* @param remotePath - The ChRIS destination, as typed.
|
|
104
|
+
* @param jobsGiven - The line's `-j`; undefined when it gives none.
|
|
34
105
|
* @returns An envelope carrying the upload summary.
|
|
35
106
|
*/
|
|
36
|
-
|
|
37
|
-
if (args.length < 2) {
|
|
38
|
-
return envelope_ok(`${chalk.red('Usage: upload <local_path> <remote_path>')}\n`);
|
|
39
|
-
}
|
|
40
|
-
const localPath = args[0];
|
|
41
|
-
const remotePath = args[1];
|
|
107
|
+
async function upload_run(localPath, remotePath, jobsGiven) {
|
|
42
108
|
// The local path is read by the ENGINE: under a daemon that is the daemon
|
|
43
109
|
// host's disk, which belongs to nobody attending the session unless the
|
|
44
110
|
// operator declared it theirs (--host-control=files). Without that, refuse
|
|
@@ -47,11 +113,23 @@ export async function builtin_upload(args) {
|
|
|
47
113
|
exitCode_set(1);
|
|
48
114
|
return envelope_error('', undefined, `${chalk.red("upload: calypso's host disk is nobody's; start calypso with --host-control=files, or upload from a surface that can supply the bytes.")}\n`);
|
|
49
115
|
}
|
|
50
|
-
const
|
|
51
|
-
|
|
116
|
+
const jobs = transferJobs_resolve(jobsGiven);
|
|
117
|
+
if ('refused' in jobs) {
|
|
118
|
+
exitCode_set(1);
|
|
119
|
+
return envelope_error('', undefined, `${chalk.red(`upload: ${jobs.refused}`)}\n`);
|
|
120
|
+
}
|
|
121
|
+
commandCancellation_enable();
|
|
122
|
+
const signal = commandCancellation_signalGet();
|
|
123
|
+
// chili reads an exact path first and matches a pattern only when nothing
|
|
124
|
+
// stands at it.
|
|
125
|
+
const localGlob = HOST_WILDCARD.test(localPath);
|
|
126
|
+
// Where the store keeps the destination: a link's target, not the link.
|
|
127
|
+
const targetRemote = await storePath_resolve(remotePath);
|
|
52
128
|
try {
|
|
53
129
|
const summary = await chefs_upload_cmd(localPath, targetRemote, {
|
|
54
130
|
expandLocalGlob: localGlob,
|
|
131
|
+
jobs: jobs.jobs,
|
|
132
|
+
...(signal !== undefined ? { signal } : {}),
|
|
55
133
|
confirm: uploadConfirmation_request,
|
|
56
134
|
onNotice: (message, channel) => {
|
|
57
135
|
const sink = sink_get();
|
|
@@ -70,6 +148,7 @@ export async function builtin_upload(args) {
|
|
|
70
148
|
rendered += `${chalk.yellow(`⚠ Uploaded ${summary.transferredCount} file(s), ${summary.failedCount} failed`)}\n`;
|
|
71
149
|
}
|
|
72
150
|
rendered += `${chalk.gray(` Total: ${bytes_format(summary.transferSize)} in ${summary.duration.toFixed(1)}s (${bytes_format(summary.speed)}/s)`)}\n`;
|
|
151
|
+
rendered += transferLeftovers_render(summary.failedPaths, summary.cancelledCount, 'uploaded');
|
|
73
152
|
// A file that landed under another name because its own was taken must
|
|
74
153
|
// say so: the store has no overwrite, and an upload reported as plain
|
|
75
154
|
// success leaves the operator believing they replaced something.
|
|
@@ -85,8 +164,14 @@ export async function builtin_upload(args) {
|
|
|
85
164
|
if (summary.transferredCount > 0) {
|
|
86
165
|
const listCache = listCache_get();
|
|
87
166
|
listCache.cache_invalidateTree(summary.actualTargetPath);
|
|
88
|
-
//
|
|
167
|
+
// The destination's own listing, by both its names: where the store
|
|
168
|
+
// keeps it, and the path it was reached by.
|
|
89
169
|
listCache.cache_invalidate(targetRemote);
|
|
170
|
+
listCache.cache_invalidate(await path_resolve(remotePath));
|
|
171
|
+
}
|
|
172
|
+
if (summary.failedCount > 0 || summary.cancelledCount > 0) {
|
|
173
|
+
exitCode_set(1);
|
|
174
|
+
return envelope_error(rendered, undefined, '');
|
|
90
175
|
}
|
|
91
176
|
return envelope_ok(rendered);
|
|
92
177
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upload.js","sourceRoot":"","sources":["../../../src/builtins/fs/upload.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"upload.js","sourceRoot":"","sources":["../../../src/builtins/fs/upload.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,44 +1,18 @@
|
|
|
1
1
|
/** The one attribute a feed carries. */
|
|
2
2
|
export declare const XATTR_TAG: string;
|
|
3
|
-
/**
|
|
4
|
-
export declare const
|
|
5
|
-
/** How `getfattr` is spelled. */
|
|
6
|
-
export declare const GETFATTR_USAGE: string;
|
|
7
|
-
/** A parsed `setfattr` invocation. */
|
|
8
|
-
export interface SetfattrArgs {
|
|
9
|
-
/** Set a value (`-n`), or remove (`-x`). */
|
|
10
|
-
mode: 'set' | 'remove';
|
|
11
|
-
/** The value to set or remove; null removes every value (`-x` alone). */
|
|
12
|
-
value: string | null;
|
|
13
|
-
paths: string[];
|
|
14
|
-
error: string | null;
|
|
15
|
-
}
|
|
16
|
-
/** A parsed `getfattr` invocation. */
|
|
17
|
-
export interface GetfattrArgs {
|
|
18
|
-
paths: string[];
|
|
19
|
-
error: string | null;
|
|
20
|
-
}
|
|
21
|
-
/**
|
|
22
|
-
* Reads a `setfattr` invocation. Unknown flags and attributes are refused by name.
|
|
23
|
-
*
|
|
24
|
-
* @param args - The tokens after the verb.
|
|
25
|
-
* @returns The parsed invocation, its error set when it is wrong.
|
|
26
|
-
*/
|
|
27
|
-
export declare function setfattrArgs_parse(args: ReadonlyArray<string>): SetfattrArgs;
|
|
28
|
-
/**
|
|
29
|
-
* Reads a `getfattr` invocation. `-n tag` is accepted (it is the only
|
|
30
|
-
* attribute); `-d` (dump all) reads the same.
|
|
31
|
-
*
|
|
32
|
-
* @param args - The tokens after the verb.
|
|
33
|
-
* @returns The parsed invocation, its error set when it is wrong.
|
|
34
|
-
*/
|
|
35
|
-
export declare function getfattrArgs_parse(args: ReadonlyArray<string>): GetfattrArgs;
|
|
3
|
+
/** The names that attribute answers to: `tag`, and `user.tag` as Linux namespaces it. */
|
|
4
|
+
export declare const XATTR_NAMES: readonly ['tag', 'user.tag'];
|
|
36
5
|
/**
|
|
37
6
|
* The feed a path names: an id, a `feed_N`, a path through `/feeds/` as
|
|
38
7
|
* setfacl reads it, or the projection `/proc/jobs/feed_N`.
|
|
39
8
|
*
|
|
40
9
|
* @param target - The path as typed.
|
|
41
10
|
* @returns The feed id, or null.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```ts
|
|
14
|
+
* xattrTarget_resolve('/proc/jobs/feed_12'); // 12
|
|
15
|
+
* ```
|
|
42
16
|
*/
|
|
43
17
|
export declare function xattrTarget_resolve(target: string): number | null;
|
|
44
18
|
/**
|
|
@@ -48,5 +22,10 @@ export declare function xattrTarget_resolve(target: string): number | null;
|
|
|
48
22
|
* @param path - The path as named.
|
|
49
23
|
* @param tags - The tag names.
|
|
50
24
|
* @returns The block.
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* ```ts
|
|
28
|
+
* xattr_render('feed_12', ['urgent']); // '# file: feed_12\ntag="urgent"'
|
|
29
|
+
* ```
|
|
51
30
|
*/
|
|
52
31
|
export declare function xattr_render(path: string, tags: ReadonlyArray<string>): string;
|
|
@@ -1,117 +1,34 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @file
|
|
2
|
+
* @file The words of a feed's tags: the one attribute, the targets a feed
|
|
3
|
+
* is named by, and `getfattr`'s dump.
|
|
3
4
|
*
|
|
4
5
|
* A feed's tags are, in POSIX terms, an extended attribute: `setfattr -n
|
|
5
6
|
* tag -v urgent feed_12` hangs one, `getfattr feed_12` reads them. One
|
|
6
7
|
* attribute exists, `tag` (also spelled `user.tag`), and it holds many
|
|
7
8
|
* values — CUBE's tags on the feed.
|
|
8
9
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
10
|
+
* The line itself is parsed against each command's declaration
|
|
11
|
+
* (`xattr.ts`). Dependency-free, as `acl.args.ts` is, so these are tested
|
|
12
|
+
* without the engine.
|
|
11
13
|
*
|
|
12
14
|
* @module
|
|
13
15
|
*/
|
|
14
16
|
import { aclTarget_resolve } from './acl.args.js';
|
|
15
17
|
/** The one attribute a feed carries. */
|
|
16
18
|
export const XATTR_TAG = 'tag';
|
|
17
|
-
/**
|
|
18
|
-
export const
|
|
19
|
-
/** How `getfattr` is spelled. */
|
|
20
|
-
export const GETFATTR_USAGE = 'getfattr: usage: getfattr [-n tag] <path>...';
|
|
21
|
-
/**
|
|
22
|
-
* Whether an attribute name is the one a feed carries.
|
|
23
|
-
*
|
|
24
|
-
* @param name - The name as typed.
|
|
25
|
-
* @returns True for `tag` and `user.tag`.
|
|
26
|
-
*/
|
|
27
|
-
function name_isTag(name) {
|
|
28
|
-
return name === XATTR_TAG || name === `user.${XATTR_TAG}`;
|
|
29
|
-
}
|
|
30
|
-
/**
|
|
31
|
-
* Reads a `setfattr` invocation. Unknown flags and attributes are refused by name.
|
|
32
|
-
*
|
|
33
|
-
* @param args - The tokens after the verb.
|
|
34
|
-
* @returns The parsed invocation, its error set when it is wrong.
|
|
35
|
-
*/
|
|
36
|
-
export function setfattrArgs_parse(args) {
|
|
37
|
-
let mode = null;
|
|
38
|
-
let name = null;
|
|
39
|
-
let value = null;
|
|
40
|
-
const paths = [];
|
|
41
|
-
const fail = (error) => ({ mode: 'set', value: null, paths: [], error });
|
|
42
|
-
for (let i = 0; i < args.length; i += 1) {
|
|
43
|
-
const token = args[i] ?? '';
|
|
44
|
-
if (token === '-n' || token === '--name' || token === '-x' || token === '--remove') {
|
|
45
|
-
const given = args[i + 1];
|
|
46
|
-
if (given === undefined)
|
|
47
|
-
return fail(`setfattr: option '${token}' requires an argument\n${SETFATTR_USAGE}`);
|
|
48
|
-
mode = token === '-n' || token === '--name' ? 'set' : 'remove';
|
|
49
|
-
name = given;
|
|
50
|
-
i += 1;
|
|
51
|
-
}
|
|
52
|
-
else if (token === '-v' || token === '--value') {
|
|
53
|
-
const given = args[i + 1];
|
|
54
|
-
if (given === undefined)
|
|
55
|
-
return fail(`setfattr: option '${token}' requires an argument\n${SETFATTR_USAGE}`);
|
|
56
|
-
value = given;
|
|
57
|
-
i += 1;
|
|
58
|
-
}
|
|
59
|
-
else if (token.startsWith('-')) {
|
|
60
|
-
return fail(`setfattr: invalid option -- '${token.replace(/^-+/, '')}'\n${SETFATTR_USAGE}`);
|
|
61
|
-
}
|
|
62
|
-
else {
|
|
63
|
-
paths.push(token);
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
if (mode === null || name === null)
|
|
67
|
-
return fail(SETFATTR_USAGE);
|
|
68
|
-
if (!name_isTag(name))
|
|
69
|
-
return fail(`setfattr: ${name}: Operation not supported (a feed carries one attribute, tag)`);
|
|
70
|
-
if (mode === 'set' && (value === null || value.trim() === ''))
|
|
71
|
-
return fail(`setfattr: -n ${name} needs -v <value>\n${SETFATTR_USAGE}`);
|
|
72
|
-
if (paths.length === 0)
|
|
73
|
-
return fail(SETFATTR_USAGE);
|
|
74
|
-
return { mode, value: value === null ? null : value.trim(), paths, error: null };
|
|
75
|
-
}
|
|
76
|
-
/**
|
|
77
|
-
* Reads a `getfattr` invocation. `-n tag` is accepted (it is the only
|
|
78
|
-
* attribute); `-d` (dump all) reads the same.
|
|
79
|
-
*
|
|
80
|
-
* @param args - The tokens after the verb.
|
|
81
|
-
* @returns The parsed invocation, its error set when it is wrong.
|
|
82
|
-
*/
|
|
83
|
-
export function getfattrArgs_parse(args) {
|
|
84
|
-
const paths = [];
|
|
85
|
-
for (let i = 0; i < args.length; i += 1) {
|
|
86
|
-
const token = args[i] ?? '';
|
|
87
|
-
if (token === '-n' || token === '--name') {
|
|
88
|
-
const given = args[i + 1];
|
|
89
|
-
if (given === undefined)
|
|
90
|
-
return { paths: [], error: `getfattr: option '${token}' requires an argument\n${GETFATTR_USAGE}` };
|
|
91
|
-
if (!name_isTag(given))
|
|
92
|
-
return { paths: [], error: `getfattr: ${given}: No such attribute (a feed carries one attribute, tag)` };
|
|
93
|
-
i += 1;
|
|
94
|
-
}
|
|
95
|
-
else if (token === '-d' || token === '--dump') {
|
|
96
|
-
continue;
|
|
97
|
-
}
|
|
98
|
-
else if (token.startsWith('-')) {
|
|
99
|
-
return { paths: [], error: `getfattr: invalid option -- '${token.replace(/^-+/, '')}'\n${GETFATTR_USAGE}` };
|
|
100
|
-
}
|
|
101
|
-
else {
|
|
102
|
-
paths.push(token);
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
if (paths.length === 0)
|
|
106
|
-
return { paths: [], error: GETFATTR_USAGE };
|
|
107
|
-
return { paths, error: null };
|
|
108
|
-
}
|
|
19
|
+
/** The names that attribute answers to: `tag`, and `user.tag` as Linux namespaces it. */
|
|
20
|
+
export const XATTR_NAMES = ['tag', 'user.tag'];
|
|
109
21
|
/**
|
|
110
22
|
* The feed a path names: an id, a `feed_N`, a path through `/feeds/` as
|
|
111
23
|
* setfacl reads it, or the projection `/proc/jobs/feed_N`.
|
|
112
24
|
*
|
|
113
25
|
* @param target - The path as typed.
|
|
114
26
|
* @returns The feed id, or null.
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* ```ts
|
|
30
|
+
* xattrTarget_resolve('/proc/jobs/feed_12'); // 12
|
|
31
|
+
* ```
|
|
115
32
|
*/
|
|
116
33
|
export function xattrTarget_resolve(target) {
|
|
117
34
|
const held = aclTarget_resolve(target);
|
|
@@ -127,6 +44,11 @@ export function xattrTarget_resolve(target) {
|
|
|
127
44
|
* @param path - The path as named.
|
|
128
45
|
* @param tags - The tag names.
|
|
129
46
|
* @returns The block.
|
|
47
|
+
*
|
|
48
|
+
* @example
|
|
49
|
+
* ```ts
|
|
50
|
+
* xattr_render('feed_12', ['urgent']); // '# file: feed_12\ntag="urgent"'
|
|
51
|
+
* ```
|
|
130
52
|
*/
|
|
131
53
|
export function xattr_render(path, tags) {
|
|
132
54
|
return [`# file: ${path}`, ...tags.map((tag) => `${XATTR_TAG}="${tag.replace(/"/g, '\\"')}"`)].join('\n');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"xattr.args.js","sourceRoot":"","sources":["../../../src/builtins/fs/xattr.args.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"xattr.args.js","sourceRoot":"","sources":["../../../src/builtins/fs/xattr.args.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAElD,wCAAwC;AACxC,MAAM,CAAC,MAAM,SAAS,GAAW,KAAK,CAAC;AAEvC,yFAAyF;AACzF,MAAM,CAAC,MAAM,WAAW,GAAiC,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;AAE7E;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAc;IAChD,MAAM,IAAI,GAAkB,iBAAiB,CAAC,MAAM,CAAC,CAAC;IACtD,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAC/B,MAAM,SAAS,GAA4B,MAAM,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;IACtF,OAAO,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC1D,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,IAA2B;IACpE,OAAO,CAAC,WAAW,IAAI,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAW,EAAU,EAAE,CAAC,GAAG,SAAS,KAAK,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC5H,CAAC"}
|
|
@@ -1,17 +1,107 @@
|
|
|
1
1
|
import { CommandEnvelope } from '@fnndsc/menu';
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
3
|
+
* `getfattr [-d] [-n tag] <path>…`: the declaration.
|
|
4
4
|
*
|
|
5
|
-
* @
|
|
6
|
-
*
|
|
5
|
+
* @example
|
|
6
|
+
* ```ts
|
|
7
|
+
* commands_register({ declarations: [getfattrCommand] }, 'backend');
|
|
8
|
+
* ```
|
|
9
|
+
*/
|
|
10
|
+
export declare const getfattrCommand: import("../../core/commandDeclaration.js").CommandDeclaration<{
|
|
11
|
+
readonly operands: readonly [{
|
|
12
|
+
readonly name: "path";
|
|
13
|
+
readonly kind: "cfsPath";
|
|
14
|
+
readonly repeat: true;
|
|
15
|
+
readonly glob: true;
|
|
16
|
+
readonly summary: "The feeds: an id, feed_N, any path through /feeds/, or /proc/jobs/feed_N";
|
|
17
|
+
}];
|
|
18
|
+
readonly options: {
|
|
19
|
+
readonly name: {
|
|
20
|
+
readonly short: "n";
|
|
21
|
+
readonly long: "name";
|
|
22
|
+
readonly summary: "The attribute to read (only tag exists)";
|
|
23
|
+
readonly value: {
|
|
24
|
+
readonly name: "name";
|
|
25
|
+
readonly kind: "enum";
|
|
26
|
+
readonly values: readonly ["tag", "user.tag"];
|
|
27
|
+
};
|
|
28
|
+
};
|
|
29
|
+
readonly dump: {
|
|
30
|
+
readonly short: "d";
|
|
31
|
+
readonly long: "dump";
|
|
32
|
+
readonly summary: "Dump every attribute (the default)";
|
|
33
|
+
};
|
|
34
|
+
};
|
|
35
|
+
}>;
|
|
36
|
+
/**
|
|
37
|
+
* `getfattr` over words already split: the declaration's parse and handler.
|
|
38
|
+
*
|
|
39
|
+
* @param args - The words after `getfattr`.
|
|
40
|
+
* @returns The tags, or the refusal of a bad line.
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* ```ts
|
|
44
|
+
* await builtin_getfattr(['feed_12']);
|
|
45
|
+
* ```
|
|
7
46
|
*/
|
|
8
47
|
export declare function builtin_getfattr(args: string[]): Promise<CommandEnvelope>;
|
|
9
48
|
/**
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
49
|
+
* `setfattr -n tag -v <value> <path>… | -x tag [-v <value>] <path>…`: the declaration.
|
|
50
|
+
*
|
|
51
|
+
* @example
|
|
52
|
+
* ```ts
|
|
53
|
+
* commands_register({ declarations: [setfattrCommand] }, 'backend');
|
|
54
|
+
* ```
|
|
55
|
+
*/
|
|
56
|
+
export declare const setfattrCommand: import("../../core/commandDeclaration.js").CommandDeclaration<{
|
|
57
|
+
readonly operands: readonly [{
|
|
58
|
+
readonly name: "path";
|
|
59
|
+
readonly kind: "cfsPath";
|
|
60
|
+
readonly repeat: true;
|
|
61
|
+
readonly glob: true;
|
|
62
|
+
readonly summary: "The feeds: an id, feed_N, any path through /feeds/, or /proc/jobs/feed_N";
|
|
63
|
+
}];
|
|
64
|
+
readonly options: {
|
|
65
|
+
readonly name: {
|
|
66
|
+
readonly short: "n";
|
|
67
|
+
readonly long: "name";
|
|
68
|
+
readonly summary: "The attribute to set (only tag exists)";
|
|
69
|
+
readonly value: {
|
|
70
|
+
readonly name: "name";
|
|
71
|
+
readonly kind: "enum";
|
|
72
|
+
readonly values: readonly ["tag", "user.tag"];
|
|
73
|
+
};
|
|
74
|
+
};
|
|
75
|
+
readonly value: {
|
|
76
|
+
readonly short: "v";
|
|
77
|
+
readonly long: "value";
|
|
78
|
+
readonly summary: "The tag";
|
|
79
|
+
readonly value: {
|
|
80
|
+
readonly name: "value";
|
|
81
|
+
readonly kind: "word";
|
|
82
|
+
};
|
|
83
|
+
};
|
|
84
|
+
readonly remove: {
|
|
85
|
+
readonly short: "x";
|
|
86
|
+
readonly long: "remove";
|
|
87
|
+
readonly summary: "Remove the tag given by -v, or every tag without -v";
|
|
88
|
+
readonly value: {
|
|
89
|
+
readonly name: "name";
|
|
90
|
+
readonly kind: "enum";
|
|
91
|
+
readonly values: readonly ["tag", "user.tag"];
|
|
92
|
+
};
|
|
93
|
+
};
|
|
94
|
+
};
|
|
95
|
+
}>;
|
|
96
|
+
/**
|
|
97
|
+
* `setfattr` over words already split: the declaration's parse and handler.
|
|
98
|
+
*
|
|
99
|
+
* @param args - The words after `setfattr`.
|
|
100
|
+
* @returns An envelope, empty on success, or the refusal of a bad line.
|
|
13
101
|
*
|
|
14
|
-
* @
|
|
15
|
-
*
|
|
102
|
+
* @example
|
|
103
|
+
* ```ts
|
|
104
|
+
* await builtin_setfattr(['-x', 'tag', 'feed_12']);
|
|
105
|
+
* ```
|
|
16
106
|
*/
|
|
17
107
|
export declare function builtin_setfattr(args: string[]): Promise<CommandEnvelope>;
|