Repository navigation
v2.58.0: where the file actually ends
The MIME repository, byte-exact — SMW0 over plain ADT
Every file anyone ever uploaded through SMW0 — a logo, a sound, a font, a PDF, a game a websocket handler loads at runtime — is now reachable, and comes back byte for byte.
vsp had no W3MI support at all: not one mention of W3MI, SMW0, WWWDATA or WWWPARAMS anywhere in the tree. That is the gap that matters the moment you try to move a real application off a system — the code was reachable and the files it loads were not.
Almost none of this is new machinery. vsp cluster read (v2.55.0) already did the hard part, because WWWDATA is an INDX-style cluster table: it joins the fragments, decompresses the LZH body and parses the rows. What was missing is the one step that cannot be guessed:
the bytes are a table of fixed 255-byte lines, and the final line is padded with zeroes, so the cluster alone cannot say where the file ends. The true length is
filesizeinWWWPARAMS. Truncating to it is the whole difference between a file and a nearly-right file.
vsp w3mi list 'ZDEMO%' # every MIME object, size and type
vsp w3mi get ZDEMO_LOGO.PNG --out logo.png
vsp w3mi get ZDEMO_LOGO.PNG --abapgit-dir src/ # the abapGit pair, ready to commitBoth halves are ordinary table reads, so nothing goes on the server: no abapGit, no RFC, no ZADT_VSP.
Verified on arithmetic that can fail. A 52216-byte object came out of 205 lines of 255 = 52275, truncated to filesize, and the 59 discarded bytes were all zero. The file then checked itself — a Z-machine v3 header declares its own length at 0x1A and its checksum at 0x1C, and both matched what came out (52216, 0xD870). Two further extractions of the same object, by a different route and by another person, produced the identical md5. One wrong byte anywhere breaks that checksum.
Where a wrong answer would look like a right one, it refuses instead of guessing: a non-zero byte past filesize means filesize and the cluster disagree, and a cluster shorter than filesize means the object is truncated on the system. Both say so rather than hand back a plausible file.
--abapgit-dir writes the pair abapGit expects, with the object id escaped the way abapGit escapes it (ZORK-MINI.Z3 → zork-mini%2ez3), checked against a filename abapGit itself produced. The filename parameter is deliberately not written, and a test enforces it — it records the path the file was uploaded from, which is a user name, a host and a directory layout, and these files are meant to be committable.
GetTypeInfo: two silent failures, stacked
Reading a data element returned 406 "The message content is not acceptable" on every name, because the endpoint refuses application/xml. The call had never returned anything to anybody.
It was a twin of a bug already found and fixed — GetDataElementLabels hits the identical endpoint and was corrected months ago, with a comment recording this exact 406, checked against 7.58. That fix landed on one caller and missed the other, so the same 406 survived four files from its own explanation. The test now pins the header on both callers, because the failure mode was twins drifting apart and pinning one would let the next divergence through.
Fixing only the header would have been worse than leaving it. The parser read the type and lengths as attributes of the root, while the document carries them as children of dtel:dataElement — so the call would have started returning 200 with Length: 0, Decimals: 0 for every element, forever, with nothing to say so. Four real documents were read off a system rather than guessing element names, covering both typeKinds and non-zero decimals; two are committed unmodified as fixtures so a test parses the bytes a system actually sends. Both fixes were verified by reverting them.
Also
- ADR 0001 — git as the sole version/branch/provenance layer for an off-stack system, so the Transport-Request class of problem is never built rather than solved. Its point 8 is a rule for clients: a browsable object is not necessarily a runnable one — an object can be readable over ADT with no module behind it, and nothing in a successful read says so.
docs/adt-surface.md— the ADT contract vsp actually calls, wave by wave, with the dev-loop wire contract. Written so a façade can be built against it and checked.
Downloads
| Platform | Architecture | File |
|---|---|---|
| Linux | x64 | vsp-linux-amd64 |
| Linux | ARM64 | vsp-linux-arm64 |
| Linux | x86 | vsp-linux-386 |
| Linux | ARM | vsp-linux-arm |
| macOS | Intel | vsp-darwin-amd64 |
| macOS | Apple Silicon | vsp-darwin-arm64 |
| Windows | x64 | vsp-windows-amd64.exe |
| Windows | ARM64 | vsp-windows-arm64.exe |
| Windows | x86 | vsp-windows-386.exe |
sha256 for all nine in checksums.txt. Each binary reports v2.58.0 from vsp --version.
Installation
chmod +x vsp-linux-amd64 && sudo mv vsp-linux-amd64 /usr/local/bin/vsp
vsp --versionFull changelog: v2.57.0...v2.58.0