dpkg-deb prints a BARE VALUE when one control field is requested and
"<Field>: <value>" when several are. Every reader was written for one shape and
broke on the other, so no pool could be read and no pin could be matched against
real files:
- build-index.sh: kept the label, so "Package: curl" failed the name check and
the pool came out empty -- the build refused with "no .deb files";
- add-packages.sh (read_deb): rejected every genuine .deb as an invalid name;
(scan_existing): produced empty keys, so a version conflict went undetected
and the same package was copied twice;
- build-offline-repo.sh: compared a labelled value with a "package=version" pin,
which can never match.
A first attempt with `sed 's/^Field: //'` was wrong in the other direction: sed
-v prints nothing when the pattern does not match, which emptied the single-field
reads. The label is now dropped only when it is present
(awk: if the first word ends with a colon), which leaves a bare value and a
version like "1:2.3-4" untouched.
Also fixed in build-index.sh: the foreign-file guard did not list
repo-manifest.yaml, the record this script writes into the bundle itself, so
every second build stopped on its own previous output. Accepting it is what
makes a rebuild possible at all.
Tests
- The dpkg-deb stub now reproduces both shapes, the single- and the multi-field
one. It emitted only one, which is exactly why this class stayed invisible
while the suite was green.
- The rebuild case mirrors the production layout (record inside the output
directory) and is proven by mutation: removing repo-manifest.yaml from the
guard's allow-list turns it red.