@poe-platform/safe-bash 0.1.620 → 0.1.621
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/safe-bash/commands/archive/zip/dates.d.ts +3 -0
- package/dist/safe-bash/commands/archive/zip/dates.d.ts.map +1 -0
- package/dist/safe-bash/commands/archive/zip/dates.js +49 -0
- package/dist/safe-bash/commands/archive/zip/dates.js.map +1 -0
- package/dist/safe-bash/commands/archive/zip/environment.d.ts +3 -0
- package/dist/safe-bash/commands/archive/zip/environment.d.ts.map +1 -0
- package/dist/safe-bash/commands/archive/zip/environment.js +62 -0
- package/dist/safe-bash/commands/archive/zip/environment.js.map +1 -0
- package/dist/safe-bash/commands/archive/zip/options.js +4 -4
- package/dist/safe-bash/commands/archive/zip/options.js.map +1 -1
- package/dist/safe-bash/commands/archive/zip.d.ts.map +1 -1
- package/dist/safe-bash/commands/archive/zip.js +111 -23
- package/dist/safe-bash/commands/archive/zip.js.map +1 -1
- package/dist/safe-bash/core.browser.js +503 -340
- package/dist/safe-bash/core.browser.js.map +4 -4
- package/package.json +2 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dates.d.ts","sourceRoot":"","sources":["../../../../src/commands/archive/zip/dates.ts"],"names":[],"mappings":"AA2BA,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,IAAI,GAAG,MAAM,CAOtE;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAO3G"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { ZipFailure } from "./options.js";
|
|
2
|
+
function integer(input, start, width) {
|
|
3
|
+
let offset = start;
|
|
4
|
+
while (" \t\r\n\v\f".includes(input[offset] ?? "\0"))
|
|
5
|
+
offset++;
|
|
6
|
+
const end = offset + width;
|
|
7
|
+
let sign = 1;
|
|
8
|
+
if (input[offset] === "+" || input[offset] === "-") {
|
|
9
|
+
sign = input[offset] === "-" ? -1 : 1;
|
|
10
|
+
offset++;
|
|
11
|
+
}
|
|
12
|
+
let digits = 0;
|
|
13
|
+
let value = 0;
|
|
14
|
+
while (offset < end && input[offset] !== undefined && input[offset] >= "0" && input[offset] <= "9") {
|
|
15
|
+
value = value * 10 + Number(input[offset++]);
|
|
16
|
+
digits++;
|
|
17
|
+
}
|
|
18
|
+
return digits ? { value: value * sign, end: offset } : undefined;
|
|
19
|
+
}
|
|
20
|
+
function fields(input, iso) {
|
|
21
|
+
const first = integer(input, 0, iso ? 4 : 2);
|
|
22
|
+
if (!first || iso && input[first.end] !== "-")
|
|
23
|
+
return;
|
|
24
|
+
const second = integer(input, first.end + (iso ? 1 : 0), 2);
|
|
25
|
+
if (!second || iso && input[second.end] !== "-")
|
|
26
|
+
return;
|
|
27
|
+
const third = integer(input, second.end + (iso ? 1 : 0), iso ? 2 : 4);
|
|
28
|
+
if (!third)
|
|
29
|
+
return;
|
|
30
|
+
return iso ? [first.value, second.value, third.value] : [third.value, first.value, second.value];
|
|
31
|
+
}
|
|
32
|
+
export function parseZipDate(input, option) {
|
|
33
|
+
const result = fields(input, true) ?? fields(input, false);
|
|
34
|
+
if (!result || result[1] < 1 || result[1] > 12 || result[2] < 1 || result[2] > 31) {
|
|
35
|
+
throw new ZipFailure(16, "Invalid command arguments", `invalid date entered for -${option} option - use mmddyyyy or yyyy-mm-dd`);
|
|
36
|
+
}
|
|
37
|
+
const [year, month, day] = result;
|
|
38
|
+
return year < 1980 ? 2162688 : (year - 1980) * 33554432 + month * 2097152 + day * 65536;
|
|
39
|
+
}
|
|
40
|
+
export function zipDateMatches(modified, from, until) {
|
|
41
|
+
if (from === undefined && until === undefined)
|
|
42
|
+
return true;
|
|
43
|
+
const rounded = new Date(Math.ceil(Math.floor(modified.getTime() / 1000) / 2) * 2000);
|
|
44
|
+
const key = rounded.getFullYear() < 1980 ? 2162688 : (rounded.getFullYear() - 1980) * 33554432
|
|
45
|
+
+ (rounded.getMonth() + 1) * 2097152 + rounded.getDate() * 65536
|
|
46
|
+
+ rounded.getHours() * 2048 + rounded.getMinutes() * 32 + rounded.getSeconds() / 2;
|
|
47
|
+
return (from === undefined || key >= from) && (until === undefined || key < until);
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=dates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dates.js","sourceRoot":"","sources":["../../../../src/commands/archive/zip/dates.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"environment.d.ts","sourceRoot":"","sources":["../../../../src/commands/archive/zip/environment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,KAAK,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAM1D,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,MAAM,EAAE,aAAa,GAAG,SAAS,MAAM,EAAE,CAyChJ"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { fail } from "../internal.js";
|
|
2
|
+
function whitespace(character) {
|
|
3
|
+
return character === " " || character === "\t" || character === "\n" || character === "\r" || character === "\v" || character === "\f";
|
|
4
|
+
}
|
|
5
|
+
export function zipEnvironmentArguments(env, argv, limits) {
|
|
6
|
+
let value = "";
|
|
7
|
+
let selectedBytes = 0;
|
|
8
|
+
for (const key of ["ZIPOPT", "ZIP_OPTS"]) {
|
|
9
|
+
const candidate = env[key] ?? "";
|
|
10
|
+
if (Buffer.byteLength(candidate) > limits.maxArgumentBytes)
|
|
11
|
+
fail("environment argument byte limit exceeded");
|
|
12
|
+
let start = 0;
|
|
13
|
+
while (whitespace(candidate[start]))
|
|
14
|
+
start++;
|
|
15
|
+
if (start < candidate.length) {
|
|
16
|
+
value = candidate.slice(start);
|
|
17
|
+
selectedBytes = Buffer.byteLength(candidate);
|
|
18
|
+
break;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
if (!value)
|
|
22
|
+
return argv;
|
|
23
|
+
if (value.includes("\0") || Buffer.from(value).toString("utf8") !== value)
|
|
24
|
+
fail("invalid environment argument text");
|
|
25
|
+
let bytes = selectedBytes;
|
|
26
|
+
for (const argument of argv) {
|
|
27
|
+
bytes += Buffer.byteLength(argument);
|
|
28
|
+
if (bytes > limits.maxArgumentBytes)
|
|
29
|
+
fail("argument byte limit exceeded");
|
|
30
|
+
}
|
|
31
|
+
const defaults = [];
|
|
32
|
+
let offset = 0;
|
|
33
|
+
while (offset < value.length) {
|
|
34
|
+
let argument = "";
|
|
35
|
+
if (value[offset] === '"') {
|
|
36
|
+
offset++;
|
|
37
|
+
while (offset < value.length && value[offset] !== '"') {
|
|
38
|
+
if (value[offset] === "\\") {
|
|
39
|
+
offset++;
|
|
40
|
+
if (offset === value.length)
|
|
41
|
+
break;
|
|
42
|
+
}
|
|
43
|
+
argument += value[offset++];
|
|
44
|
+
}
|
|
45
|
+
if (value[offset] === '"')
|
|
46
|
+
offset++;
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
const start = offset;
|
|
50
|
+
while (offset < value.length && !whitespace(value[offset]))
|
|
51
|
+
offset++;
|
|
52
|
+
argument = value.slice(start, offset);
|
|
53
|
+
}
|
|
54
|
+
if (defaults.length + argv.length >= limits.maxArgumentBytes)
|
|
55
|
+
fail("argument count limit exceeded");
|
|
56
|
+
defaults.push(argument);
|
|
57
|
+
while (whitespace(value[offset]))
|
|
58
|
+
offset++;
|
|
59
|
+
}
|
|
60
|
+
return [...defaults, ...argv];
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=environment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"environment.js","sourceRoot":"","sources":["../../../../src/commands/archive/zip/environment.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,7 +13,7 @@ const longOptions = {
|
|
|
13
13
|
delete: "d", include: "i", exclude: "x", suffixes: "n", store: "0", "compression-method": "Z",
|
|
14
14
|
"compress-1": "1", "compress-2": "2", "compress-3": "3", "compress-4": "4",
|
|
15
15
|
"compress-5": "5", "compress-6": "6", "compress-7": "7", "compress-8": "8",
|
|
16
|
-
"compress-9": "9", "force-zip64": "fz", "strip-extra": "X", "force-descriptors": "fd", "no-wild": "nw", "wild-stop-dirs": "ws", "recurse-patterns": "R",
|
|
16
|
+
"compress-9": "9", "force-zip64": "fz", "strip-extra": "X", "force-descriptors": "fd", "no-wild": "nw", "wild-stop-dirs": "ws", "recurse-patterns": "R", "from-date": "t", "before-date": "tt", "copy-entries": "U", "output-file": "O",
|
|
17
17
|
};
|
|
18
18
|
// Include unimplemented Unix options when resolving abbreviations: a partial
|
|
19
19
|
// implementation must not make native-ambiguous prefixes uniquely resolvable.
|
|
@@ -23,10 +23,10 @@ const reservedOptions = [
|
|
|
23
23
|
"difference-archive", "encrypt", "fix", "fixfix", "fifo", "filesync",
|
|
24
24
|
"grow", "help", "more-help", "junk-sfx",
|
|
25
25
|
"DOS-names", "to-crlf", "from-crlf", "logfile-path", "log-append", "log-info",
|
|
26
|
-
"license", "move", "must-match", "latest-time",
|
|
26
|
+
"license", "move", "must-match", "latest-time",
|
|
27
27
|
"paths", "password", "regex", "split-size", "split-pause",
|
|
28
28
|
"split-verbose", "split-bell", "show-command", "show-debug", "show-files",
|
|
29
|
-
"show-options", "
|
|
29
|
+
"show-options", "unzip-command",
|
|
30
30
|
"verbose", "version", "archive-comment",
|
|
31
31
|
];
|
|
32
32
|
export function normalizeZipOption(argument) {
|
|
@@ -46,7 +46,7 @@ export function normalizeZipOption(argument) {
|
|
|
46
46
|
throw new ZipFailure(16, "Invalid command arguments", `unsupported option: ${argument}`);
|
|
47
47
|
if (negate && short !== "fz" && short !== "X")
|
|
48
48
|
throw new ZipFailure(16, "Invalid command arguments", `option ${matched} is not negatable`);
|
|
49
|
-
if (equal >= 0 && short !== "i" && short !== "x" && short !== "n" && short !== "Z") {
|
|
49
|
+
if (equal >= 0 && short !== "i" && short !== "x" && short !== "n" && short !== "Z" && short !== "t" && short !== "tt" && short !== "O") {
|
|
50
50
|
throw new ZipFailure(16, "Invalid command arguments", `option '${matched}' does not allow a value`);
|
|
51
51
|
}
|
|
52
52
|
return `-${short}${negate ? "-" : ""}${equal < 0 ? "" : argument.slice(equal)}`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"options.js","sourceRoot":"","sources":["../../../../src/commands/archive/zip/options.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,UAAW,SAAQ,KAAK;IACd;IAAyB;IAA9C,YAAqB,MAAc,EAAW,KAAa,EAAE,MAAc;QAAI,KAAK,CAAC,MAAM,CAAC,CAAC;QAAxE,WAAM,GAAN,MAAM,CAAQ;QAAW,UAAK,GAAL,KAAK,CAAQ;IAAmC,CAAC;CAChG;AAED,MAAM,WAAW,GAAqC;IACpD,eAAe,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,YAAY,EAAE,GAAG,EAAE,gBAAgB,EAAE,GAAG;IAC1E,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG;IACvE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,oBAAoB,EAAE,GAAG;IAC7F,YAAY,EAAE,GAAG,EAAE,YAAY,EAAE,GAAG,EAAE,YAAY,EAAE,GAAG,EAAE,YAAY,EAAE,GAAG;IAC1E,YAAY,EAAE,GAAG,EAAE,YAAY,EAAE,GAAG,EAAE,YAAY,EAAE,GAAG,EAAE,YAAY,EAAE,GAAG;IAC1E,YAAY,EAAE,GAAG,EAAE,aAAa,EAAE,IAAI,EAAE,aAAa,EAAE,GAAG,EAAE,mBAAmB,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,kBAAkB,EAAE,GAAG;
|
|
1
|
+
{"version":3,"file":"options.js","sourceRoot":"","sources":["../../../../src/commands/archive/zip/options.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,UAAW,SAAQ,KAAK;IACd;IAAyB;IAA9C,YAAqB,MAAc,EAAW,KAAa,EAAE,MAAc;QAAI,KAAK,CAAC,MAAM,CAAC,CAAC;QAAxE,WAAM,GAAN,MAAM,CAAQ;QAAW,UAAK,GAAL,KAAK,CAAQ;IAAmC,CAAC;CAChG;AAED,MAAM,WAAW,GAAqC;IACpD,eAAe,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,YAAY,EAAE,GAAG,EAAE,gBAAgB,EAAE,GAAG;IAC1E,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG;IACvE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,oBAAoB,EAAE,GAAG;IAC7F,YAAY,EAAE,GAAG,EAAE,YAAY,EAAE,GAAG,EAAE,YAAY,EAAE,GAAG,EAAE,YAAY,EAAE,GAAG;IAC1E,YAAY,EAAE,GAAG,EAAE,YAAY,EAAE,GAAG,EAAE,YAAY,EAAE,GAAG,EAAE,YAAY,EAAE,GAAG;IAC1E,YAAY,EAAE,GAAG,EAAE,aAAa,EAAE,IAAI,EAAE,aAAa,EAAE,GAAG,EAAE,mBAAmB,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,kBAAkB,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,aAAa,EAAE,IAAI,EAAE,cAAc,EAAE,GAAG,EAAE,aAAa,EAAE,GAAG;CACxO,CAAC;AAEF,6EAA6E;AAC7E,8EAA8E;AAC9E,MAAM,eAAe,GAAG;IACtB,YAAY,EAAE,WAAW,EAAE,gBAAgB,EAAE,eAAe,EAAE,gBAAgB;IAC9E,cAAc,EAAE,oBAAoB,EAAE,UAAU,EAAE,eAAe,EAAE,gBAAgB;IACnF,oBAAoB,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU;IACpE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU;IACvC,WAAW,EAAE,SAAS,EAAE,WAAW,EAAE,cAAc,EAAE,YAAY,EAAE,UAAU;IAC7E,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,aAAa;IAC9C,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,EAAE,aAAa;IACzD,eAAe,EAAE,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,YAAY;IACzE,cAAc,EAAE,eAAe;IAC/B,SAAS,EAAE,SAAS,EAAE,iBAAiB;CACxC,CAAC;AAEF,MAAM,UAAU,kBAAkB,CAAC,QAAgB;IACjD,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,QAAQ,KAAK,IAAI;QAAE,OAAO,QAAQ,CAAC;IACrE,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACpC,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACjE,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IACrC,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IACrD,MAAM,KAAK,GAAG,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,GAAG,eAAe,CAAC,CAAC;IAChE,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;IAChG,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,IAAI,UAAU,CAAC,EAAE,EAAE,2BAA2B,EAAE,gBAAgB,IAAI,aAAa,CAAC,CAAC;IACjH,MAAM,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAC3B,MAAM,KAAK,GAAG,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IACvE,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,UAAU,CAAC,EAAE,EAAE,2BAA2B,EAAE,uBAAuB,QAAQ,EAAE,CAAC,CAAC;IACrG,IAAI,MAAM,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,GAAG;QAAE,MAAM,IAAI,UAAU,CAAC,EAAE,EAAE,2BAA2B,EAAE,UAAU,OAAO,mBAAmB,CAAC,CAAC;IAC3I,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;QACvI,MAAM,IAAI,UAAU,CAAC,EAAE,EAAE,2BAA2B,EAAE,WAAW,OAAO,0BAA0B,CAAC,CAAC;IACtG,CAAC;IACD,OAAO,IAAI,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;AAClF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"zip.d.ts","sourceRoot":"","sources":["../../../src/commands/archive/zip.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"zip.d.ts","sourceRoot":"","sources":["../../../src/commands/archive/zip.ts"],"names":[],"mappings":"AAEA,OAAO,EAA0D,KAAK,iBAAiB,EAAiB,MAAM,0BAA0B,CAAC;AAOzI,OAAO,EAAwF,KAAK,sBAAsB,EAAsB,MAAM,eAAe,CAAC;AAghBtK,wBAAgB,gBAAgB,CAAC,OAAO,GAAE,sBAA2B,GAAG,iBAAiB,CA0CxF"}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { parseZipDate, zipDateMatches } from "./zip/dates.js";
|
|
2
|
+
import { zipEnvironmentArguments } from "./zip/environment.js";
|
|
1
3
|
import { collectBytes, dirname, getCommandArguments, writeBytes } from "../../contracts/index.js";
|
|
2
4
|
import { shellValueByteLength, shellValueBytes } from "../../contracts/value.js";
|
|
3
5
|
import { writeFileOutput } from "../../contracts/filesystem-output.js";
|
|
@@ -13,10 +15,11 @@ import { normalizeZipOption, ZipFailure } from "./zip/options.js";
|
|
|
13
15
|
const defaultStoreSuffixes = [".Z", ".zip", ".zoo", ".arc", ".lzh", ".arj"];
|
|
14
16
|
async function parse(scope, limits) {
|
|
15
17
|
const context = scope.context;
|
|
16
|
-
|
|
18
|
+
const args = zipEnvironmentArguments(context.env, context.args, limits);
|
|
19
|
+
if (args.length > limits.maxArgumentBytes)
|
|
17
20
|
fail("argument count limit exceeded");
|
|
18
21
|
let bytes = 0;
|
|
19
|
-
for (const argument of
|
|
22
|
+
for (const argument of args) {
|
|
20
23
|
const size = Buffer.byteLength(argument);
|
|
21
24
|
if (size > limits.maxArgumentBytes - bytes)
|
|
22
25
|
fail("argument byte limit exceeded");
|
|
@@ -35,6 +38,7 @@ async function parse(scope, limits) {
|
|
|
35
38
|
text(shellValueBytes(value));
|
|
36
39
|
}
|
|
37
40
|
let archive;
|
|
41
|
+
let output;
|
|
38
42
|
let action = "add";
|
|
39
43
|
let recursive = false;
|
|
40
44
|
let recursivePatterns = false;
|
|
@@ -45,6 +49,8 @@ async function parse(scope, limits) {
|
|
|
45
49
|
let omitDirectories = false;
|
|
46
50
|
let storeLinks = false;
|
|
47
51
|
let test = false;
|
|
52
|
+
let fromDate;
|
|
53
|
+
let beforeDate;
|
|
48
54
|
let descriptors = false;
|
|
49
55
|
let zip64;
|
|
50
56
|
let metadata = "default";
|
|
@@ -57,8 +63,8 @@ async function parse(scope, limits) {
|
|
|
57
63
|
const operands = [];
|
|
58
64
|
const includes = [];
|
|
59
65
|
const excludes = [];
|
|
60
|
-
for (let index = 0; index <
|
|
61
|
-
const original =
|
|
66
|
+
for (let index = 0; index < args.length; index++) {
|
|
67
|
+
const original = args[index];
|
|
62
68
|
checkPath(original, limits);
|
|
63
69
|
const argument = literal ? original : normalizeZipOption(original);
|
|
64
70
|
if (!literal && argument === "--") {
|
|
@@ -87,8 +93,8 @@ async function parse(scope, limits) {
|
|
|
87
93
|
zip64 = argument[offset + 2] !== "-";
|
|
88
94
|
offset += zip64 ? 1 : 2;
|
|
89
95
|
}
|
|
90
|
-
else if (flag === "d" || flag === "u" || flag === "f") {
|
|
91
|
-
const next = flag === "d" ? "delete" : flag === "u" ? "update" : "freshen";
|
|
96
|
+
else if (flag === "d" || flag === "u" || flag === "f" || flag === "U") {
|
|
97
|
+
const next = flag === "d" ? "delete" : flag === "u" ? "update" : flag === "U" ? "copy" : "freshen";
|
|
92
98
|
if (action !== "add" && action !== next)
|
|
93
99
|
throw new ZipFailure(16, "Invalid command arguments", "specify just one action");
|
|
94
100
|
action = next;
|
|
@@ -124,10 +130,35 @@ async function parse(scope, limits) {
|
|
|
124
130
|
if (level === 0)
|
|
125
131
|
method = "store";
|
|
126
132
|
}
|
|
133
|
+
else if (flag === "O") {
|
|
134
|
+
let value = argument.slice(offset + 1) || args[++index];
|
|
135
|
+
if (value?.startsWith("="))
|
|
136
|
+
value = value.slice(1);
|
|
137
|
+
if (value === undefined)
|
|
138
|
+
throw new ZipFailure(16, "Invalid command arguments", "option O requires a value");
|
|
139
|
+
output = value;
|
|
140
|
+
break;
|
|
141
|
+
}
|
|
142
|
+
else if (flag === "t") {
|
|
143
|
+
const option = argument[offset + 1] === "t" ? "tt" : "t";
|
|
144
|
+
if (option === "tt")
|
|
145
|
+
offset++;
|
|
146
|
+
let value = argument.slice(offset + 1);
|
|
147
|
+
if (!value)
|
|
148
|
+
value = args[++index] ?? "";
|
|
149
|
+
if (value.startsWith("="))
|
|
150
|
+
value = value.slice(1);
|
|
151
|
+
const date = parseZipDate(value, option);
|
|
152
|
+
if (option === "t")
|
|
153
|
+
fromDate = date;
|
|
154
|
+
else
|
|
155
|
+
beforeDate = date;
|
|
156
|
+
break;
|
|
157
|
+
}
|
|
127
158
|
else if (flag === "n" || flag === "Z") {
|
|
128
159
|
let value = argument.slice(offset + 1);
|
|
129
160
|
if (!value) {
|
|
130
|
-
const next =
|
|
161
|
+
const next = args[index + 1];
|
|
131
162
|
if (next === undefined || next.startsWith("-") && next !== "-")
|
|
132
163
|
throw new ZipFailure(16, "Invalid command arguments", `option '${flag}' requires a value`);
|
|
133
164
|
value = next;
|
|
@@ -166,8 +197,8 @@ async function parse(scope, limits) {
|
|
|
166
197
|
const value = argument.slice(offset + 1);
|
|
167
198
|
append(value.startsWith("=") ? value.slice(1) : value);
|
|
168
199
|
}
|
|
169
|
-
while (!attached && index + 1 <
|
|
170
|
-
const next =
|
|
200
|
+
while (!attached && index + 1 < args.length) {
|
|
201
|
+
const next = args[index + 1];
|
|
171
202
|
if (next === "@") {
|
|
172
203
|
index++;
|
|
173
204
|
break;
|
|
@@ -196,6 +227,8 @@ async function parse(scope, limits) {
|
|
|
196
227
|
}
|
|
197
228
|
}
|
|
198
229
|
if (archive === undefined) {
|
|
230
|
+
if (includes.length || excludes.length)
|
|
231
|
+
throw new ZipFailure(16, "Invalid command arguments", "nothing to select from");
|
|
199
232
|
if (action !== "add")
|
|
200
233
|
throw new ZipFailure(16, "Invalid command arguments", "expected archive name");
|
|
201
234
|
archive = "-";
|
|
@@ -205,6 +238,15 @@ async function parse(scope, limits) {
|
|
|
205
238
|
if (archive !== "-" && !archive.slice(archive.lastIndexOf("/") + 1).includes("."))
|
|
206
239
|
archive += ".zip";
|
|
207
240
|
checkPath(archive, limits);
|
|
241
|
+
if (output !== undefined) {
|
|
242
|
+
if (!output.slice(output.lastIndexOf("/") + 1).includes("."))
|
|
243
|
+
output += ".zip";
|
|
244
|
+
checkPath(output, limits);
|
|
245
|
+
if (action === "add" && archive !== "-" && !operands.length && !stdinNames)
|
|
246
|
+
action = "copy";
|
|
247
|
+
}
|
|
248
|
+
if (action === "copy" && output === undefined)
|
|
249
|
+
throw new ZipFailure(16, "Invalid command arguments", "-U (--copy) requires -O (--out)");
|
|
208
250
|
const names = [];
|
|
209
251
|
if (stdinNames) {
|
|
210
252
|
const input = await collectBytes(scope.stdin, { maxBytes: limits.maxFilesFromBytes, signal: context.signal });
|
|
@@ -234,7 +276,7 @@ async function parse(scope, limits) {
|
|
|
234
276
|
}
|
|
235
277
|
if (recursivePatterns && !names.length && !operands.length)
|
|
236
278
|
throw new ZipFailure(16, "Invalid command arguments", "nothing to select from");
|
|
237
|
-
return { action, archive, recursive, recursivePatterns, noWild, stopAtDirectories, quiet, junkPaths, omitDirectories, storeLinks, test, descriptors, zip64, metadata, includes, excludes, level, method, suffixes, operands: [...names, ...operands], firstOperand };
|
|
279
|
+
return { args, action, archive, output, recursive, recursivePatterns, noWild, stopAtDirectories, quiet, junkPaths, omitDirectories, storeLinks, test, fromDate, beforeDate, descriptors, zip64, metadata, includes, excludes, level, method, suffixes, operands: [...names, ...operands], firstOperand };
|
|
238
280
|
}
|
|
239
281
|
function memberName(path, limits) {
|
|
240
282
|
if (path.startsWith("//") && !path.startsWith("///"))
|
|
@@ -288,7 +330,7 @@ async function prepare(scope, parsed, budget) {
|
|
|
288
330
|
throw new ZipFailure(16, "Invalid command arguments", "can't use -d, -f, -u, -U, or -g on stdout\n");
|
|
289
331
|
let publication;
|
|
290
332
|
if (parsed.archive !== "-") {
|
|
291
|
-
const outputName = vfsPath(context.cwd, parsed.archive);
|
|
333
|
+
const outputName = vfsPath(context.cwd, parsed.output ?? parsed.archive);
|
|
292
334
|
const parentName = dirname(outputName);
|
|
293
335
|
const parent = await scope.operation(() => context.fs.realpath(parentName, { signal: context.signal }));
|
|
294
336
|
const parentStat = await scope.operation(() => context.fs.lstat(parent, { signal: context.signal }));
|
|
@@ -298,20 +340,47 @@ async function prepare(scope, parsed, budget) {
|
|
|
298
340
|
publication = { output, parentName, parent, parentStat, existing };
|
|
299
341
|
}
|
|
300
342
|
const output = publication?.output;
|
|
301
|
-
|
|
343
|
+
let input = publication?.output;
|
|
344
|
+
let existing = publication?.existing;
|
|
345
|
+
if (parsed.output !== undefined) {
|
|
346
|
+
if (parsed.archive === "-") {
|
|
347
|
+
input = undefined;
|
|
348
|
+
existing = undefined;
|
|
349
|
+
}
|
|
350
|
+
else {
|
|
351
|
+
const name = vfsPath(context.cwd, parsed.archive);
|
|
352
|
+
try {
|
|
353
|
+
const parent = await scope.operation(() => context.fs.realpath(dirname(name), { signal: context.signal }));
|
|
354
|
+
input = `${parent === "/" ? "" : parent}/${name.slice(name.lastIndexOf("/") + 1)}`;
|
|
355
|
+
existing = await scope.stat(input);
|
|
356
|
+
}
|
|
357
|
+
catch (error) {
|
|
358
|
+
context.signal.throwIfAborted();
|
|
359
|
+
if (typeof error === "object" && error !== null && "code" in error && (error.code === "ENOENT" || error.code === "EACCES"))
|
|
360
|
+
throw new ZipFailure(18, "File not found or no read permission", parsed.archive);
|
|
361
|
+
throw error;
|
|
362
|
+
}
|
|
363
|
+
if (input === output || existing && publication?.existing && sameIdentity(existing, publication.existing))
|
|
364
|
+
throw new ZipFailure(16, "Invalid command arguments", `--out path must be different than in path: ${parsed.archive}`);
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
if ((parsed.action === "copy" || parsed.output !== undefined && parsed.archive !== "-") && !existing)
|
|
368
|
+
throw new ZipFailure(18, "File not found or no read permission", parsed.archive);
|
|
369
|
+
if (publication?.existing && (publication.existing.type !== "file" || !hasIdentity(publication.existing) || publication.existing.nlink !== 1))
|
|
370
|
+
fail("output archive requires a regular, single-link file with known backing identity");
|
|
302
371
|
if (parsed.archive === "-" && parsed.test && !parsed.quiet)
|
|
303
372
|
await budget.output("\tzip warning: can't use -T on stdout, -T ignored\n");
|
|
304
373
|
if (existing && (existing.type !== "file" || !hasIdentity(existing) || existing.nlink !== 1))
|
|
305
374
|
fail("updating archive requires a regular, single-link file with known backing identity; archive aliases are unsupported");
|
|
306
375
|
let archive = { entries: [], comment: new Uint8Array() };
|
|
307
|
-
if (existing &&
|
|
376
|
+
if (existing && input) {
|
|
308
377
|
if (!Number.isSafeInteger(existing.size) || existing.size < 0 || existing.size > limits.maxArchiveBytes)
|
|
309
378
|
fail("archive byte limit exceeded");
|
|
310
|
-
const bytes = await collectBytes(scope.input(
|
|
379
|
+
const bytes = await collectBytes(scope.input(input), { maxBytes: limits.maxArchiveBytes, signal: context.signal });
|
|
311
380
|
if (bytes.length !== existing.size)
|
|
312
381
|
fail("archive changed while reading");
|
|
313
382
|
archive = await readZipArchive(bytes, limits, context.signal);
|
|
314
|
-
const current = await scope.stat(
|
|
383
|
+
const current = await scope.stat(input);
|
|
315
384
|
if (!current || !unchanged(existing, current))
|
|
316
385
|
fail("archive changed while reading");
|
|
317
386
|
}
|
|
@@ -364,6 +433,8 @@ async function prepare(scope, parsed, budget) {
|
|
|
364
433
|
return;
|
|
365
434
|
const prior = old.get(name);
|
|
366
435
|
const modified = new Date();
|
|
436
|
+
if (!zipDateMatches(modified, parsed.fromDate, parsed.beforeDate))
|
|
437
|
+
return;
|
|
367
438
|
if (parsed.action === "freshen" && !prior || prior && (parsed.action === "update" || parsed.action === "freshen") && Math.floor(modified.getTime() / 1000) <= Math.floor(prior.modified.getTime() / 1000))
|
|
368
439
|
return;
|
|
369
440
|
const bytes = await collectBytes(scope.stdin, { maxBytes: Math.min(limits.maxEntryBytes, limits.maxTotalBytes - budget.totalBytes), signal: context.signal });
|
|
@@ -387,7 +458,7 @@ async function prepare(scope, parsed, budget) {
|
|
|
387
458
|
return;
|
|
388
459
|
}
|
|
389
460
|
checkPath(canonical, limits);
|
|
390
|
-
if (canonical === output || (existing && sameIdentity(existing, stat)))
|
|
461
|
+
if (canonical === output || canonical === input || (existing && sameIdentity(existing, stat)) || (publication?.existing && sameIdentity(publication.existing, stat)))
|
|
391
462
|
return;
|
|
392
463
|
const symlink = parsed.storeLinks && stat.type === "symlink";
|
|
393
464
|
if (stat.type !== "file" && stat.type !== "directory" && !symlink) {
|
|
@@ -395,12 +466,12 @@ async function prepare(scope, parsed, budget) {
|
|
|
395
466
|
await budget.output(`\tzip warning: ignoring special file: ${source}\n`);
|
|
396
467
|
return;
|
|
397
468
|
}
|
|
398
|
-
if (existing && !hasIdentity(stat))
|
|
469
|
+
if ((existing || publication?.existing) && !hasIdentity(stat))
|
|
399
470
|
fail("cannot exclude archive aliases when source backing identity is unknown");
|
|
400
471
|
const directory = stat.type === "directory";
|
|
401
472
|
if (directory && name && !name.endsWith("/"))
|
|
402
473
|
name += "/";
|
|
403
|
-
const included = await filterName(name, selection, parsed.includes.length) && (!recursiveSelection || await recursiveSelection.matches(name, true));
|
|
474
|
+
const included = zipDateMatches(new Date(stat.mtimeMs), parsed.fromDate, parsed.beforeDate) && await filterName(name, selection, parsed.includes.length) && (!recursiveSelection || await recursiveSelection.matches(name, true));
|
|
404
475
|
const sourceName = name;
|
|
405
476
|
if (parsed.junkPaths)
|
|
406
477
|
name = directory ? "" : name.slice(name.lastIndexOf("/") + 1);
|
|
@@ -458,7 +529,16 @@ async function prepare(scope, parsed, budget) {
|
|
|
458
529
|
}
|
|
459
530
|
}
|
|
460
531
|
};
|
|
461
|
-
if (parsed.action === "
|
|
532
|
+
if (parsed.action === "copy") {
|
|
533
|
+
const operands = new Selection(parsed.operands, limits, context.signal, { noWild: parsed.noWild, stopAtDirectories: parsed.stopAtDirectories });
|
|
534
|
+
for (const entry of archive.entries) {
|
|
535
|
+
if (await operands.matches(entry.name) && await filterName(entry.name, selection, parsed.includes.length) && zipDateMatches(entry.modified, parsed.fromDate, parsed.beforeDate)) {
|
|
536
|
+
await budget.member(entry.size);
|
|
537
|
+
selected.set(entry.name, { entry, source: entry.name });
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
}
|
|
541
|
+
else if (parsed.action === "delete") {
|
|
462
542
|
if (!parsed.quiet && parsed.recursive)
|
|
463
543
|
await budget.output("\tzip warning: invalid option(s) used with -d; ignored.\n");
|
|
464
544
|
if (!parsed.quiet && !archive.entries.length)
|
|
@@ -466,7 +546,7 @@ async function prepare(scope, parsed, budget) {
|
|
|
466
546
|
const operands = new Selection(parsed.recursivePatterns ? [] : parsed.operands, limits, context.signal, { noWild: parsed.noWild, stopAtDirectories: parsed.stopAtDirectories });
|
|
467
547
|
if (parsed.operands.length && !parsed.recursivePatterns) {
|
|
468
548
|
for (const entry of archive.entries) {
|
|
469
|
-
if (await operands.matches(entry.name) && await filterName(entry.name, selection, parsed.includes.length))
|
|
549
|
+
if (await operands.matches(entry.name) && await filterName(entry.name, selection, parsed.includes.length) && zipDateMatches(entry.modified, parsed.fromDate, parsed.beforeDate))
|
|
470
550
|
deleted.add(entry.name);
|
|
471
551
|
}
|
|
472
552
|
}
|
|
@@ -487,9 +567,9 @@ async function prepare(scope, parsed, budget) {
|
|
|
487
567
|
}
|
|
488
568
|
if (!selected.size && (parsed.action === "freshen" || parsed.action === "update" && (existing || !parsed.includes.length)))
|
|
489
569
|
return undefined;
|
|
490
|
-
if (!selected.size && !deleted.size && (parsed.action === "delete" || parsed.recursivePatterns || !parsed.includes.length)) {
|
|
570
|
+
if (!selected.size && !deleted.size && (parsed.action === "delete" || parsed.action === "copy" || parsed.recursivePatterns || parsed.fromDate !== undefined || parsed.beforeDate !== undefined || !parsed.includes.length)) {
|
|
491
571
|
const detail = parsed.action !== "delete" && parsed.recursive && parsed.firstOperand >= 0
|
|
492
|
-
? `try: zip ${
|
|
572
|
+
? `try: zip ${parsed.args.slice(0, parsed.firstOperand).join(" ")} . -i ${parsed.args.slice(parsed.firstOperand).join(" ")}`
|
|
493
573
|
: parsed.archive;
|
|
494
574
|
throw new ZipFailure(12, "Nothing to do!", detail);
|
|
495
575
|
}
|
|
@@ -517,6 +597,14 @@ async function prepare(scope, parsed, budget) {
|
|
|
517
597
|
continue;
|
|
518
598
|
}
|
|
519
599
|
const replacement = selected.get(entry.name);
|
|
600
|
+
if (parsed.action === "copy") {
|
|
601
|
+
if (replacement) {
|
|
602
|
+
entries.push(replacement.entry);
|
|
603
|
+
queue(` copying: ${entry.name}\n`);
|
|
604
|
+
selected.delete(entry.name);
|
|
605
|
+
}
|
|
606
|
+
continue;
|
|
607
|
+
}
|
|
520
608
|
if (replacement) {
|
|
521
609
|
entries.push(replacement.entry);
|
|
522
610
|
append(replacement.entry, true);
|
|
@@ -533,7 +621,7 @@ async function prepare(scope, parsed, budget) {
|
|
|
533
621
|
}
|
|
534
622
|
if (!entries.length)
|
|
535
623
|
queue("\tzip warning: zip file empty\n");
|
|
536
|
-
if (
|
|
624
|
+
if (!publication)
|
|
537
625
|
return { kind: "stream", archive: { entries, comment: archive.comment }, progress };
|
|
538
626
|
const bytes = await writeZipArchive({ entries, comment: archive.comment }, limits, context.signal, false, parsed.zip64 === true);
|
|
539
627
|
if (parsed.test && parsed.archive !== "-") {
|