Files
bambuddy/backend
maziggy 1f07f39481 fix(backup): stop Gitea's tree pager failing open on a missing total_count (#2656)
`if not isinstance(total, int) or seen >= total or not entries: return blobs, ""`
    — the first arm short-circuited the page loop into a **success** holding page 1
    only. Gitea clamps `per_page` to `MAX_RESPONSE_ITEMS` (default 50), so that is
    50 entries of an arbitrarily large tree returned as a complete listing.

    The restore then reports genuinely-present categories as "Not present in this
    backup commit". That silent skip is the exact failure this override exists to
    prevent, and the same class as E7 and G2 — G2 fixed the arithmetic here and
    left the shape. GitHub and GitLab both hard-fail in the equivalent spot; only
    Gitea guessed, and it guessed in the one direction that loses data quietly.
    Whether Gitea always sends `total_count` on this route is beside the point: the
    code was defending against a response shape it did not trust, and then trusting
    it.

    Now a missing or non-int `total_count` means "page until a short or empty
    page". A page shorter than the first one is the last one, floored at Gitea's
    default clamp so a genuinely small tree still costs exactly one request — the
    reason G2 rejected paging-until-short in the `total_count`-present case, which
    is unchanged and still stops on the count. The existing `page <= 50` ceiling
    gives the correct hard failure for a tree that really is over cap, so this
    cannot truncate.

    Residual, and deliberately not widened into a `return None` on the first
    ambiguous response — that would break single-page trees, the common case: an
    instance whose `MAX_RESPONSE_ITEMS` is set *below* 50 *and* which omits
    `total_count` would still stop at page 1. Both halves have to be true.

    Tests: +6 (paged to the end with no count, on both Gitea and Forgejo; a short
    page ends it; a non-int count is treated as no count; the page ceiling still
    fails). Fail-pre-fix 5, control that passes either way 1 (a small tree is one
    request). These don't match `-k github`, so 274 -> 280 across the three restore
    files but `-k github` is unmoved.
2026-08-15 14:16:27 +02:00
..