Skip to content
zit Artifact [4ddefa6f44]
Login

Artifact [4ddefa6f44]

Artifact 4ddefa6f4434e12a041d3d35655c9f8722e212521a6bf5a91bdbda22d8b19790:


# zit 0.3.26

zit 0.3.26 finishes the end-of-options work 0.3.25 started: `tarball` and
`zip` now consume the marker instead of counting it as an operand.

No artifact, tag namespace, sync message, or on-disk repository format
changed.

## `tarball` and `zip` accept `-- VERSION OUTPUTFILE`

0.3.25 gated twenty-five verbs' option branches behind a bare `--`. The
parser these two verbs share was among them, but the branch that sets the
marker fell through to the operand slots below instead of ending the
iteration. The marker therefore took the VERSION slot, VERSION took
OUTPUTFILE's, and the real OUTPUTFILE was refused:

```
$ zit tarball -- trunk out.tar.gz
zit tarball: unexpected argument 'out.tar.gz'
```

A caller that adopted the marker uniformly — the intended migration — lost
both verbs outright. Downstream, a forge cutting archives on demand
answered 503 for every archive route, because the verb underneath could no
longer be spelled.

The shape of the defect is why it survived a sweep: with one operand the
marker is absorbed silently and the command still succeeds, so nothing goes
wrong until a second operand appears. A verb that neither honours the
marker nor ignores it is worse than one that never supported it, since the
failure shows up one argument late.

Two things changed in that parser. The marker branch now ends the
iteration, so the token is consumed. And a value option's argument is now
taken before the marker is considered, so `--name --` names a directory
`--` rather than ending the options — which is how every other verb that
takes an option argument already behaved.

A new test drives every verb with two operand slots — `tarball`, `zip`,
`cat`, `annotate`, `clone`, `import-git`, `export-git`, `import-fossil`,
`settings`, and `grep` — through `-- A B` and asserts both operands arrive.
One-operand coverage cannot catch this class, and the gap here was a verb
family a sweep missed rather than a decision taken per verb.

## Compatibility

- No on-disk repository or wire format changed; Fossil RFC revision 00
  remains the target.
- `zit tarball -- VERSION` and `zit zip -- VERSION` previously archived the
  check-in named by the token after the marker, treating the marker itself
  as VERSION only when nothing followed. Archives written by earlier
  versions are unchanged and still readable.
- `zit tarball --name -- ...` previously ended the options; it now names a
  top-level directory `--`.

## Qualification

`zig fmt --check`, `zig build test`, `e2e`, `smoke`, `git-import-e2e`,
`git-export-e2e`, and `dst`, plus the three-runner CI battery.