@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.
@@ -0,0 +1,3 @@
1
+ export declare function parseZipDate(input: string, option: "t" | "tt"): number;
2
+ export declare function zipDateMatches(modified: Date, from: number | undefined, until: number | undefined): boolean;
3
+ //# sourceMappingURL=dates.d.ts.map
@@ -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,3 @@
1
+ import { type ArchiveLimits } from "../internal.js";
2
+ export declare function zipEnvironmentArguments(env: Readonly<Record<string, string>>, argv: readonly string[], limits: ArchiveLimits): readonly string[];
3
+ //# sourceMappingURL=environment.d.ts.map
@@ -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", "output-file",
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", "from-date", "before-date", "unzip-command", "copy-entries",
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":"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"}
1
+ {"version":3,"file":"options.js","sourceRoot":"","sources":["../../../../src/commands/archive/zip/options.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"zip.d.ts","sourceRoot":"","sources":["../../../src/commands/archive/zip.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0D,KAAK,iBAAiB,EAAiB,MAAM,0BAA0B,CAAC;AAOzI,OAAO,EAAwF,KAAK,sBAAsB,EAAsB,MAAM,eAAe,CAAC;AA+ctK,wBAAgB,gBAAgB,CAAC,OAAO,GAAE,sBAA2B,GAAG,iBAAiB,CA0CxF"}
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
- if (context.args.length > limits.maxArgumentBytes)
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 context.args) {
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 < context.args.length; index++) {
61
- const original = context.args[index];
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 = context.args[index + 1];
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 < context.args.length) {
170
- const next = context.args[index + 1];
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
- const existing = publication?.existing;
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 && publication) {
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(publication.output), { maxBytes: limits.maxArchiveBytes, signal: context.signal });
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(publication.output);
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 === "delete") {
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 ${context.args.slice(0, parsed.firstOperand).join(" ")} . -i ${context.args.slice(parsed.firstOperand).join(" ")}`
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 (parsed.archive === "-")
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 !== "-") {