s7cmd 1.5.0

Reliable, flexible, and fast command-line tool for Amazon S3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
# Changelog

All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [1.5.0] - 2026-07-11

### Added

#### s3util-rs

- `create-bucket` gains account-level regional bucket support: pass `--bucket-namespace account-regional` together with
  `--create-bucket-configuration LocationConstraint=<region>` to create a bucket in your account's regional namespace
  (name shape `<prefix>-<accountid>-<region>-an`). The two options are required together — `account-regional` is the
  only accepted `--bucket-namespace` value and `LocationConstraint=<region>` the only accepted
  `--create-bucket-configuration` value — and when both are supplied they are sent to `CreateBucket` verbatim, bypassing
  the region/name-derived configuration.

### Fixed

#### s3util-rs

- `get-object-annotation`: an object whose additional checksum uses an algorithm s3util cannot recompute (e.g. `SHA512`,
  `MD5`, `XXHASH*`) now fails with a clear integrity error instead of panicking. The unsupported algorithm is detected
  up front and rejected rather than reaching the checksum constructor.

### Security

- Bump `crossbeam-epoch` `v0.9.18 -> v0.9.20` to address [RUSTSEC-2026-0204]https://rustsec.org/advisories/RUSTSEC-2026-0204.
  Transitive dependency (pulled in via `s3ls-rs``rayon`); `Cargo.lock`-only, with no public API or behavior change.

### Changed

- s3util-rs `v1.6.0 -> v1.7.1`

### Underlying libraries

```toml
s3sync = "=1.59.0"
s3util-rs = "=1.7.1"
s3rm-rs = "=1.3.8"
s3ls-rs = "=1.0.3"
```

## [1.4.0] - 2026-07-05

Adds S3 object-annotation support.

### Added

#### s3util-rs

- `get-object-annotation`, `put-object-annotation`, `delete-object-annotation`, and `list-object-annotations`
  subcommands: download, attach, delete, and list named annotation payloads on an S3 object.
  `put-object-annotation` sends a Content-MD5 and an explicit CRC64NVME and verifies the value S3 returns;
  `get-object-annotation` verifies content length, the AES256 ETag/MD5, and any additional checksum, then writes the
  payload to a file (atomic rename, re-verified on disk) or to stdout. All four surface a missing bucket, object,
  version, or annotation as exit code 4.
- `cp`/`mv` gain object-annotation sync options (`--enable-sync-object-annotations`, `--disable-check-annotation-etag`).

#### s3sync

- `sync` gains object-annotation options `--enable-sync-object-annotations`, `--disable-check-annotation-etag`,
  `--sync-latest-object-annotations`, and `--report-annotations-sync-status`. These flow through automatically from the
  updated s3sync dependency; the `--report-sync-status` summary now also reports annotation match/mismatch counts.

### Changed

- s3sync `v1.58.9 -> v1.59.0`
- s3util-rs `v1.5.3 -> v1.6.0`
- Updated other dependencies

### Underlying libraries

```toml
s3sync = "=1.59.0"
s3util-rs = "=1.6.0"
s3rm-rs = "=1.3.8"
s3ls-rs = "=1.0.3"
```

## [1.3.1] - 2026-06-27

Monthly update.

### Security

#### s3sync

