@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.
Files changed (333) hide show
  1. package/dist/buildinfo.json +1 -1
  2. package/dist/builtins/berth/berth.d.ts +11 -0
  3. package/dist/builtins/berth/berth.js +53 -22
  4. package/dist/builtins/berth/berth.js.map +1 -1
  5. package/dist/builtins/berth/berthCube.d.ts +17 -2
  6. package/dist/builtins/berth/berthCube.js +22 -10
  7. package/dist/builtins/berth/berthCube.js.map +1 -1
  8. package/dist/builtins/debug.d.ts +24 -3
  9. package/dist/builtins/debug.js +66 -13
  10. package/dist/builtins/debug.js.map +1 -1
  11. package/dist/builtins/fs/acl.args.d.ts +5 -38
  12. package/dist/builtins/fs/acl.args.js +6 -72
  13. package/dist/builtins/fs/acl.args.js.map +1 -1
  14. package/dist/builtins/fs/acl.d.ts +100 -10
  15. package/dist/builtins/fs/acl.js +222 -68
  16. package/dist/builtins/fs/acl.js.map +1 -1
  17. package/dist/builtins/fs/cat.args.d.ts +14 -15
  18. package/dist/builtins/fs/cat.args.js +13 -40
  19. package/dist/builtins/fs/cat.args.js.map +1 -1
  20. package/dist/builtins/fs/cat.d.ts +40 -3
  21. package/dist/builtins/fs/cat.js +89 -10
  22. package/dist/builtins/fs/cat.js.map +1 -1
  23. package/dist/builtins/fs/cd.d.ts +24 -6
  24. package/dist/builtins/fs/cd.js +71 -18
  25. package/dist/builtins/fs/cd.js.map +1 -1
  26. package/dist/builtins/fs/configWrite.d.ts +24 -8
  27. package/dist/builtins/fs/configWrite.js +77 -36
  28. package/dist/builtins/fs/configWrite.js.map +1 -1
  29. package/dist/builtins/fs/cp.d.ts +39 -4
  30. package/dist/builtins/fs/cp.js +120 -55
  31. package/dist/builtins/fs/cp.js.map +1 -1
  32. package/dist/builtins/fs/download.d.ts +12 -1
  33. package/dist/builtins/fs/download.js +24 -4
  34. package/dist/builtins/fs/download.js.map +1 -1
  35. package/dist/builtins/fs/du.d.ts +59 -33
  36. package/dist/builtins/fs/du.js +111 -79
  37. package/dist/builtins/fs/du.js.map +1 -1
  38. package/dist/builtins/fs/edit.d.ts +19 -4
  39. package/dist/builtins/fs/edit.js +77 -16
  40. package/dist/builtins/fs/edit.js.map +1 -1
  41. package/dist/builtins/fs/find.d.ts +25 -0
  42. package/dist/builtins/fs/find.js +76 -5
  43. package/dist/builtins/fs/find.js.map +1 -1
  44. package/dist/builtins/fs/mkdir.d.ts +28 -18
  45. package/dist/builtins/fs/mkdir.js +95 -66
  46. package/dist/builtins/fs/mkdir.js.map +1 -1
  47. package/dist/builtins/fs/mv.d.ts +34 -4
  48. package/dist/builtins/fs/mv.js +129 -64
  49. package/dist/builtins/fs/mv.js.map +1 -1
  50. package/dist/builtins/fs/pull.args.d.ts +56 -17
  51. package/dist/builtins/fs/pull.args.js +16 -66
  52. package/dist/builtins/fs/pull.args.js.map +1 -1
  53. package/dist/builtins/fs/pull.d.ts +62 -0
  54. package/dist/builtins/fs/pull.js +86 -22
  55. package/dist/builtins/fs/pull.js.map +1 -1
  56. package/dist/builtins/fs/pwd.d.ts +19 -5
  57. package/dist/builtins/fs/pwd.js +62 -8
  58. package/dist/builtins/fs/pwd.js.map +1 -1
  59. package/dist/builtins/fs/rm.d.ts +58 -21
  60. package/dist/builtins/fs/rm.js +99 -82
  61. package/dist/builtins/fs/rm.js.map +1 -1
  62. package/dist/builtins/fs/rmdir.d.ts +29 -11
  63. package/dist/builtins/fs/rmdir.js +87 -36
  64. package/dist/builtins/fs/rmdir.js.map +1 -1
  65. package/dist/builtins/fs/touch.d.ts +44 -9
  66. package/dist/builtins/fs/touch.js +91 -27
  67. package/dist/builtins/fs/touch.js.map +1 -1
  68. package/dist/builtins/fs/transferJobs.d.ts +64 -0
  69. package/dist/builtins/fs/transferJobs.js +98 -0
  70. package/dist/builtins/fs/transferJobs.js.map +1 -0
  71. package/dist/builtins/fs/tree.d.ts +36 -9
  72. package/dist/builtins/fs/tree.js +126 -36
  73. package/dist/builtins/fs/tree.js.map +1 -1
  74. package/dist/builtins/fs/upload.d.ts +35 -3
  75. package/dist/builtins/fs/upload.js +99 -14
  76. package/dist/builtins/fs/upload.js.map +1 -1
  77. package/dist/builtins/fs/xattr.args.d.ts +12 -33
  78. package/dist/builtins/fs/xattr.args.js +17 -95
  79. package/dist/builtins/fs/xattr.args.js.map +1 -1
  80. package/dist/builtins/fs/xattr.d.ts +98 -8
  81. package/dist/builtins/fs/xattr.js +163 -24
  82. package/dist/builtins/fs/xattr.js.map +1 -1
  83. package/dist/builtins/games/bytes.d.ts +201 -5
  84. package/dist/builtins/games/bytes.js +255 -54
  85. package/dist/builtins/games/bytes.js.map +1 -1
  86. package/dist/builtins/games/chimes.d.ts +180 -3
  87. package/dist/builtins/games/chimes.js +203 -26
  88. package/dist/builtins/games/chimes.js.map +1 -1
  89. package/dist/builtins/games/chrislab.d.ts +101 -3
  90. package/dist/builtins/games/chrislab.js +117 -17
  91. package/dist/builtins/games/chrislab.js.map +1 -1
  92. package/dist/builtins/games/cowsay.d.ts +93 -2
  93. package/dist/builtins/games/cowsay.js +90 -31
  94. package/dist/builtins/games/cowsay.js.map +1 -1
  95. package/dist/builtins/games/figlet.d.ts +70 -2
  96. package/dist/builtins/games/figlet.js +83 -6
  97. package/dist/builtins/games/figlet.js.map +1 -1
  98. package/dist/builtins/games/lab.d.ts +104 -5
  99. package/dist/builtins/games/lab.js +144 -6
  100. package/dist/builtins/games/lab.js.map +1 -1
  101. package/dist/builtins/games/lolcat.d.ts +61 -1
  102. package/dist/builtins/games/lolcat.js +59 -24
  103. package/dist/builtins/games/lolcat.js.map +1 -1
  104. package/dist/builtins/games/morse.d.ts +36 -1
  105. package/dist/builtins/games/morse.js +50 -2
  106. package/dist/builtins/games/morse.js.map +1 -1
  107. package/dist/builtins/games/numbers.d.ts +241 -5
  108. package/dist/builtins/games/numbers.js +298 -23
  109. package/dist/builtins/games/numbers.js.map +1 -1
  110. package/dist/builtins/games/play.d.ts +96 -6
  111. package/dist/builtins/games/play.js +137 -6
  112. package/dist/builtins/games/play.js.map +1 -1
  113. package/dist/builtins/games/qr.d.ts +40 -1
  114. package/dist/builtins/games/qr.js +51 -2
  115. package/dist/builtins/games/qr.js.map +1 -1
  116. package/dist/builtins/games/show.d.ts +131 -6
  117. package/dist/builtins/games/show.js +208 -20
  118. package/dist/builtins/games/show.js.map +1 -1
  119. package/dist/builtins/games/sky.d.ts +178 -4
  120. package/dist/builtins/games/sky.js +228 -12
  121. package/dist/builtins/games/sky.js.map +1 -1
  122. package/dist/builtins/games/text.d.ts +258 -7
  123. package/dist/builtins/games/text.js +310 -29
  124. package/dist/builtins/games/text.js.map +1 -1
  125. package/dist/builtins/games/trek.d.ts +67 -3
  126. package/dist/builtins/games/trek.js +63 -10
  127. package/dist/builtins/games/trek.js.map +1 -1
  128. package/dist/builtins/games/wtf.d.ts +58 -1
  129. package/dist/builtins/games/wtf.js +67 -6
  130. package/dist/builtins/games/wtf.js.map +1 -1
  131. package/dist/builtins/help.d.ts +38 -2
  132. package/dist/builtins/help.js +76 -769
  133. package/dist/builtins/help.js.map +1 -1
  134. package/dist/builtins/helpSections.js +4 -1
  135. package/dist/builtins/helpSections.js.map +1 -1
  136. package/dist/builtins/net/connect.d.ts +36 -3
  137. package/dist/builtins/net/connect.js +84 -26
  138. package/dist/builtins/net/connect.js.map +1 -1
  139. package/dist/builtins/net/cubepath.d.ts +49 -5
  140. package/dist/builtins/net/cubepath.js +69 -27
  141. package/dist/builtins/net/cubepath.js.map +1 -1
  142. package/dist/builtins/net/logout.d.ts +13 -4
  143. package/dist/builtins/net/logout.js +49 -3
  144. package/dist/builtins/net/logout.js.map +1 -1
  145. package/dist/builtins/net/netstat.d.ts +29 -4
  146. package/dist/builtins/net/netstat.js +64 -23
  147. package/dist/builtins/net/netstat.js.map +1 -1
  148. package/dist/builtins/net/pacs.d.ts +169 -15
  149. package/dist/builtins/net/pacs.js +92 -33
  150. package/dist/builtins/net/pacs.js.map +1 -1
  151. package/dist/builtins/net/query.args.d.ts +95 -0
  152. package/dist/builtins/net/query.args.js +26 -0
  153. package/dist/builtins/net/query.args.js.map +1 -0
  154. package/dist/builtins/net/query.d.ts +98 -5
  155. package/dist/builtins/net/query.js +89 -83
  156. package/dist/builtins/net/query.js.map +1 -1
  157. package/dist/builtins/net/status.d.ts +5 -3
  158. package/dist/builtins/net/status.js +5 -12
  159. package/dist/builtins/net/status.js.map +1 -1
  160. package/dist/builtins/parametersofplugin.d.ts +82 -3
  161. package/dist/builtins/parametersofplugin.js +79 -23
  162. package/dist/builtins/parametersofplugin.js.map +1 -1
  163. package/dist/builtins/proc.d.ts +210 -3
  164. package/dist/builtins/proc.js +210 -119
  165. package/dist/builtins/proc.js.map +1 -1
  166. package/dist/builtins/res/compute.d.ts +67 -3
  167. package/dist/builtins/res/compute.js +121 -35
  168. package/dist/builtins/res/compute.js.map +1 -1
  169. package/dist/builtins/res/dicom.d.ts +52 -3
  170. package/dist/builtins/res/dicom.js +82 -34
  171. package/dist/builtins/res/dicom.js.map +1 -1
  172. package/dist/builtins/res/expect.d.ts +52 -3
  173. package/dist/builtins/res/expect.js +92 -29
  174. package/dist/builtins/res/expect.js.map +1 -1
  175. package/dist/builtins/res/feed.d.ts +475 -3
  176. package/dist/builtins/res/feed.js +253 -158
  177. package/dist/builtins/res/feed.js.map +1 -1
  178. package/dist/builtins/res/files.d.ts +517 -3
  179. package/dist/builtins/res/files.js +124 -44
  180. package/dist/builtins/res/files.js.map +1 -1
  181. package/dist/builtins/res/gather.d.ts +113 -3
  182. package/dist/builtins/res/gather.js +153 -44
  183. package/dist/builtins/res/gather.js.map +1 -1
  184. package/dist/builtins/res/gather.process.d.ts +27 -19
  185. package/dist/builtins/res/gather.process.js +29 -59
  186. package/dist/builtins/res/gather.process.js.map +1 -1
  187. package/dist/builtins/res/group.d.ts +284 -3
  188. package/dist/builtins/res/group.js +147 -76
  189. package/dist/builtins/res/group.js.map +1 -1
  190. package/dist/builtins/res/image.d.ts +30 -2
  191. package/dist/builtins/res/image.js +62 -10
  192. package/dist/builtins/res/image.js.map +1 -1
  193. package/dist/builtins/res/play.d.ts +71 -9
  194. package/dist/builtins/res/play.js +124 -82
  195. package/dist/builtins/res/play.js.map +1 -1
  196. package/dist/builtins/res/plugininstance.d.ts +307 -2
  197. package/dist/builtins/res/plugininstance.js +122 -50
  198. package/dist/builtins/res/plugininstance.js.map +1 -1
  199. package/dist/builtins/res/pluginmeta.d.ts +244 -2
  200. package/dist/builtins/res/pluginmeta.js +98 -40
  201. package/dist/builtins/res/pluginmeta.js.map +1 -1
  202. package/dist/builtins/res/record.d.ts +37 -3
  203. package/dist/builtins/res/record.js +127 -57
  204. package/dist/builtins/res/record.js.map +1 -1
  205. package/dist/builtins/res/resourceList.d.ts +136 -0
  206. package/dist/builtins/res/resourceList.js +51 -0
  207. package/dist/builtins/res/resourceList.js.map +1 -0
  208. package/dist/builtins/res/tag.d.ts +244 -3
  209. package/dist/builtins/res/tag.js +97 -41
  210. package/dist/builtins/res/tag.js.map +1 -1
  211. package/dist/builtins/res/user.d.ts +122 -3
  212. package/dist/builtins/res/user.js +83 -21
  213. package/dist/builtins/res/user.js.map +1 -1
  214. package/dist/builtins/res/workflow.d.ts +244 -2
  215. package/dist/builtins/res/workflow.js +97 -40
  216. package/dist/builtins/res/workflow.js.map +1 -1
  217. package/dist/builtins/store.d.ts +85 -3
  218. package/dist/builtins/store.js +135 -68
  219. package/dist/builtins/store.js.map +1 -1
  220. package/dist/builtins/sys/apropos.d.ts +80 -5
  221. package/dist/builtins/sys/apropos.js +121 -15
  222. package/dist/builtins/sys/apropos.js.map +1 -1
  223. package/dist/builtins/sys/cal.d.ts +44 -5
  224. package/dist/builtins/sys/cal.js +57 -10
  225. package/dist/builtins/sys/cal.js.map +1 -1
  226. package/dist/builtins/sys/command.d.ts +20 -0
  227. package/dist/builtins/sys/command.js +31 -0
  228. package/dist/builtins/sys/command.js.map +1 -1
  229. package/dist/builtins/sys/context.d.ts +13 -3
  230. package/dist/builtins/sys/context.js +51 -4
  231. package/dist/builtins/sys/context.js.map +1 -1
  232. package/dist/builtins/sys/date.d.ts +56 -5
  233. package/dist/builtins/sys/date.js +63 -9
  234. package/dist/builtins/sys/date.js.map +1 -1
  235. package/dist/builtins/sys/echo.d.ts +63 -2
  236. package/dist/builtins/sys/echo.js +87 -8
  237. package/dist/builtins/sys/echo.js.map +1 -1
  238. package/dist/builtins/sys/fortune.d.ts +27 -2
  239. package/dist/builtins/sys/fortune.js +44 -2
  240. package/dist/builtins/sys/fortune.js.map +1 -1
  241. package/dist/builtins/sys/grep.d.ts +245 -11
  242. package/dist/builtins/sys/grep.js +418 -131
  243. package/dist/builtins/sys/grep.js.map +1 -1
  244. package/dist/builtins/sys/joblets.d.ts +66 -7
  245. package/dist/builtins/sys/joblets.js +101 -14
  246. package/dist/builtins/sys/joblets.js.map +1 -1
  247. package/dist/builtins/sys/motd.d.ts +37 -3
  248. package/dist/builtins/sys/motd.js +49 -8
  249. package/dist/builtins/sys/motd.js.map +1 -1
  250. package/dist/builtins/sys/notes.d.ts +75 -3
  251. package/dist/builtins/sys/notes.js +90 -29
  252. package/dist/builtins/sys/notes.js.map +1 -1
  253. package/dist/builtins/sys/physicalmode.d.ts +24 -3
  254. package/dist/builtins/sys/physicalmode.js +68 -14
  255. package/dist/builtins/sys/physicalmode.js.map +1 -1
  256. package/dist/builtins/sys/tasks.d.ts +74 -5
  257. package/dist/builtins/sys/tasks.js +102 -14
  258. package/dist/builtins/sys/tasks.js.map +1 -1
  259. package/dist/builtins/sys/textFilters.d.ts +673 -41
  260. package/dist/builtins/sys/textFilters.js +718 -263
  261. package/dist/builtins/sys/textFilters.js.map +1 -1
  262. package/dist/builtins/sys/timing.d.ts +24 -3
  263. package/dist/builtins/sys/timing.js +67 -14
  264. package/dist/builtins/sys/timing.js.map +1 -1
  265. package/dist/builtins/sys/variables.d.ts +70 -4
  266. package/dist/builtins/sys/variables.js +103 -31
  267. package/dist/builtins/sys/variables.js.map +1 -1
  268. package/dist/builtins/sys/version.d.ts +27 -2
  269. package/dist/builtins/sys/version.js +48 -3
  270. package/dist/builtins/sys/version.js.map +1 -1
  271. package/dist/builtins/sys/weather.d.ts +92 -15
  272. package/dist/builtins/sys/weather.js +71 -45
  273. package/dist/builtins/sys/weather.js.map +1 -1
  274. package/dist/builtins/sys/whoami.d.ts +38 -18
  275. package/dist/builtins/sys/whoami.js +112 -8
  276. package/dist/builtins/sys/whoami.js.map +1 -1
  277. package/dist/builtins/utils.d.ts +0 -37
  278. package/dist/builtins/utils.js +0 -86
  279. package/dist/builtins/utils.js.map +1 -1
  280. package/dist/chris/chrisCommands.js +58 -152
  281. package/dist/chris/chrisCommands.js.map +1 -1
  282. package/dist/chris/commandFallback.d.ts +12 -0
  283. package/dist/chris/commandFallback.js +47 -0
  284. package/dist/chris/commandFallback.js.map +1 -1
  285. package/dist/chris/filesystem.js +7 -5
  286. package/dist/chris/filesystem.js.map +1 -1
  287. package/dist/chris/help.js +0 -1018
  288. package/dist/chris/help.js.map +1 -1
  289. package/dist/chris/kinds.d.ts +21 -0
  290. package/dist/chris/kinds.js +114 -2
  291. package/dist/chris/kinds.js.map +1 -1
  292. package/dist/chris/mounts.d.ts +4 -4
  293. package/dist/chris/mounts.js +9 -16
  294. package/dist/chris/mounts.js.map +1 -1
  295. package/dist/chris/navigation.d.ts +2 -3
  296. package/dist/chris/navigation.js +6 -20
  297. package/dist/chris/navigation.js.map +1 -1
  298. package/dist/chris/pacsResources.d.ts +259 -0
  299. package/dist/chris/pacsResources.js +168 -0
  300. package/dist/chris/pacsResources.js.map +1 -0
  301. package/dist/core/commandDeclaration.d.ts +97 -7
  302. package/dist/core/commandDeclaration.js +21 -0
  303. package/dist/core/commandDeclaration.js.map +1 -1
  304. package/dist/core/commandParse.js +65 -17
  305. package/dist/core/commandParse.js.map +1 -1
  306. package/dist/core/commandRegistry.d.ts +4 -3
  307. package/dist/core/commandRegistry.js +36 -8
  308. package/dist/core/commandRegistry.js.map +1 -1
  309. package/dist/core/commandSchema.js +5 -2
  310. package/dist/core/commandSchema.js.map +1 -1
  311. package/dist/core/commandUsage.d.ts +15 -0
  312. package/dist/core/commandUsage.js +59 -7
  313. package/dist/core/commandUsage.js.map +1 -1
  314. package/dist/core/coreCommands.js +63 -212
  315. package/dist/core/coreCommands.js.map +1 -1
  316. package/dist/core/paths.d.ts +29 -1
  317. package/dist/core/paths.js +15 -2
  318. package/dist/core/paths.js.map +1 -1
  319. package/dist/core/preprocess.d.ts +3 -4
  320. package/dist/core/preprocess.js +4 -5
  321. package/dist/core/preprocess.js.map +1 -1
  322. package/dist/lib/completer/declared.js +7 -4
  323. package/dist/lib/completer/declared.js.map +1 -1
  324. package/dist/lib/completer/index.js +2 -7
  325. package/dist/lib/completer/index.js.map +1 -1
  326. package/dist/lib/parser.d.ts +0 -8
  327. package/dist/lib/parser.js +0 -11
  328. package/dist/lib/parser.js.map +1 -1
  329. package/dist/lib/vfs/vfs.d.ts +2 -1
  330. package/dist/lib/vfs/vfs.js +5 -4
  331. package/dist/lib/vfs/vfs.js.map +1 -1
  332. package/dist/notes.json +1 -1
  333. package/package.json +5 -5
