size:/type:/blob:/commit:Each of size:/type:/blob:/commit: accepts a FULL 40-char sha through its
hex gate (isHexish/isHexPrefix), then hands it to store.resolveHexAny —
which is bounded to ^[0-9a-f]{1,39}$ and returns undefined for a 40-char
string. So size:#<40hex> (etc.) reports SIZENONE/TYPENONE/BLOBNONE/no-commit
even though every view's header promises full-sha support. sha1.js and log.js
avoid this with an isFullSha fast-path that returns the sha verbatim (after a
getObject presence check) BEFORE the prefix resolver. Method: Issues.
shared/store.js:303 resolveHexAny: if (!/^[0-9a-f]{1,39}$/.test(prefix))
return undefined; — a full 40-hex sha fails the regex outright.views/size/size.js:54-61 gates hex then const full = k.resolveHexAny(
hex); if (!full) return null; — a 40-hex frag/query → null → SIZENONE.views/type/type.js:54-57 if (hex) return k.resolveHexAny(hex) || null;
— same, full sha → null → TYPENONE.views/blob/blob.js:60-64 and :119-123 sha = k.resolveHexAny(hex) —
full sha → !sha → BLOBNONE (both the root-tree and bare-object paths).views/commit/commit.js:101-103 resolveHashlet: const sha =
k.resolveHexAny(hexish); if (!sha) return undefined; — full commit sha lost.views/sha1/sha1.js:81 if (frag.length >= 40) return isFullSha(frag) ?
frag : undefined; and views/log/log.js:88 if (isFullSha(frag)) return
k.getObject(frag)?frag:undefined; — the fast-path the four views lack.size:/type:/blob:/commit: resolve a full 40-hex object id (frag or
query slot) to the object iff it exists — matching the header promise.isFullSha (shared/util/sha.js) + k.getObject; do
NOT widen resolveHexAny's {1,39} regex (it is the prefix scanner).descendFrom/resolveRootTree
paths that feed off the same gate.if (isFullSha(hex)) return k.getObject(hex) ? hex : null; (or the
view's NONE/undefined) BEFORE the resolveHexAny(hex) call in each view,
mirroring sha1.js/log.js. Keeps the prefix path untouched.resolveHexOrFull helper is optional; four 1-liners
are the minimal, file-disjoint fix.commit.js
resolveHashlet isFullSha(hex) ? hex : resolveHexAny(hex) short-circuit
(~:101); store.js {1,39} prefix regex left UNTOUCHED per the constraint.
Repro be/test/commit/resolve/run.sh (the ?<40hex>/?#<40hex>/#<40hex>
rows) — RED pre-fix (COMMITNONE), GREEN after; full be/ suite 60/60.isFullSha(hex)?present:hex short-
circuit before resolveHexAny in each view — size.js:49/70, type.js:60,
blob.js:49/71/131 (bare-object + resolveRootTree descend paths). store.js
{1,39} regex UNTOUCHED. Repro tests test/{size,type,blob}/fullsha/run.sh:
RED pre-fix (SIZE/TYPE/BLOBNONE on #<40hex>/?#<40hex>/?<40hex>), GREEN
after; full be/ suite 64/64 (bro-universal is a pre-existing unrelated xfail).isFullSha fast-path (sha1.js:81/95) — no change.d80b0a33 (per-view isFullSha short-circuit +
repro tests test/{size,type,blob}/fullsha, full suite green).aef4caef).
sha1: needed no change (already had the fast-path).