- Harden directory traversal check used when saving S3 objects to local files: reject `.` and `..` path segments (
  previously only `../` and`..\` were caught), and detect separators on both `/` and `\`. Does not affect S3 access
  itself.

### Fixed

#### s3util-rs

- S3 keys are now taken verbatim from `s3://` paths. Previously `.` and `..` segments were resolved away as if the key
  were a filesystem path (e.g. `cp /etc/hosts s3://bucket/..` uploaded to key `hosts`), and `%XX` sequences were
  percent-decoded. Keys are now stored exactly as written, matching the AWS CLI.
- Downloading to a bare filename in the current directory (e.g. `cp s3://bucket/key xyz`) no longer fails with
  `parent directory does not exist: ''`. Previously this required an explicit `./xyz`; the current directory is now used
  correctly when the target has no directory component.

### Changed

- aws-sdk-s3 `v1.133.0 -> v1.137.0`
- Updated other dependencies

### Underlying libraries

```toml
s3sync = "=1.58.9"
s3util-rs = "=1.5.3"
s3rm-rs = "=1.3.8"
s3ls-rs = "=1.0.3"
```

## [1.3.0] - 2026-05-24

Monthly update.

### Added

#### s3util-rs

- `rename` subcommand: atomically rename an object within the same S3 Express One Zone directory bucket using the
  RenameObject API.
  Both source and target must be in the same bucket (name must end with --x-s3). Supports optional conditional checks.

### Changed

- aws-sdk-s3 `v1.131.0 -> v1.133.0`
- Updated other dependencies

### Underlying libraries

```toml
s3sync = "=1.58.8"
s3util-rs = "=1.5.2"
s3rm-rs = "=1.3.7"
s3ls-rs = "=1.0.2"
```

## [1.2.4] - 2026-05-17

### Changed

#### s3sync

- AWS SDK for Rust does not support the new checksums XXHash64/3/128, MD5, and SHA-512, so an error check has been added
  to prevent these from being specified as additional checksums. We plan to remove this restriction when AWS SDK for
  Rust supports these new checksums.

### Underlying libraries

```toml
s3sync = "=1.58.7"
s3util-rs = "=1.4.0"
s3rm-rs = "=1.3.6"
s3ls-rs = "=1.0.1"
```

## [1.2.3] - 2026-05-09

### Fixed

- `batch-run` now catches panics in dispatched subcommands. A
  panicked subcommand surfaces as exit code `101` with a structured
  `event = "panicked"` log entry carrying `line`, `raw`, `command`,
  and `panic` fields, is recorded as a failure in the summary, and
  counts toward `--max-errors` (so `--continue-on-error` and the
  failure-threshold flags apply to panics like any other failure).
  Previously, in the default sequential mode (`--parallel 1`), a
  panic in any subcommand crashed the entire `batch-run` process
  with no summary line, no structured log entry, and no chance to
  apply the failure-policy flags; in parallel mode the panic was
  caught but the recovery log did not identify which line panicked.

### Changed

- All build profiles now use `panic = "unwind"`. The
  `release-min-size` profile previously set `panic = "abort"`, which
  would have suppressed the new `batch-run` panic recovery for
  binaries built under that profile.

### Underlying libraries

Pinned versions are unchanged from 1.2.2:

```toml
s3sync = "=1.58.6"
s3util-rs = "=1.4.0"
s3rm-rs = "=1.3.6"
s3ls-rs = "=1.0.1"
```

## [1.2.2] - 2026-05-09

### Changed

- `batch-run` per-line and `--check-format` logs now emit their
  details as structured `tracing` fields rather than packing
  everything into the message string.

### Underlying libraries

Pinned versions are unchanged from 1.2.1:

```toml
s3sync = "=1.58.6"
s3util-rs = "=1.4.0"
s3rm-rs = "=1.3.6"
s3ls-rs = "=1.0.1"
```

## [1.2.1] - 2026-05-09

### Changed

- Documentation: clarified that **Amazon S3 is the only supported
  platform**. S3-compatible storage (MinIO, Cloudflare R2,
  Backblaze B2, Wasabi, Ceph RGW, DigitalOcean Spaces, IBM COS,
  and similar) is provided strictly **as-is**, with **absolutely
  no support or assistance**. Bug reports, questions, and
  assistance requests regarding S3-compatible storage will not be
  addressed.
- Bug report template (`.github/ISSUE_TEMPLATE/bug_report.md`):
  tightened the Storage line to state that issues regarding
  S3-compatible services will be closed automatically,
  unconditionally, and without exception; added a Region field;
  added a notice that only clear, reproducible bugs in s7cmd
  itself are accepted (no support, questions, feature requests,
  or usage help).

### Underlying libraries

Pinned versions are unchanged from 1.2.0:

```toml
s3sync = "=1.58.6"
s3util-rs = "=1.4.0"
s3rm-rs = "=1.3.6"
s3ls-rs = "=1.0.1"
```

## [1.2.0] - 2026-05-07

### Added

One new subcommand sourced from `s3util-rs` 1.4.0:

- **Pre-signed URLs**`presign s3://<BUCKET>/<KEY> [--expires-in N]`
  generates a SigV4-signed `GetObject` URL locally and prints it to
  stdout. Default `--expires-in` is 3600 seconds; maximum is 604800
  seconds (one week). Zero, negative, non-numeric, and over-max
  values are rejected at parse time. Bucket-only paths
  (`s3://<BUCKET>` or `s3://<BUCKET>/`) and local-path targets are
  rejected post-parse and exit 1; unsupported URL schemes (e.g.
  `http://...`) are rejected by clap's value-parser and exit 2.
  presign is GET-only (no `--source-version-id`) and has no
  `--dry-run` (signing is local — no S3 API call is made), matching
  `aws s3 presign`.

### Changed

- Bumped `s3util-rs` from 1.3 to 1.4 (vendored CLI sources synced
  to match) — this is what brings `presign`.
- Top-level `--help` reorganization: `restore-object` and `presign`
  now appear inside the "Object Operations" group (right after
  `rm`); the standalone "Object Restore" / "Object Presign"
  sections were removed. Per-subcommand `--help` is unchanged.

### Underlying libraries

This release pins the following exact versions of the underlying
libraries:

```toml
s3sync = "=1.58.6"
s3util-rs = "=1.4.0"
s3rm-rs = "=1.3.6"
s3ls-rs = "=1.0.1"
```

## [1.1.0] - 2026-05-06

### Added

Nine new subcommands sourced from `s3util-rs` 1.3.0. Each one
mirrors the upstream behavior (argument names, log messages,
exit codes, output JSON shape) and respects s7cmd's
`--dry-run`, `--target-profile`, `batch-run`, and exit-code
conventions.

- **Bucket Replication**`get-bucket-replication`,
  `put-bucket-replication`, `delete-bucket-replication` for
  managing cross-region and same-region replication rules.
  `put-bucket-replication` accepts the AWS-CLI shape
  (top-level `Role` + `Rules`) from a file path or `-` for
  stdin (file path only inside `batch-run`, matching the
  other `put-*` family).
- **Transfer Acceleration**`get-bucket-accelerate-configuration`,
  `put-bucket-accelerate-configuration` to read and toggle S3
  Transfer Acceleration. `put-` takes mutually-exclusive
  `--enabled` / `--suspended` flags.
- **Requester Pays**`get-bucket-request-payment`,
  `put-bucket-request-payment` for switching between owner-pays
  and requester-pays billing. `put-` takes mutually-exclusive
  `--requester` / `--bucket-owner` flags.
- **Policy Status**`get-bucket-policy-status` to report whether
  a bucket policy makes the bucket public
  (`{"PolicyStatus": {"IsPublic": …}}`).
- **Object Restore**`restore-object` to initiate restoration
  of S3 Glacier-class archived objects with `--days N` and
  `--tier {Standard,Bulk,Expedited}`. Supports
  `--source-version-id` for version-targeted restores.

### Changed

- Bumped `s3util-rs` from 1.2 to 1.3 (vendored CLI sources
  synced to match). This release also picks up the upstream
  bug fixes for output formatting (object-size filters and
  version-related fields in lifecycle output, encryption
  blocking rules, target grants in logging, `ChecksumSHA512` /
  `ChecksumMD5` in object metadata, replication metrics and
  RTC time containers) and accepts ISO 8601 (`YYYY-MM-DD`)
  dates in lifecycle rules.

### Underlying libraries

This release pins the following exact versions of the underlying
libraries:

```toml
s3sync = "=1.58.6"
s3util-rs = "=1.3.0"
s3rm-rs = "=1.3.6"
s3ls-rs = "=1.0.1"
```

## [1.0.0] - 2026-05-04

Initial release.

## [0.3.0] - 2026-05-03

### Added

- **`cp --skip-existing`**: when the target object or file already
  exists, skip the copy instead of overwriting. Lets you resume
  partial bulk transfers (uploads, downloads, S3-to-S3) without
  re-sending objects that already landed at the destination.
  Combine with `--dry-run` to preview which objects would be
  skipped before running for real.
- **`create-bucket --if-not-exists`**: if the bucket already exists
  (and you own it), exit 0 without re-creating. Makes provisioning
  scripts idempotent — re-running the same
  `create-bucket --if-not-exists s3://my-bucket` is safe whether
  or not the bucket is already there. When combined with
  `--tagging`, the tagging step is also skipped on the
  existing-bucket path.

### Changed

- Bumped `s3util-rs` from 1.1 to 1.2 (vendored CLI sources synced
  to match) — this is what brings the two new flags above.
- Expanded the README's *Intended Audience and Issue Tracker Scope*
  section: questions about concurrency-induced performance or
  resource exhaustion, and questions that belong with AWS, with
  the operator of an S3-compatible storage service, or with the
  operating system vendor, are now explicitly out of scope for
  the issue tracker.
- Added a note in the `batch-run` section of the README clarifying
  that while batch-run avoids per-command process startup, it
  still constructs a fresh AWS client (credential, region, HTTP
  client setup) per command — so it is not intended for
  high-throughput parallel processing of large workloads.

### Underlying libraries

This release pins the following exact versions of the underlying
libraries:

```toml
s3sync = "=1.58.6"
s3util-rs = "=1.2.0"
s3rm-rs = "=1.3.6"
s3ls-rs = "=1.0.0"
```

## [0.2.0] - 2026-05-02

### Added

- **`batch-run` subcommand** for running many s7cmd commands from a
  script file (or `-` for stdin). Choose sequential or parallel
  execution (`--parallel N`, `0` picks the CPU count) and pick how
  failures are handled:
    - default: stop on the first non-zero exit (sequential) or stop
      spawning new commands (parallel; in-flight lines finish);
    - `--continue-on-error`: run every line regardless of outcome;
    - `--continue-on-warning`: keep running past warnings (exit codes
      `3` and `4`) but still stop on true failures;
    - `--max-errors N`: stop once `N` failures have been recorded.
      Parse/validation errors (typos, unknown subcommands, bad
      arguments) count the same as runtime failures, so
      `--max-errors 5` tolerates up to 5 broken lines anywhere.

  The final exit code is the worst seen across the whole batch,
  ranked by severity (`1` > `2` > `3` > `4` > any other non-zero >
  `0`) rather than by numeric value, so an actionable error always
  wins over a SIGINT skip or a "not found". A trailing summary
  `N succeeded, N failed, N warnings, N skipped, elapsed Ts` is
  written to stderr; suppress with `--no-summary`, or pass
  `--json-tracing` to emit it as a single-line JSON object instead.
- **Live progress bar in `batch-run`** drawn on TTY stderr in
  read-all mode while the run is in progress. Suppress with
  `--no-progress` (useful inside terminal multiplexers, `script(1)`,
  or CI runners). Streaming mode, non-TTY stderr, and
  `--json-tracing` already suppress the bar.
- **`--check-format`** validates a `batch-run` script without
  executing anything. It stops at the first problematic line —
  prefixed with the script source (file path, or `stdin` for `-`)
  and the line number — and exits 1; a clean script logs `format OK`.
- **Per-line tracing in `batch-run`**: each line logs a `start` event
  and a matching outcome — `success`, `warning (exit N)`,
  `skipped (exit 130)` (Ctrl-C / SIGINT), or `failure (exit N)`  prefixed with the line number and the original command. `start`
  and `success` are info level (silent at the default warn level —
  pass `-v`); `warning`, `skipped`, and `failure` are visible
  without `-v`. Per-line outcome buckets: `0` → succeeded;
  `3` / `4` → warnings; `130` → skipped (never counts toward
  `--max-errors`); other non-zero → failed.
- **`--dry-run` on every state-mutating subcommand** (`cp`, `mv`,
  `rm`, `create-bucket`, `delete-bucket`, all `put-*` and
  `delete-*`). Arguments and inputs are still validated, an
  `[dry-run]` log line describes what would have happened, and the
  command exits 0 without touching AWS. Read-only commands (`get-*`,
  `head-*`, `ls`) intentionally do not accept this flag.

### Changed

- `sync`, `clean`, and `ls` no longer terminate the process on their
  own — required so a single failing line inside `batch-run` does not
  kill the rest of the batch. Behavior of standalone invocations is
  unchanged.
- Bumped `s3util-rs` from 1.0 to 1.1 (vendored CLI sources synced to
  match).

### Fixed

- Dispatching `cp` / `mv` could overflow the thread stack on
  platforms with small default stacks; the inner futures are now
  boxed so dispatch is safe regardless of stack size.

## [0.1.3] - 2026-04-29

### Changed

- Documentation updates.

## [0.1.2] - 2026-04-29

### Added

- `CHANGELOG.md` documenting changes per Keep a Changelog format.

### Changed

- Bumped `s3util-rs` to `1.0.0` and synced vendored CLI sources to upstream `4edffac`. Under `--show-progress`, the
  destination line (`-> <path>`) is now printed unconditionally on success.
- Expanded README: scope, non-goals, requirements, installation, and AI-development disclosure.

### Removed

- Dropped Windows UAC manifest infrastructure (`s7cmd.manifest`, `s7cmd.rc`, `embed-resource` build dependency).

## [0.1.1] - 2026-04-29

### Changed

- Bumped `nix` from `0.30.1` to `0.31.2`.
- Dropped `windows-11-arm` runner from CI/CD; pre-built `aarch64-pc-windows-msvc` binaries are not available while the
  `LNK1322` (Cortex-A53 erratum #843419) build failure is unresolved.

## [0.1.0] - 2026-04-29

Initial preview release.

### Added

- Object operations: `ls`, `cp`, `mv`, `rm`, `sync`, `clean`.
- Object metadata: `head-object`, `get-object-tagging`, `put-object-tagging`, `delete-object-tagging`.
- Bucket operations: `create-bucket`, `delete-bucket`, `head-bucket`.
- Bucket-level configuration subcommands: tagging, policy, versioning, lifecycle, encryption, CORS, public-access-block,
  website, logging, notification.
- Shell completion generation (`--auto-complete-shell`) for bash, elvish, fish, powershell, and zsh.
- E2E test suite covering object/bucket operations against live AWS S3.
- Pre-built binaries for Linux (x86_64, aarch64), macOS (aarch64), and Windows (x86_64).