@@ -1,8 +1,40 @@
1
1
  import { type CommandEnvelope } from '@fnndsc/menu';
2
2
  /**
3
- * Uploads a local file or directory to ChRIS.
3
+ * `upload [-j N] <source> <destination>`: the declaration.
4
4
  *
5
- * @param args - [localPath, remotePath]
6
- * @returns An envelope carrying the upload summary.
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 Builtin upload command.
3
- * Uploads files to ChRIS.
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 args - [localPath, remotePath]
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
- export async function builtin_upload(args) {
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 localGlob = shellArguments_pathnameExpansion(args, 0);
51
- const targetRemote = await path_resolve(remotePath);
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
- // Also invalidate parent to refresh its listing
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":"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"}
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
- /** How `setfattr` is spelled. */
4
- export declare const SETFATTR_USAGE: string;
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 Shared `setfattr` / `getfattr` command-line grammar.
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
- * Dependency-free, as `acl.args.ts` is: the engine graph cannot be loaded
10
- * under jest, so a grammar inside the builtin is a grammar nothing tests.
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
- /** How `setfattr` is spelled. */
18
- export const SETFATTR_USAGE = 'setfattr: usage: setfattr -n tag -v <value> <path>... | setfattr -x tag [-v <value>] <path>...';
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":"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"}
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
- * Reads the tags a feed wears, in `getfattr`'s dump shape.
3
+ * `getfattr [-d] [-n tag] <path>…`: the declaration.
4
4
  *
5
- * @param args - Raw argument tokens.
6
- * @returns An envelope carrying the rendered blocks and a model of them.
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
- * Hangs a tag on feeds (`-n tag -v <value>`), or takes one off (`-x tag -v
11
- * <value>`), or takes every tag off (`-x tag`, as setfattr removes the
12
- * whole attribute). Silent on success, as setfattr is; a refusal is named.
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
- * @param args - Raw argument tokens.
15
- * @returns An envelope, empty on success.
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>;