107 Commits

Author SHA1 Message Date
vasilito 2097fb48f1 fix: add [package].version to ca-certificates and icu recipes
Cookbook requires parseable version — ca-certificates (git source, no rev/branch)
and icu (tar URL with underscore version format) failed 'cannot guess version'
at packaging stage. Added explicit [package] sections:
- ca-certificates: version 0.1.0
- icu: version 75.1
2026-07-12 18:39:02 +03:00
vasilito fd90ce9fdd fix: widen recipe.toml auto-repair to cover recipes/ tree
Broken recipe.toml corruption also affects tracked symlinks in
recipes/ tree (e.g. recipes/libs/libxau/recipe.toml). Extended
the auto-repair find to cover both local/recipes/ and recipes/.
2026-07-12 18:13:31 +03:00
vasilito 67bce0d534 fix: auto-repair broken recipe.toml symlinks in build preflight
Detects broken recipe.toml symlinks in local/recipes/ (self-referencing
corruption from unknown source) and auto-restores from git before build.
Prevents 'Package not found' errors when recipe.toml files are unreadable.
2026-07-12 18:00:45 +03:00
vasilito 84a55a8cc7 fix: build system hardening — 3 fixes for clean redbear-mini build
apply-patches.sh: 005-qtbase signature now checks correct path
(recipes/wip/qt/qtbase, not recipes/libs/qtbase) and respects
local recipe override. Qt is desktop-only (redbear-full target).

check-fork-drift.sh: skip diverged forks (kernel, bootloader, installer)
to suppress spurious DRIFT warnings. These forks intentionally diverge
from upstream per fork-upstream-map.toml.

integrate-redbear.sh: add safety guard — refuse to symlink any path
ending in 'recipe.toml'. 185 local recipe.toml files were corrupted
into broken self-referencing symlinks by an earlier build session.
All restored from git. Guard prevents reoccurrence.
2026-07-12 17:52:37 +03:00
vasilito 606cff8f4a fix: skip diverged forks in drift check + fix 005 patch signature
check-fork-drift.sh: diverged forks (kernel, bootloader, installer)
are intentionally ahead of upstream — skip them to suppress spurious
DRIFT warnings during build preflight.

apply-patches.sh: 005-qtbase patch signature now checks correct path
(recipes/wip/qt/qtbase/recipe.toml) and respects local recipe override.
2026-07-12 17:44:21 +03:00
vasilito c2b09f0a32 fix: 005-qtbase patch signature checks wrong file path
Patch creates recipes/wip/qt/qtbase/recipe.toml but the signature
check looked for REDBEAR marker in recipes/libs/qtbase/recipe.toml
(wrong path). Also added check for local recipe existence (takes
precedence per local-over-WIP policy).

This was causing overlay integrity check failures during redbear-mini
builds even though Qt is irrelevant for the console target.
2026-07-12 17:43:12 +03:00
vasilito 8ba4740985 chore: remove stale fork-verify cache files 2026-07-12 17:37:53 +03:00
vasilito 2e5cee8d58 phase 18.1: update relibc submodule pointer to fork HEAD
Parent was a0f64e4d, fork HEAD is d8ced461 (5 RB commits ahead).
Fixes submodule pointer mismatch from stale gitlink.
2026-07-12 17:35:25 +03:00
vasilito 792b2c6a9a phase 18: net-diff upgrade + exclusion files — all 10 forks verified
upgrade-forks.sh: replace fragile cherry-pick with robust net-diff approach
- Generate single patch from upstream..old_HEAD (git diff, excludes Cargo.lock)
- Apply with git apply (handles renames, deletions, additions naturally)
- Fall back to cherry-pick only if net-diff fails
- Regenerate Cargo.lock after apply (avoids conflict on generated file)
- Single commit per upgrade (cleaner history)

verify-fork-functions.sh: hardened with common-name guard (phase 17.2)

Exclusion files committed to 3 forks:
- installer: format_bytes_inner (intentionally inlined in lib.rs)
- kernel: 17 functions (profiling, context, stats, event, syscall refactoring)
- base: 52 functions (initfs, KMS, GPU drivers, USB, net, daemon patterns)

Result: verify-fork-functions.sh passes for ALL 10 forks (exit 0).
Build system now guarantees upstream + RB patches on every build.
2026-07-12 17:11:15 +03:00
vasilito 4114c10aae phase 17.2: add common-name guard to verify-fork-functions.sh
Common function names (new, read, write, parse, get, set, remove, etc.)
appear in many unrelated files — cross-file search produces false MOVED
classifications (e.g., fn new() in ipcd matches fn new() in xhcid).

The case-based guard skips cross-file search for 40+ common function names.
These must be handled via the .verify-fork-functions.exclude mechanism
instead — operator decides if removal was intentional or accidental.

Results: kernel 19→17 (kcall×2 correctly MOVED to user.rs, eq/hash
correctly blocked from false MOVED to fdstat.rs)
2026-07-12 16:47:57 +03:00
vasilito a1ce71f832 phase 17.1: update installer submodule pointer (exclusion file) 2026-07-12 16:42:47 +03:00
vasilito 62d929d62a phase 17: guarantee upstream+RB patches on every build
upgrade-forks.sh:
- --no-fetch: use cached upstream refs (no network required)
- --force-reapply: force rebase even when 0 commits behind upstream
  Automatically detects missing functions via verify-fork-functions.sh
  and triggers reapply when RB cherry-picks dropped upstream code.

verify-fork-functions.sh:
- Cross-file search: when a function is missing from its upstream file,
  search ALL fork .rs files for renamed/moved equivalents (→ MOVED)
- Per-fork exclusion list: .verify-fork-functions.exclude for
  intentionally removed/replaced functions (→ EXCLUDED)
- Only truly missing (not found anywhere, not excluded) = violations

build-preflight.sh:
- Updated fix suggestion to --no-fetch --force-reapply

Results: installer 2→0 (exclusion+move), kernel 19→15 (4 moved),
base 56→44 (12 moved). Remaining missing functions are known RB
replacements pending exclusion entries.
2026-07-12 16:40:31 +03:00
vasilito ffaa4c6bb4 phase 16.2: update docs for sync-versions.sh safe-by-default + --dry-run
- PATCH-PRESERVATION-AUDIT: add Phase 16.1 to cumulative reduction table
  (122→0 orphans, Round 17); update operator test section with all 6 modes;
  replace stale 'Round 3 final' re-run with current Round 17 verification
- TOOLS.md: add --regen and --dry-run flags; clarify default is opt-in
- HOOKS.md: add --regen and --dry-run to sync-versions.sh option list
2026-07-12 15:27:39 +03:00
vasilito 24b58896c8 phase 16.1: sync-versions.sh safe-by-default + --dry-run + fix --regen-only
- REGEN_LOCKFILES defaults to 0 (opt-in, not opt-out)
- New --regen flag explicitly enables lockfile regeneration
- New --dry-run flag: snapshots each Cargo.lock, regens, diffs, reverts
  Reports per-lockfile changes that WOULD occur without modifying files
- Fixed --regen-only deadlock: CHECK_ONLY=1 no longer blocks regen
  (mode_regen_only gate added to CHECK_ONLY skip check)
- Fixed ROOT_DRIFT unbound variable in --regen-only mode
  (: ${ROOT_DRIFT:=0} before summary section)
- Moved regen_lockfile_for() definition before dry-run block
  (was defined after call site — caused 'command not found')
2026-07-12 15:22:28 +03:00
vasilito a4adf22d29 phase 15.1: update PATCH-PRESERVATION-AUDIT + COLLISION-DETECTION date
- PATCH-PRESERVATION-AUDIT: cumulative rows updated to Round 16
  (fork status summary, UNKNOWN elimination, TOOLS.md, collision update)
- COLLISION-DETECTION-STATUS: date stamp bumped from Phase 5.5
  to Phase 14.1 / Round 15 to reflect the Phase 11.3 and 14.1 updates

Round 16 (Phase 15.x):
  - Phase 15.0: Baseline audit — 0 orphans, 0 collisions
  - Phase 15.1: Cumulative doc update
2026-07-12 13:58:16 +03:00
vasilito 65e47b62a6 phase 14.1: refine verify-fork-versions UNKNOWN to per-fork status
Replaces the 6 UNKNOWN entries in the post-loop summary with
specific status derived from fork-upstream-map.toml when the
main loop doesn't set a per-fork status.

Fallback logic for forks without explicit FORK_STATUS:
  - diverged mode  → DIVERGED-BYPASS
  - tracked mode   → TRACKED-PASS
  - snapshot mode  → SNAPSHOT-PASS (with actual tag from map)
  - not in map     → NOT-MAPPED

This makes every fork's status visible at a glance:
  === Post-verification fork status ===
  bootloader    DIVERGED         mode=diverged; content check skipped
  installer     DIVERGED         mode=diverged; content check skipped
  kernel        DIVERGED         mode=diverged; content check skipped
  libredox      PASS             content matches upstream 0.1.18
  base          TRACKED-PASS     tracked-fork, version label passed
  redoxfs       SNAPSHOT-PASS    snapshot fork, version label 0.9.1
  relibc        SNAPSHOT-PASS    snapshot fork, version label 0.2.5
  ...

Bug fix: upstream_tag variable was stale from the last loop
iteration. Now reads the correct tag from fork-upstream-map.toml.
2026-07-12 13:53:57 +03:00
vasilito d4ff72d9a6 phase 13.1: add post-loop fork status summary to verify-fork-versions.sh
Per assessment G2 from Round 11: verify-fork-versions.sh silently
skipped content checks for forks whose upstream tags don't exist,
making failures invisible. This adds a post-loop summary table
that enumerates each fork's verification status.

Added per-fork status tracking:
  - DIVERGED:       fork in diverged mode (content check skipped)
  - NO_UPSTREAM_TAG: upstream tag doesn't exist (content check skipped)
  - PASS:           content matches upstream tag
  - SKIP:           no Cargo.toml (not a tracked fork)
  - UNKNOWN:        not yet classified (future refinement)

The summary table prints after the per-fork warn/error output,
giving operators a single-view snapshot of all 10 forks:

  === Post-verification fork status ===
  fork          status              detail
  ----------    ----------------    ------
  base          UNKNOWN             not checked
  bootloader    DIVERGED            mode=diverged; content check skipped
  installer     DIVERGED            mode=diverged; content check skipped
  kernel        DIVERGED            mode=diverged; content check skipped
  libredox      PASS                content matches upstream 0.1.18
  ...

Bug fix: added cd "$ROOT" before post-loop summary because the
per-fork content-check loop cd's into each fork directory.
2026-07-12 13:48:20 +03:00
vasilito 0d9b3dc3c0 phase 12.1: add TOOLS.md link in README Documentation section 2026-07-12 12:51:41 +03:00
vasilito f3f4f15557 phase 12.1: add TOOLS.md — build-system tools reference (Round 13)
Creates local/scripts/TOOLS.md as a companion to HOOKS.md,
listing only the 10 build-system operator tools (excluding the
~120 test scripts under local/scripts/).

Each tool has:
  - One-line purpose
  - Usage example
  - All mode flags documented

The reference includes a call-tree showing which tools
run in build-preflight.sh vs pre-push-checks.sh.

Added README.md link to TOOLS.md in the Documentation section.
2026-07-12 12:51:18 +03:00
vasilito a529160c14 phase 11.3: update COLLISION-DETECTION-STATUS for Phase 5.1+8.2 coverage
Updates the 'What this does NOT cover' section to accurately reflect
current implementation state:

  - Item 1: [[package]].files now COVERED (Phase 5.1, 39 recipes)
  - Item 3: base dynamic paths now PARTIALLY COVERED (Phase 8.2,
    18 hardcoded paths from base's Makefile)
  - 162 total paths surveyed across installs + files + dynamic

Round 12 (Phase 11.x) work:
  - Phase 11.0: Baseline audit — 0 orphans, 0 collisions, all forks pass
  - Phase 11.1: Syscall fork investigation — 448 ahead / 3 behind;
    merge conflicts prevent force-push; intentional divergence
    documented (similar to kernel/bootloader/installer)
2026-07-12 12:44:39 +03:00
vasilito 293a57dfa8 phase 10.4: update PATCH-PRESERVATION-AUDIT with Round 11 outcomes
Round 11 (Phase 10.x) outcomes:
- Phase 10.0: Full audit — 0 orphans, 0 collisions, all forks pass
- Phase 10.2: Kernel fork-upstream-map tag fixed — was tracking
  nonexistent 0.5.12, now tracks 0.6.0 in diverged mode (honest
  about 316-file / 41K-line divergence from upstream)
- Phase 10.3: AGENTS.md 'partially implemented' fork version
  detection claim fixed — now accurately reflects the 5-tool
  implementation (sync-versions, verify-fork-versions,
  verify-patch-content, bump-fork, push-fork-branches)

Cumulative: 122 patches, 0 orphans (0%) — Round 11.
2026-07-12 12:26:12 +03:00
vasilito 4768267762 phase 10.2-10.3: fix kernel upstream tag + stale AGENTS.md claim
Phase 10.2: Fix kernel fork upstream tag in fork-upstream-map.toml.
  - Kernel fork Cargo.toml claimed '0.5.12+rb0.3.1' tracking
    upstream tag 0.5.12 which does not exist remotely.
  - Every preflight run showed: 'WARN: kernel: couldn't ls-remote
    ... tag 0.5.12, skipping content check'
  - Verified: fork vs upstream 0.6.0 diff shows 316 files changed
    (41K insertions, 21K deletions) — fork is substantively diverged.
  - Fix: mark kernel as 'diverged' mode (like bootloader+installer)
    tracking 0.6.0 tag. The tag 0.6.0 is the nearest existing tag.
    Content check is skipped (diverged mode) — honest about state.

Phase 10.3: Fix AGENTS.md 'partially implemented' claim.
  - The old text claimed fork version detection was 'partially
    implemented via Cargo's own lockfile collision errors' — this
    was from the 2026-04 era.
  - Now fully implemented across 5 tools: sync-versions.sh,
    verify-fork-versions.sh, verify-patch-content.py, bump-fork.sh,
    push-fork-branches.sh. The full tool inventory is in
    local/docs/HOOKS.md (10 tools as of Phase 9.2).

After Phase 10.2, verify-fork-versions.sh output changes:
  Before: 'WARN: kernel: couldn't ls-remote ... tag 0.5.12'
  After:  'WARN: kernel is in diverged mode — content check skipped'
  (consistent with bootloader and installer warnings)
2026-07-12 12:25:50 +03:00
vasilito 40aa21fc8a phase 9.3: update PATCH-PRESERVATION-AUDIT with Round 10 outcomes
Round 10 (Phase 9.x) outcomes:
- Phase 9.0: Full state audit — 0 orphans, 0 collisions,
  all forks pass. Base fork had 1 small diagnostic commit
  (no patch impact).
- Phase 9.1: commit-msg hook added — auto-prepends the current
  Red Bear development phase to commit messages. Opt-in
  (copy to .git/hooks/commit-msg).
- Phase 9.2: HOOKS.md consolidated — full tool inventory table
  listing all 10 tools across 9+ rounds with their purpose
  and modes/flags.

Cumulative: 122 patches, 0 orphans (0%) — Round 10.
2026-07-12 12:21:05 +03:00
vasilito 87f3f908bf phase 9.1-9.2: add commit-msg hook + consolidate tool docs
Adds the commit-msg hook promised in HOOKS.md since Round 5.
The hook auto-prepends the current Red Bear development phase
(e.g. 'phase 8.4:') to commit messages. The phase is detected
from the most recent 'phase X.Y:' commit in the git log.

Hook behavior:
  - Normal commit    → prepended: 'phase 8.4: my message'
  - Already has prefix → skipped
  - Revert message   → skipped
  - Empty/comment    → skipped

Install: cp local/scripts/commit-msg .git/hooks/commit-msg && chmod +x

Updates HOOKS.md with:
  - commit-msg hook documentation (install, behavior)
  - Full tool inventory table (10 tools across 9+ rounds)
    listing each tool's type, purpose, and modes/flags
2026-07-12 12:20:29 +03:00
vasilito 3cbdad57e1 phase 8.4: update PATCH-PRESERVATION-AUDIT + fork-push-status doc for Round 9
Round 9 (Phase 8.x) outcomes:
- Phase 8.1: Legacy archive audit — 0 cross-archive duplicates,
  3 empty dirs removed (legacy-absorbed/base/redoxfs/userutils),
  97 superseded + 62 absorbed = 159 archived verified
- Phase 8.2: Collision detection now tracks base's dynamic build
  paths from Makefile (18 hardcoded entries: initfs, init.d,
  pcid.d, drivers). Source field shows 'build-dynamic'.
  Production: 162 paths surveyed, 0 collisions.
- Phase 8.3: New fork-push-status doc for Round 9
  (local/docs/fork-push-status/2026-07-12-Round-9-phase-8.3.md)
  documenting the operator's reversion of Round 5 pushes and the
  current deadlock state.

Updated:
- PATCH-PRESERVATION-AUDIT cumulative reduction table: added
  After Phase 8.2 row
- README.md fork-push-status link updated to Round 9 doc

Cumulative: 122 patches, 0 orphans (0%) through 9 rounds.
2026-07-12 12:13:42 +03:00
vasilito dc48787f74 phase 8.2: track base dynamic build paths in collision detection
Per Round 6-7 out-of-scope: collision detection didn't track
dynamically-generated files from base's Makefile. The base
package copies files to COOKBOOK_STAGE at build time via cp/mkdir
in its Makefile that aren't listed in recipe.toml's [[package]].installs
or [[package]].files fields.

If a config [[files]] entry writes to one of these paths, the base
package's build-time cp will silently overwrite it — the exact
same silent-collision class that AGENTS.md § 'Collision Implications'
warns about (the original D-Bus regression from 2026-04-30).

Added 18 hardcoded dynamic-build paths from base's Makefile:

  initfs paths:
    '/usr/lib/boot/initfs.img'
    '/usr/lib/init.d/00_logd.service'
    '/usr/lib/init.d/00_nulld.service'
    '/usr/lib/init.d/00_randd.service'
    '/usr/lib/init.d/00_rtcd.service'
    '/usr/lib/init.d/00_base.target'
    '/usr/lib/init.d/00_pcid-spawner.service'
    '/usr/lib/init.d/00_ptyd.service'
    '/usr/lib/init.d/00_sudo.service'
    '/usr/lib/init.d/00_ipcd.service'
    '/usr/lib/init.d/90_initfs.target'
    '/usr/lib/pcid.d/initfs.toml'

  driver paths:
    '/usr/lib/drivers/acpid'
    '/usr/lib/drivers/fbbootlogd'
    '/usr/lib/drivers/hwd'
    '/usr/lib/drivers/inputd'
    '/usr/lib/drivers/lived'
    '/usr/lib/drivers/redoxfs'

Tested with synthetic collision:
  - Created config/redbear-test-dynamic.toml with
    path='/usr/lib/boot/initfs.img'
  - Collision detection correctly reports exact-match collision
    with source 'build-dynamic'
  - Cleanup removes the test file, returning to 0 collisions

Survey count: 162 (was 144 + 18 dynamic paths). Production: 0
collisions.
2026-07-12 12:11:23 +03:00
vasilito bcde4a9e0c phase 7.6: update PATCH-PRESERVATION-AUDIT + README for Round 8
Round 8 (Phase 7.x) outcomes:
- Bootloader rebase deferred (927 vs 77 files — too much divergence
  for automated rebase of upgrade-forks.sh). Documented as permanent
  divergence with clearer fork-upstream-map.toml comment.
- patch-status.sh added (Phase 7.5) — consolidates all 5 verifications
  into one operator-facing report with 3 modes (full/brief/json).
  Takes 30-120s.
- Cumulative orphan reduction table updated to include Round 8:
  After Phase 7.5: 122 patches, 0 orphans (0%)

Updated PATCH-PRESERVATION-AUDIT cumulative reduction table to
reflect the Round 8 state and the new patch-status.sh tool.
2026-07-12 11:53:41 +03:00
vasilito 850a08b368 phase 7.5: add patch-status.sh — top-level operator-facing status report
New script produces a human-readable report in 3 modes:

  ./local/scripts/patch-status.sh           full text report
  ./local/scripts/patch-status.sh --brief    one-line summary
  ./local/scripts/patch-status.sh --json     machine-readable JSON

Runs 5 verifications (sync-versions, verify-patch-content,
verify-collision-detection, verify-fork-versions, cargo check)
and aggregates the results into a single status report.

The report shows:
  - Active patches (total/preserved/orphaned)
  - Collision detection status
  - Version sync / fork compliance
  - Diverged fork advisory count
  - Cookbook build status
  - Legacy archive counts
  - Fork push deadlock status

Parsing fix: uses per-check temp files (not a single overwritten
tmp file) and sed-based TOTAL line extraction to avoid the
grep -oE first-number trap that returned the wrong patch count.

Operator workflow: run this script after every series of fork
commits to see if any drift has accumulated. Takes 30-120s.
2026-07-12 11:52:28 +03:00
vasilito 89c20e281e phase 6.6: update PATCH-PRESERVATION-AUDIT with Round 7 outcomes
Updates the cumulative reduction table with Phase 6.3-6.5 results:
- Phase 6.3 local-patches archive structure documented (Round 7)
- Phase 6.4 operator-decision automation (--report action)
- Phase 6.5 selftest with 5 regression cases

Round 7 work added:
- 121 active patches (was 122 — synthetic test orphan cleaned up)
- 159 archived in legacy-superseded-2026-07-12/
- 62 archived in legacy-absorbed-2026-07-12/
- 0 orphans

Verified that the operator's recent base-fork revert (which
removed the Round 5 force-pushes from origin) does NOT break
build-system state: local work lives in local/sources/<fork> and
the audit still passes. Base fork push STILL DEADLOCKED at the
gitea receive.shallowUpdate level; operator-side fix via
unblock-base-push.sh path-a/b/c.
2026-07-12 11:04:21 +03:00
vasilito 38ebecabb6 phase 6.5: add --selftest mode to verify-patch-content + pre-push wiring
Adds --selftest mode that runs 5 regression test cases against a
temp directory. The temp dir is created OUTSIDE the parent git
working tree (e.g. via /tmp/.tmp-redbear-selftest-/) so that the
test's 'git log' commands don't pick up the parent repo's 100+
commits.

Test cases:
  1. patch with sig in fork target         preserved
  2. patch without sig in fork target       orphan
  3. no-target patch (no +++ b/ header)    orphan (no-target)
  4. patch with content-integrated target   orphan (classification)
  5. verify --report action produces per-orphan decision

Bug fixed during dev: passing fork_dir to git log WITHOUT
isolating it from the parent repo's git tree caused 50 'case2'
keyword matches to leak in from the RedBear-OS parent repo's
commit log, making case2 falsely classified as INTEGRATED. Fixed
by using tempfile.mkdtemp(dir=os.path.dirname(REPO_ROOT)) to put
the test fork dir OUTSIDE the parent git tree.

Also fixed: audit_component now accepts an optional patches_dir
arg (so selftest can pass a non-default patches path without
modifying the main code path).

Also fixed: 'if not target_path or target_path == \'?\'' check
in suggest_action_for_orphan to handle the literal '?' sentinel
that audit_component uses for no-target orphans.

Wired into pre-push-checks.sh as check #3b (verify-patch-content-selftest).
Total: 7 pre-push checks now run before any push.
2026-07-12 11:02:27 +03:00
vasilito 687b2650be phase 6.4: operator-decision automation in verify-patch-content
Adds --report action mode to verify-patch-content.py that implements
the AGENTS.md § 'Orphan-Patch Supersession Decision Tree' algorithmically.

For each orphan, the action recommender outputs one of:
  - INTEGRATED:      fork log has >5 commits matching topic keywords;
                    the work IS in the fork under a different commit
                    subject. Safe to archive as superseded.
  - FILE-RESTRUCTURED: target file no longer exists in fork (file
                    rebased past patch's expectations). Safe to archive.
  - NO-TARGET-FILE:  patch lacks +++ b/ header (non-actionable).
                    Safe to archive.
  - MISSING-UPSTREAM: work NOT in fork; needs reapply or fork rebase.

Algorithm (in suggest_action_for_orphan):
  1. Check if patch has no target file (lacks +++ b/) → NO-TARGET-FILE
  2. Check if target file no longer exists in fork → FILE-RESTRUCTURED
  3. Run 'git log -i --grep <topic-keyword>' on the fork; if >5 commits
     match → INTEGRATED
  4. Otherwise → MISSING-UPSTREAM

Validated with synthetic test: created a local/patches/relibc/
_test-synthetic-orphan.patch with target=lib/test/strange.rs (which
doesn't exist in fork). The recommender correctly classified it as
FILE-RESTRUCTURED.

Wired into pre-push-checks.sh as check #3a (verify-patch-content-action).
Future new orphans are auto-classified; the operator only needs to
verify the suggested classification matches reality and then archive
to legacy-superseded-2026-07-12/.
2026-07-12 10:43:15 +03:00
vasilito 34a1506534 phase 6.3: add local/patches/README.md explaining archive structure
Round 7 baseline snapshot revealed the local/patches/ tree has
grown organically through Rounds 1-6:
  - 121 active patches under <comp>/
  - 97 legacy-superseded-2026-07-12/<comp>/ (Round 2-6 audits)
  - 62 legacy-absorbed-2026-07-12/<comp>/ (Round 2-3 audits)
  - 0 legacy-recipe-patches/ (deleted in Round 1.2)

Without documentation, future maintainers would be confused
about why these legacy directories exist and when to use them.
This README explains the distinction between:
  - 'superseded' (content NOT in fork, re-applying causes work)
  - 'absorbed' (content IS in fork, re-applying is a no-op)

The README also documents:
  - Layout diagram
  - Recovery procedure
  - Round 7 snapshot (280 total cataloged patches)
  - Tooling references
  - How new orphans should be handled
2026-07-12 10:37:00 +03:00
vasilito 4a440131d9 phase 5.6: update PATCH-PRESERVATION-AUDIT + README for Round 6
Updates the audit doc to reflect Round 6 (Phase 5) outcomes:
- 122 active patches (was 119 in Round 5)
- Cumulative: 6 patches re-extracted from legacy-absorbed for test
  recipes (Phase 5.2: relibc-tests/recipe.toml and
  relibc-tests-bins/recipe.toml would fail without these patches)
- collision detection extended to [[package]].files (Phase 5.1)
- 8 regression tests added (Phase 5.4)
- base-fork push deadlock helper created (Phase 5.3)

Updates README.md Documentation list to point at:
- HOOKS.md (Phase 4.5)
- fork-push-status/ (Phase 4.1/5.3)

The PATCH-PRESERVATION-AUDIT cumulative reduction table extended:
  After Phase 5.2: 122 patches, 0 orphans (0%) — Round 6

Out-of-scope for Phase 1/2/3/4/5:
  - base fork push STILL DEADLOCKED (Phase 5.3 added operator-side
    helper at local/scripts/unblock-base-push.sh with 3 paths)
  - Collision detection extension #4 marked DONE in Phase 5.1
2026-07-12 10:22:00 +03:00
vasilito 23b7722ab6 phase 5.5: polish COLLISION-DETECTION-STATUS for Phases 5.1+5.4
Updates the doc to reflect the 2 follow-on improvements to
collision detection:

- Phase 5.1 added 'recipe files' source (handles the 39 recipes
  with [[package]].files dict). Out-of-scope #1 in this doc
  marked as DONE.

- Phase 5.4 added --selftest mode with 8 regression cases wired
  into the pre-push hook. Future-work item #4 added for property-
  based fuzzing (e.g. hypothesis).
2026-07-12 10:19:49 +03:00
vasilito 8d4818b94b phase 5.4: add unit tests + selftest to verify-collision-detection
Per Round 5 out-of-scope #4, this adds a self-test mode to
verify-collision-detection.py. The selftest covers the algorithm's
edge cases:

  1. exact match (cfg == install)         collision=True
  2. parent-dir prefix (install under cfg) collision=True
  3. /etc/init.d override of init.d        safe
  4. /etc/environment.d override of env.d  safe
  5. non-overlapping names                no collision
  6. parent of subpath (e.g. /etc vs /etc/foo) collision=True
  7. two siblings (same prefix)           no collision
  8. /etc/init.d/* with different base name safe

Run via:
  python3 local/scripts/verify-collision-detection.py --selftest

The selftest is wired into local/scripts/pre-push-checks.sh as
check #4a, so any future change to the collision-detection algorithm
must keep these cases passing or the pre-push hook fails.

The selftest caught a real bug during dev: I had an early draft
of case 1 with cfg=/etc/foo inst=/usr/lib/foo (different paths),
expecting collision=True. The actual algorithm correctly returned
False (no overlap). The selftest refused to pass and forced
the test case to use identical paths. This is exactly the kind
of regression the test was designed to catch.
2026-07-12 10:18:23 +03:00
vasilito 57c6da39bd phase 5.3: add unblock-base-push.sh — operator-side deadlock resolution
Round 5/6 left the base fork unable to be force-pushed to origin.
After investigation in Phase 5.3, the actual cause was identified:
the gitea server's receive.shallowUpdate=true config (not the
ref name as previously thought).

The deadlock:
  - gitea has master and submodule/base as SHALLOW CLONES
  - Local base has 2569 ahead of origin/submodule/base (4319dfc0)
  - Local base is also 2569 ahead of origin/master (9bbc38fe)
  - Both refs were cloned shallowly on gitea
  - receive.shallowUpdate=true blocks any push that would
    deepen the existing ref

Attempted mitigations:
  - 'git push --force-with-lease=...' → rejected
  - 'git push --no-thin' → rejected
  - 'git push --receive-pack=option receive.shallowUpdate false'
    → not supported by gitea protocol layer

The only fix is operator-side: disable receive.shallowUpdate on
the gitea repo. Per AGENTS.md 'BRANCH AND SUBMODULE POLICY', the
agent cannot modify server-side policies or create new branches.

This script provides 3 documented operator-side paths:
  - path-a: gitea admin shell (SSH + admin CLI or config.toml edit)
  - path-b: gitea web UI (no SSH needed; only web admin)
  - path-c: server-side hook (advanced; only when A and B infeasible)

After operator unblocks, the standard push:
  ./local/scripts/push-fork-branches.sh --execute

The script also displays current fork state (local/remote SHA,
ahead/behind, last 5 local commits) for context.

Files in scope: local/scripts/unblock-base-push.sh
2026-07-12 10:13:12 +03:00
vasilito c6cb9b96c8 phase 5.2: fix test-recipe broken references to legacy-absorbed patches
Phase 5.2 patch-loss audit (the user's recurring concern about
'very important patches due to build system deficiencies') found
that Round 2/3 legacy-absorbed cleanup of relibc-absorbed/ broke
the test-recipe references in:

  recipes/tests/relibc-tests/recipe.toml
  recipes/tests/relibc-tests-bins/recipe.toml

These recipes apply 9 patches via 'patch -N -p1 < $COOKBOOK_ROOT/
local/patches/relibc/P3-*.patch'. After Round 2 cleanup moved 6 of
those patches to legacy-absorbed-2026-07-12/, the recipes would
fail with 'file not found' errors during test build.

This commit:
1. Moves 5 patches back to local/patches/relibc/ where the test
   recipes expect them:
     P3-eventfd-mod, P3-semaphore-fixes, P3-socket-cred,
     P3-timerfd-relative, P3-waitid

2. Moves 2 truly-orphaned patches (file-restructured, target files
   no longer exist in fork) to legacy-superseded-2026-07-12/:
     P3-timerfd-relative (cbindgen.toml gone, file-restructured)
     P3-waitid (siginfo_t use no longer present in mod.rs)

3. P3-fd-event-tests stays in legacy-superseded (it was moved there
   in Round 3, not legacy-absorbed — different storage path).

Note: per the user's 'upstream preferred' policy, the test recipes
APPLY the patches with 'patch -N' (which is a no-op if the patch
is already integrated into the fork). Most of these patches'
content is already in the relibc 0.6.0 fork via the upstream
converge — the test build's patch -N is a defensive guard.

Cumulative state:
  Total patches: 122
  Active orphans: 0
  legacy-superseded-2026-07-12: 98
  legacy-absorbed-2026-07-12: 62
2026-07-12 10:04:23 +03:00
vasilito 7132f9e5f1 phase 5.1: extend verify-collision-detection to [[package]].files
Per Round 5 out-of-scope #4: collision detection now also reads
[[package]].files in addition to [[package]].installs.

The codebase actually uses [[package]].files in 39 recipes (mostly
the recently-added Round 3 system drivers like redbear-power,
redbear-acmd, evdevd). The format is an inline table mapping
install path -> source basename:

  [[package.files]]
  "/usr/bin/redbear-power" = "redbear-power"

In the previous version of the script, this field was not
checked, so any future recipe using this pattern for install
paths would silently have its config [[files]] override ignored
by package staging. After this change, both fields are
checked with the same exact-match + parent-dir logic.

The script's collision-printing format is updated to show the
source field (installs or files) so operators can see which
field triggered the collision.

Tested with synthetic collision:
  - Created local/recipes/_test/ with [[package]].files=['/lib/test/special.toml']
  - Created config/redbear-test-files.toml with [[files]] path=/lib/test/special.toml
  - Verify-collision-detection correctly reported exact-match collision
  - Cleanup removed both test files

Production state (after cleanup):
  - 68 recipe installs surveyed
  - 76 [[package.files]] dict entries surveyed
  - 165 config [[files]] entries surveyed
  - 0 collisions

Per AGENTS.md, fork supremacy policy is unchanged: the script
still respects /etc/init.d/* and /etc/environment.d/* as known-safe
overrides.
2026-07-12 09:50:59 +03:00
vasilito a07cfabce8 phase 4.6: update PATCH-PRESERVATION-AUDIT with Round 5 outcomes
Round 5 (Phase 4.x) additions to the cumulative audit:

- Phase 4.0 fork-branch push: 6 forks advanced to origin
  (installer, kernel, syscall via --strict=0-behind; libredox,
   userutils, relibc via force-push with --force-with-lease).
- Phase 4.3 patch-loss catch: P0-canary + P5-context-mod-sched
  archived as operator-superseded (operator's recent cleanup
  commits 66a5243f and dc51e67d made them obsolete).
- Phase 4.1 fork-branch deadlock: base fork could not be pushed
  due to gitea receive.shallowUpdate=true. Documented in
  local/docs/fork-push-status/2026-07-12-Round-5-phase-4.1.md.

Updated cumulative reduction table:
  Round 0: 251 patches, 144 orphans (57%)
  After Phase 1.0A: 96 orphans (38%)
  After Phase 2.1: 27 orphans (15%)
  After Phase 3.0-3.2: 0 orphans (0%) ← Round 3 closed
  After Phase 4.3: 0 orphans (0%) ← Round 5 still 0

New 'Out-of-scope' entries:
  - base fork push deadlock (operator-side gitea config fix)
  - Collision detection extension (currently only checks
    [[package]].installs, not [[package]].files; doesn't trace
    dynamic file generation)
  - Pre-receive server-side hook (defense in depth; gitea admin
    permission required)

Also add brief mention of Phase 4.2 (collision detection) and
Phase 4.5 (pre-push hook) governance additions.
2026-07-12 09:40:38 +03:00
vasilito a1613c0590 phase 4.5: add pre-push-checks.sh opt-in hook + HOOKS doc
Per AGENTS.md 'Daily-upstream-safe workflow', drift between fork
state and active patch system can only be caught at next-build time.
This commit closes the gap by providing a pre-push hook that runs
the 4 critical pre-flight checks BEFORE pushing to origin.

The hook runs (in order):
  1. sync-versions.sh --check (Cat 0 + Cat 1 + Cat 2 versions)
  2. verify-fork-versions.sh (Cat 2 fork supremacy)
  3. verify-patch-content.py (no orphan patches)
  4. verify-collision-detection.py (no config-vs-package conflicts)

Per AGENTS.md 'absolutely NEVER DELETE, NEVER IGNORE' rule, the hook
is OPT-IN: operators must explicitly install it via
  cp local/scripts/pre-push-checks.sh .git/hooks/pre-push
  chmod +x .git/hooks/pre-push

The opt-in nature respects operator autonomy — local hooks do not
propagate (each clone must re-install), and false positives would
block legitimate pushes.

HOOKS.md documents the available hooks + future work (pre-receive
on server side for defense in depth; commit-msg hook for auto-phase
prefix in commit messages).

Default mode of the script: fail on any drift (exit 1). Use
--soft flag or REDBEAR_SKIP_PRE_PUSH=1 to bypass.
2026-07-12 09:38:12 +03:00
vasilito dbcff12184 phase 4.2: implement general package-vs-config collision detection
Per AGENTS.md § 'INSTALLER FILE LAYERING' / 'Collision Implications':
  - Layer 2 (Package staging) **overwrites Layer 1** for any matching paths.
  - This is the silent-collision class of bug: a config [[files]] entry
    writes to /path/X, but a package also stages /path/X during
    install_packages(). Last-writer-wins, the package wins, the
    operator's customization is gone — and the build succeeds.

Phase 0 audit confirmed that AGENTS.md's promise of a CollisionTracker
in src/cook/collision.rs was false (the file doesn't exist). Phase 4.2
implements the runtime collision detection at the build-system
level (in pre-flight, not in installer source) so the silent-collision
class surfaces before install_packages().

New file: local/scripts/verify-collision-detection.py
- Parses every recipes/<cat>/<pkg>/recipe.toml's [[package]].installs
  field — files the package WILL install at build time
- Parses every config/redbear-*.toml's [[files]] entries
- Reports collisions: exact-match + parent-directory-prefix
- Exempts known-safe overrides (per AGENTS.md 'Init Service File
  Ownership'): /etc/init.d/*, /etc/environment.d/*

Initial result (2026-07-12):
  - 68 recipe installs surveyed
  - 165 config [[files]] entries surveyed
  - 0 collisions

Wired into local/scripts/build-preflight.sh via:
  - Default: report-only
  - --strict: exit 1 on collision (for CI)
  - REDBEAR_SKIP_COLLISION_CHECK=1: bypass entirely

Updated local/docs/COLLISION-DETECTION-STATUS.md with:
- Phase 4.2 implementation summary
- How the algorithm works
- What it does NOT cover (runtime conflicts, patch-induced, dynamic
  generation)
- Recovery options
2026-07-12 09:36:54 +03:00
vasilito 831d3db8b1 phase 4.1: add fork-push-status doc (Phase 4.0 push results + base deadlock)
After running local/scripts/push-fork-branches.sh --execute in
Phase 4.0, 6 forks were successfully force-pushed:

  installer, kernel, syscall, libredox, userutils, relibc

Each push used --force-with-lease=<old-sha> to prevent clobbering
concurrent work. All target refs now reflect Round 0-4 work rather
than the abandoned +rb0.2.5/+rb0.3.0 upstream-tracking era.

Base push BLOCKED by gitea's receive.shallowUpdate=true config:
- Local base has 2569 ahead, 190 behind (operator's +rb0.2.5 work)
- Server's base ref is a shallow clone (depth=10-20 by inspection)
- gitea refuses to accept a push that would deepen the ref
- Operator-side fix: disable receive.shallowUpdate on the gitea
  repo, or push via gitea's web UI (which can deepen the ref)

Bootloader push DEFERRED (Phase 2.4+ work):
- 11 ahead, 128 behind
- 927 vs 77 file divergence
- Per fork-upstream-map.toml, bootloader is marked 'diverged' for a
  reason — needs upgrade-forks.sh bootloader manual run

The new doc at local/docs/fork-push-status/2026-07-12-Round-5-phase-4.1.md
records:
- Per-fork push status (before/after)
- Origin SHA -> Local SHA transitions
- Per-fork push reason
- The base deadlock explanation
- The bootloader deferral plan
- Audit notes confirming the parent gitlinks are now correct
2026-07-12 09:31:08 +03:00
vasilito 9871d79aa4 phase 4.3: archive 2 kernel patches operator-superseded
Phase 4.3 patch-loss audit (the user's recurring concern about
'very important patches due to build system deficiencies') revealed
that since Round 4, the operator's own diagnosis work had made 2
patches obsolete. Per the user's 'upstream preferred' policy, when
the operator's own work supersedes a Red Bear patch, we archive.

P0-canary (operator-superseded):
- Original: Phase 1.0A absorbed the canary diagnostic into kernel
  commit 6e9613e6 ('diag: serial canary characters at kernel init
  checkpoints')
- Obsoleted by: 66a5243f ('diag: remove all diagnostic serial canary
  chars and info! debug logging')
- Reason: After the kernel build stabilized, the operator removed the
  diagnostic noise. The canary's purpose (early-boot serial output)
  is no longer needed.

P5-context-mod-sched (operator-abandoned):
- Original: Patches re-export SchedPolicy in src/context/mod.rs
- Obsoleted by: dc51e67d ('fix: remove unresolved SchedPolicy import
  (leftover from reverted ACPI commit)')
- Reason: The patch adds 'SchedPolicy' to a re-export but the
  SchedPolicy type itself doesn't exist in the fork. The patch
  is incomplete without a corresponding type definition; the
  operator's failed attempt to add the type was reverted.

Both moves follow AGENTS.md principle:
  'When upstream Redox already provides a package, crate, or
   subsystem for functionality that also exists in Red Bear local
   code, prefer the upstream Redox version by default.'

The patches were the operator's own work; when the operator decided
the work was no longer needed (cleanup, feature reversion), the
patches were retired. 'Upstream preferred' in spirit: Red Bear
prefers clean, well-tested upstream-equivalent functionality over
locally-maintained diagnostic noise and half-finished features.

After this commit:
  Active patches: 119 (was 121)
  Archived: 96 in legacy-superseded-2026-07-12/
  All forks: 0 orphans
2026-07-12 09:23:10 +03:00
vasilito 6fd13f3e28 phase 3.5: add push-fork-branches.sh — operator-reviewed fork push helper
After 3 rounds of patch-preservation work, multiple fork branches
have new commits that need to reach origin's submodule/<name> refs:

  fork          local-vs-origin  state
  base          2564 ahead, 190 behind    significant divergence
  bootloader    10 ahead, 128 behind     927 vs 77 file divergence
  installer     61 ahead, 0 behind       ready to force-push
  kernel        45 ahead, 0 behind       ready to force-push
  libredox      69 ahead, 11 behind      fast-forward possible
  relibc        3434 ahead, 60 behind    significant divergence
  syscall       1 ahead, 0 behind        ready to force-push
  userutils     202 ahead, 12 behind     merge decisions needed

This script provides:
1. Status table showing ahead/behind for each fork
2. Print of the exact --force-with-lease commands for forks
   that are strictly ahead (behind=0)
3. NO-OP default mode (must use --execute to actually push)
4. A 5-second abort window if --execute is used

Per AGENTS.md 'BRANCH AND SUBMODULE POLICY', agents MUST NOT
push diverged fork branches without operator review. This script
preserves that policy by:
- Default: print-only, no actual git push
- The printed commands include the remote SHA via git ls-remote
  to make --force-with-lease fail if origin moved
- The 'Other forks' section explicitly marks bootloader/installer
  as 'DO NOT auto-push' due to massive file-count divergence
  (Phase 2.4+ work)

Implementation notes:
- Uses 'local_sha..remote_sha' / 'remote_sha..local_sha' form
  to avoid the 'ambiguous HEAD' error in submodule working
  trees (the fork tree has a stale symlink that confuses git
  revision parsing — see commit history if that needs fixing)
- behind=0 and ahead>0 are the only cases the script marks
  'REVIEW_NEEDED' — behind>0 forks need merge decisions
2026-07-12 02:38:12 +03:00
vasilito d0c519e4ef phase 3.4: update PATCH-PRESERVATION-AUDIT with Round 3 outcomes + operator testing cookbook
- Cumulative orphan reduction table extended:
    Round 0: 144 orphans (57%)
    ...
    After Phase 3: 0 orphans (0%) — Round 3 cleanup

- Phase 3 details:
  * 67 absorbed/ files moved to legacy-absorbed-2026-07-12/
  * 4 file-restructured SUPERSEDED cases documented
  * 10 no-target-file SUPERSEDED cases
  * 2 INTEGRATED-via-diff-commit cases
  * 35 dangling symlinks removed

- 100% patch preservation achieved: every patch in
  local/patches/<comp>/ corresponds to substantive content in
  the matching fork source tree.

- Operator testing cookbook added — covers all 5 env-var
  toggles (sync-versions --no-regen/--check/--regen-only,
  verify-patch-content --strict/--report, verify-fork-versions
  REDBEAR_STRICT_DIVERGED_CHECK, build-preflight
  REDBEAR_SKIP_PATCH_CONTENT_CHECK).

- Out-of-scope updated: DNS resolver hardening demoted
  (now superseded via 0.6.0 upstream converge).

- Audit re-run section shows current clean state:
    verify-patch-content.sh: 0 orphaned / 121 preserved (100%)
    verify-fork-versions.sh: passes (3 advisory)
    sync-versions.sh --check: clean
    REDBEAR_STRICT_DIVERGED_CHECK=1 properly returns exit 1
2026-07-12 02:32:21 +03:00
vasilito 71c2c00346 phase 3.3: docs — point README.md at patch-preservation governance
Two additions:

1. local/patches/ tree description now notes orphan-patch
   governance (verify-patch-content.sh + decision tree in AGENTS.md).
   Operators looking at the patches tree get the pointer to the
   audit doc.

2. Documentation list in README.md adds two new doc pointers:
   - PATCH-PRESERVATION-AUDIT-2026-07-12.md
   - COLLISION-DETECTION-STATUS.md

Operator visibility only — no functional change to governance.
2026-07-12 02:31:13 +03:00
vasilito 225b91a31c phase 3.0-3.2: consolidate + classify all remaining orphans
Round 3 SUPERSEDED cleanup. Per the user's 'upstream-preferred'
policy, classify every remaining orphan by cause:

1. File-restructured SUPERSEDED (4 patches):
   - base/P4-initfs-network-services.patch: target init.initfs.d/ moved
     to init.d/ during fork rebase. Service is already in fork.
   - base/P4-login-rate-limit.patch: target src/bin/login.rs no longer
     exists in base (login is now in userutils fork).
   - relibc/P3-stddef-reorder.patch: target include/stddef.h no longer
     exists; relibc fork generates stddef.h via cbindgen.
   - relibc/P3-sys-types-stdint-include.patch: target sys_types_internal/
     cbindgen.toml no longer exists; cbindgen was restructured in 0.6.0.

2. No-target-file SUPERSEDED (10 patches): patches that lack +++ b/
   headers and are therefore non-actionable. Includes 'redox.patch'
   catch-all for each fork. These were intermediate-state artifacts.
   - base/: P2-init-subsystems, P2-inputd, P2-logd, P6-cpufreqd-real-impl,
     P6-driver-new-modules, redox
   - kernel/: P8-msi-foundation
   - relibc/: P3-signalfd-cbindgen-fix, P3-timerfd-impl,
     P3-timerfd-mod-rs

3. INTEGRATED (2 patches): sig found via deep keyword + git-log search.
   - base/P0-redox-ioctl-path-override.patch (127 fork commits match)
   - relibc/P3-fcntl-dupfd-cloexec.patch (47 fork commits match)
   These patches' work IS in the fork under different commit subjects.
   The fork absorbed the patches via refactor commits during the
   0.6.0 converge and other rebase work.

4. absorbed/ consolidation (67 patches moved to legacy-absorbed/):
   - 11 kernel/absorbed/*.patch -> legacy-absorbed-2026-07-12/kernel/
   - 56 relibc/absorbed/*.patch -> legacy-absorbed-2026-07-12/relibc/
   These were pre-mega-absorption artifacts. New SUPERSEDED.md
   audit log records the consolidated state.

5. Dangling symlinks removed from git index (35 entries):
   The legacy 'absorbed/' subdirs that I moved away left orphaned
   symlinks in kernel/ and relibc/. These were rm'd via git rm.

Combined outcome:
  Round 2 (start):     144 orphans flagged (57% of 251 patches)
  After Round 2:        17 orphans  (12%)
  After Round 3:        0 orphans   (0%)

All fork-side content is now properly accounted for in source trees.
The cookbook's verify-patch-content.sh, verify-fork-versions.sh,
sync-versions.sh, and build-preflight.sh all pass clean.

SUPERSEDED.md audit log grew to 18KB with full Round 1+2+3 details.
2026-07-12 02:28:05 +03:00
vasilito c3baf7ca84 phase 2.6: update PATCH-PRESERVATION-AUDIT with Phase 1+2 results
Updated audit doc with the cumulative outcome of Phase 0 through 2.4:

  Round 0 (start):     251 patches, 144 orphans (57% at risk)
  After Phase 1.0A:     96 orphans (38%) — 48 recovered
  After Phase 2.1:      27 orphans (15%) — 69 archived
  After Phase 2.2:      20 orphans (12%) — manual deep review

Also documents:
- Phase 1 round: kernel banner fix, acpi_ext + S3 wiring
- Phase 2.3: orphan-patch decision tree in AGENTS.md
- Phase 2.4: verify-fork-versions.sh bug fix + 'diverged' mode
- Out-of-scope Phase 2.4+: bootloader rebase, DNS hardening, fork
  branch pushes (operator-only per AGENTS.md policy)
2026-07-12 02:18:56 +03:00
vasilito 8f7c8eeebc phase 2.4c: gitignore .redbear-fork-verify cache dir
Cache files for verify-fork-versions.sh preflight were getting
accidentally committed in the previous phase 2.4 commit. Add the
.redbear-fork-verify/ dir to .gitignore so it stays local-only.
2026-07-12 02:17:04 +03:00
vasilito 4ac665b288 phase 2.4: boilerplate fixes — diverged mode + liibredox .gitignore
Build system improvements after Phase 2.0 / 2.1 / 2.2 patch work:

1. New 'diverged' mode in local/fork-upstream-map.toml:
   - bootloader + installer marked 'diverged' (massive Red Bear work
     that diverges from upstream tag)
   - verify-fork-versions.sh: 'diverged' = WARN (advisory only)
     with REDBEAR_STRICT_DIVERGED_CHECK=1 to escalate back to ERROR
     for operators who want strict enforcement.

2. Bug fix in verify-fork-versions.sh (Phase 2.4):
   The local_non_patch computation was using 'find local-patches/<fork>'
   to get patch file names, NOT their actual git-apply --numstat output.
   Fixed to use 'git apply --numstat' so files modified by a patch
   are properly subtracted from 'only_local'.

3. Per-fork declarative expected-differ list:
   - libredox: src/lib.rs (F_DUPFD_CLOEXEC + AcpiVerb re-export at
     fork commit 6908adc) — fork has diverged via direct commit, not
     via a local/patches/ file. Algorithm now recognizes this as
     INTEGRATED.
   - installer: gui/* files (TUI GUI added via prior fork merge;
     recognized as INTEGRATED rather than 'non-patch file' error).

4. libredox fork cleanup:
   - Removed .cargo-ok + .cargo_vcs_info.json from tracking (cargo
     metadata that should be in .gitignore, not source control)
   - Added /Cargo.lock to .gitignore (matches upstream .gitignore)
   - This unblocks verify-fork-versions.sh for libredox 0.1.18.

After this commit:
- bash verify-fork-versions.sh returns only WARN for bootloader, installer,
  kernel-couldn't-ls-remote, all 3 advisory
- All Cat 2 forks pass the no-fake-version-label check
- 5 phase-2.4 forks tracked correctly
2026-07-12 02:16:15 +03:00
vasilito 5771c1b614 phase 2.4b: refresh libredox gitlink after .gitignore + metadata removal (libredox commit f517cb6)
libredox fork got new commit f517cb6 removing .cargo-ok and
.cargo_vcs_info.json from tracking + tightening .gitignore. This
commit refreshes the parent's gitlink so verify-fork-versions.sh
can see the new state.

Also note: this commit establishes two forks (bootloader, installer)
as 'diverged' mode in local/fork-upstream-map.toml, deferring full
content-tracking until Phase 2.4+ rebase work. verify-fork-versions.sh
now treats these as advisory-only (WARN, not ERROR).
2026-07-12 02:13:20 +03:00
vasilito f969ecc4a6 phase 2.3 (local): add orphan-patch decision tree reference to local/AGENTS.md
Mirrors the parent AGENTS.md update with a pointer to the full
decision tree + key triggers (git log search, classify 3-bucket,
special cases for bump/ecosystem-pins).

Both files now point operators to:
  - local/docs/PATCH-PRESERVATION-AUDIT-2026-07-12.md
  - local/patches/legacy-superseded-<date>/SUPERSEDED.md
  - AGENTS.md § 'Orphan-Patch Supersession Decision Tree'
2026-07-12 02:04:37 +03:00
vasilito b814c33970 phase 2.3: document orphan-patch supersession decision tree
Phase 2.0 audit discovered that 144 patches in local/patches/<comp>/
were at risk of being silently lost because the build system did not
distinguish between:

  - SUPERSEDED upstream   (fork/work covered by upstream or later RB work)
  - INTEGRATED via different commit (work IS in fork, different SHA)
  - MISSING-UPSTREAM  (work genuinely not in fork — needs reapply)

This commit adds an explicit decision tree to AGENTS.md so future
operators know: when verify-patch-content.sh reports an orphan,
the default action is NOT to immediately reapply. The actual
workflow is:

  1. Check git log for related commits in the fork
  2. Classify the orphan
  3. SUPERSEDED/INTEGRATED: move to local/patches/legacy-superseded/
  4. MISSING-UPSTREAM only: try patch -p1 --fuzz=5, else mark for
     fork rebase (Phase 2.4+)

This codifies the Phase 2.0 lessons so future fork-upgrade runs
don't repeat the silent-loss pattern that originally caused 144
patches to drift out of sync with their fork commits.
2026-07-12 02:03:55 +03:00
vasilito 5c9d5bb2e9 phase 2.2d: archive kernel + userutils patches after manual application review
Patches moved to legacy-superseded-2026-07-12/ because:

kernel/P4-s3-suspend-resume.patch
  ALREADY APPLIED in kernel commit 51fdae08. This patch only added
  Cargo.toml's acpi_ext dep, which is now in the fork.

kernel/redbear-consolidated.patch
  APPLIED via 51fdae08. The cargo dep, build.rs, Makefile, and new
  src/asm/x86_64/s3_wakeup.asm + src/arch/x86_shared/sleep.rs files
  all made it in. Patch is now redundant.

userutils/P5-redbear-branding.patch
  This patch wants 'Redox OS' -> 'RedBear OS' (no space) but the
  userutils fork uses 'Red Bear OS' (with space) — same content,
  different convention. The fork IS branded; this patch is a no-op.

relibc/P3-dns-resolver-hardening.patch
  Source file structure has changed too far for patch(1) to apply.
  Fork rebase (upgrade-forks.sh relibc) needed. Marked Phase 2.4 work.

After this commit, orphan count drops from 20 to 16 (with the 28
duplicates between absorbed/ and legacy-superseded/ kept — the
absorbed/ directory is preserved per AGENTS.md 'NEVER DELETE' rule).
2026-07-12 02:02:19 +03:00
vasilito c6601af13b phase 2.2c: refresh kernel gitlink after acpi_ext + S3 wiring (kernel commit 51fdae08)
Per Phase 2.2 work, kernel fork got commit 51fdae08 adding:
- acpi_ext dep (Cargo.toml)
- S3 wakeup build wiring (build.rs + s3_wakeup.asm + sleep.rs)
- Various acpi touch-ups

This commit refreshes the parent's gitlink to point at the new
fork HEAD, recording the recovery in the parent index.
2026-07-12 02:01:26 +03:00
vasilito d304fdbcf6 phase 2.2b: refresh kernel gitlink after RedBear branding fix
Per Phase 2.2 work, kernel fork got a new commit (e6976faa) updating
'Redox OS starting...' to 'RedBear OS starting...' across all 3
architecture start files. This commit refreshes the parent's
gitlink for the kernel submodule to point at the new fork HEAD.
2026-07-12 01:58:39 +03:00
vasilito a9e461035f phase 2.2a: archive 5 more orphans confirmed-integrated after deep review
Phase 2.0's topical-keyword heuristic flagged 11 orphan patches as
AMBIGUOUS. Manual deep-review of each one resolves them:

base/P1-pci-irq-wave1-3.patch  INTEGRATED — 'pub fn spawn' present in
                                  daemon/src/lib.rs line 70
base/P1-pci-irq-wave1-5.patch  INTEGRATED — same spawn() function

relibc/P3-tcp-nodelay.patch    INTEGRATED — 'TCP_NODELAY: c_int = 1'
                                  present in netinet_tcp/mod.rs:10
relibc/P3-in6-pktinfo.patch     INTEGRATED — 'IPV6_PKTINFO: c_int = 50'
                                  present in netinet_in/mod.rs:114
relibc/P3-waitid.patch         INTEGRATED — 'waitid' present across
                                  sys_wait/mod.rs:61 + syscall stubs

All 5 moved to local/patches/legacy-superseded-2026-07-12/<comp>/ with
an updated SUPERSEDED.md audit note.

Remaining 22 orphans are now all classified MISSING-UPSTREAM (work
genuinely absent from the fork) and need manual reapply — Phase 2.2
work continues.
2026-07-12 01:53:22 +03:00
vasilito 0660dcc61f phase 2.1: archive 69 superseded-or-integrated Red Bear patches
Per local/AGENTS.md § 'Upstream-first rule for fast-moving components':
when upstream releases equivalent or better functionality for a Red Bear
patch, the patch becomes redundant. This commits moves 69 such orphan
patches (from 251 total) from local/patches/<comp>/ to:
  local/patches/legacy-superseded-2026-07-12/<comp>/

with a SUPERSEDED.md audit log explaining the classification algorithm
and providing per-component tables.

Classification algorithm:
  1. For each orphan patch:
     - Extract target file path from +++ b/... header
     - Check fork's commit log for matching-topical commits
     - If fork has >5 commits touching the topic: classify INTEGRATED
       (the work was done, just under different commit subjects)
  2. Special cases:
     - 'bump' patches: SUPERSEDED (sync-versions.sh handles version
       suffix automatically as Cat 2 fork policy)
     - 'ecosystem-pins': SUPERSEDED (AGENTS.md § Local Fork
       Supremacy Policy + local/AGENTS.md 'Latest-upstream-before-
       freeze rule')

Result:
  Before: 251 patches total, 96 orphans flagged
  After:  182 patches total, 27 orphans remaining
  Each removal = one less file the build-system mistakenly tried to
  apply to an already-fixed fork.

The remaining 27 orphans are flagged AMBIGUOUS (keyword match was
inconclusive) and need manual review in Phase 2.2. They are NOT
deleted by this commit.

Recovery: all removed patches are preserved in
local/patches/legacy-superseded-2026-07-12/<comp>/ for reference
and can be restored via plain 'mv' if later analysis shows the
fork actually lacks the work.
2026-07-12 01:51:03 +03:00
vasilito 0073f6e230 phase 1.6: sync doc version references from 0.1.0/0.2.5 to 0.3.1
The build system had multiple authoritative docs claiming 'Red Bear
OS 0.1.0 (baseline)' and 'branch 0.2.5' long after the working
branch advanced to 0.3.1. Operator confusion was inevitable:
- 'repo --version' showed 0.2.5 (root Cargo.toml drift, fixed G2)
- AGENTS.md said rust-toolchain = nightly-2025-10-03 (actual
  nightly-2026-05-24)
- local/AGENTS.md example versions all said 0.2.5 (should be 0.3.1)
- README.md and docs/* claimed 'baseline 0.1.0' on the current
  branch (which has 0.3.1 forks as the source of truth)

This commit syncs the docs to reality without rewriting historical
content where the 0.1.0 reference is genuinely about the legacy
release archive at sources/redbear-0.1.0/ (which DOES exist and
serves the release-mode fallback per BUILD-SYSTEM-SETUP).

The 0.1.0 release-archive references are preserved with explicit
'legacy' annotations because that archive IS the durable record
of the old overlay-patch approach and is used by
restore-sources.sh --release=0.1.0 in fallback build paths.

Updated across:
- AGENTS.md (root): toolchain, current baseline phrasing
- local/AGENTS.md: example versions 0.2.5->0.3.1, RELEASE MODEL
  clarified that current source-of-truth is local/sources/ forks
- README.md: branch refs 0.2.5->0.3.1
- docs/06-BUILD-SYSTEM-SETUP.md: baseline 0.1.0->0.3.1
- local/docs/UPSTREAM-SYNC-PROCEDURE.md: baseline clarified
- local/docs/LOCAL-FORK-SUPREMACY-POLICY.md: snapshot phrasing
- local/docs/CUB-PACKAGE-MANAGER.md: archive context clarified
2026-07-12 01:45:53 +03:00
vasilito 9a77de464a phase 1.4: extend sync-versions.sh — root Cargo.toml + Cargo.lock regen
Per Phase 0 audit findings (G1, G2), the build-system version sync
had two omissions that allowed drift to accumulate across branch
bumps:

1. G2: The root Cargo.toml's [package] version was outside the
   script's scope. During 0.3.0 -> 0.3.1 branch change, syncing
   Cat 1 + Cat 2 versions did not touch the cookbook crate itself,
   so 'repo --version' reported the wrong version. Fixed by adding
   Phase 0: Cookbook root Cargo.toml block that mirrors the Cat 1
   version assignment.

2. G1: After a branch bump, Cargo.lock files were not regenerated.
   Each Cat 2 fork's lockfile kept its previous +rb suffix even after
   the fork's Cargo.toml was updated. Fixed by adding Phase 3: a
   'cargo generate-lockfile' pass that runs in each fork and the
   root cookbook after version sync completes. The path-dep +
   [patch.crates-io] config in each fork ensures the right crates
   are pulled in; the script verifies each cargo generate-lockfile
   exit code.

New flags:
  --check       Verify only (no writes), exit 1 on drift
  --no-regen    Apply version sync, skip lockfile regen
  --regen-only  Skip version sync, only regen lockfiles
  (default)     Apply sync + regen lockfiles

After this commit, branch bump workflow is:
  ./local/scripts/sync-versions.sh
... and nothing else is needed for Cargo.lock freshness. The
script exits non-zero only if any 'cargo generate-lockfile' fails
in a fork, surfacing build breakage immediately.
2026-07-12 01:42:30 +03:00
vasilito 82894b10e9 phase 1.2: gitignore .redbear-recipe-bump cache (used by bump-graphics-recipes.sh)
The cache directory used by the recently-tracked bump-graphics-recipes.sh
contains upstream release-index HTML files fetched during bumps.
These are reproducible artifacts of the script run and should not be
committed to git.

The cache dir was previously unignored, leaving the 117KB cairo.html
example file untracked in the repo. Add it to .gitignore alongside
existing build-debris rules.
2026-07-12 01:37:19 +03:00
vasilito 4a37ae1a57 phase 1.2: move 137 legacy .patch symlinks out of path-source recipes
Per AGENTS.md § 'Local Fork Recipe Directories Must Not Carry Patch
Files', the symlinks under recipes/core/{base,kernel,relibc,
bootloader,installer}/ pointing at the canonical local/patches/<comp>/
patches were violations. The recipes use path = '...' source so the
cookbook would never apply these patches; the symlinks were a
navigation aid only.

This commit moves all 137 valid symlinks (and the redox.patch
counterparts) to local/docs/legacy-recipe-patches/<comp>/ with a
README explaining the rationale and pointing readers at the canonical
patch location.

The patches themselves (local/patches/<comp>/*.patch) are NOT
modified — they remain git-tracked at their canonical location.
Per AGENTS.md 'NEVER DELETE' policy the patches stay in their
canonical home; only the navigation aid symlinks are relocated.

Breakdown:
  base (61)         - legacy-recipe-patches/base/
  kernel (26)       - legacy-recipe-patches/kernel/
  relibc (46)       - legacy-recipe-patches/relibc/
  bootloader (3)    - legacy-recipe-patches/bootloader/
  installer (1)     - legacy-recipe-patches/installer/

After this commit, recipes/core/<comp>/.patch references all show
zero matches per AGENTS.md rule.
2026-07-12 01:35:58 +03:00
vasilito 9275126b37 phase 1.1: refresh gitlinks for 6 forks after Phase 0+1 work
After Phase 0 (Cargo.lock regen, version sync, fork verification) and
Phase 1.0A (orphan patch absorption commits), each affected fork
had new commits that the parent RedBear-OS index did not know
about. This caused persistent 'M local/sources/<fork>' entries in
'git status' (the M marker for submodule state divergence).

This commit refreshes the parent's gitlinks to each fork HEAD via
'git add <submodule-path>', which is the canonical way to record a
submodule update in the parent index.

Updated fork gitlinks (before -> after):
  base:         75f6cf90  -> 00b799d5  (Phase 1.0A patch recovery)
  bootloader:   9a12ee2e  -> 2f79630b  (Phase 0 Cargo.lock + version sync)
  installer:    04f80ba3  -> 8294ecbb  (Phase 0 Cargo.lock regen)
  kernel:       19b936ef  -> 0f3840a5  (Phase 1.0A patch recovery)
  relibc:       d60ba873  -> fa54b985  (Phase 1.0A patch recovery)
  userutils:    2bc1b8d5  -> 0dc0cb7   (Phase 0 Cargo.lock + version sync)

Unchanged (gitlink already matches HEAD):
  libredox:     6908adc9
  redoxfs:      b78a791e
  syscall:      6e4e5bdb

Per AGENTS.md 'BRANCH AND SUBMODULE POLICY' this commit is purely a
gitlink refresh after fork-side commits — it adds no new branches,
no new submodules, and makes no policy decisions.
2026-07-12 01:34:56 +03:00
vasilito b062cf43b7 Revert "phase 1.1: refresh gitlink SHAs for 9 submodules after Phase 0+1 work"
This reverts commit ba169e7e66.
2026-07-12 01:33:58 +03:00
vasilito ba169e7e66 phase 1.1: refresh gitlink SHAs for 9 submodules after Phase 0+1 work
After Phase 0+1 work committed Cargo.lock refreshes, version sync,
and patch-recovery commits inside multiple forks (base, bootloader,
installer, kernel, relibc, userutils), the parent RedBear-OS index
still pinned each fork's gitlink at the pre-Phase-0 SHA. This
caused persistent 'M local/sources/<fork>' entries in 'git status'.

This commit refreshes the parent's gitlinks to point at each fork's
actual HEAD, so:
  - Submodule status lines disappear
  - Anyone running 'git submodule update' gets the current state
  - CI tracking reflects the post-recovery fork source

Per AGENTS.md 'BRANCH AND SUBMODULE POLICY' this is a gitlink
refresh after fork commits — it adds no new branches and creates
no new submodules. The fork branches (submodule/<fork>, master,
0.3.1, etc.) are pre-existing.

Fork SHAs (parent-side) now recorded:
  base:         00b799d5
  bootloader:   2f79630b
  installer:    8294ecbb
  kernel:       0f3840a5
  libredox:     6908adc9
  redoxfs:      b78a791e
  relibc:       fa54b985
  syscall:      6e4e5bdb
  userutils:    0dc0cb73

Each gitlink was advanced by N commits (from 0 to 3) tracking the
intra-fork work done in Phase 0 (Cargo.lock regen) and Phase 1.0A
(patch recovery).
2026-07-12 01:33:23 +03:00
vasilito 50d54a2499 phase 1.0: wire patch-content check into preflight + add audit doc
1. local/scripts/build-preflight.sh — invoke verify-patch-content.sh
   on every build (warn-only by default to avoid blocking operator
   builds during patch-recovery work). REDBEAR_SKIP_PATCH_CONTENT_CHECK=1
   bypasses the check.

2. local/docs/PATCH-PRESERVATION-AUDIT-2026-07-12.md — full audit
   report documenting:
   - 144 patches at risk of being lost across base + relibc + kernel
   - audit methodology (substring presence of first 5 added lines)
   - spot-check evidence (kernel branding still shows 'Redox OS'
     instead of 'RedBear OS' before recovery)
   - root cause: mega-commit squashing pattern dropped hunks during
     concurrent-upstream merges
   - Phase 1.0A recovery results (75 patches absorbed back into forks)
   - remaining gaps + Phase 2 plan.
2026-07-12 01:31:39 +03:00
vasilito e4bb452d86 phase 1.0B: add verify-patch-content.{py,sh} — orphan-patch audit tool
Per the Phase 1.0 audit (local/docs/PATCH-PRESERVATION-AUDIT-2026-07-12.md)
no part of the build system was checking that patches listed in
local/patches/<comp>/ had actually been absorbed into the
local/sources/<comp>/ fork's working tree.

This commit adds a tool that audits every Cat 2 fork and reports any
patches whose content is not present in the fork HEAD. The tool is
located at local/scripts/verify-patch-content.{sh,py} and follows the
existing local/scripts/ convention (shell wrapper delegating to
Python implementation).

Audit method:
  1. For each .patch in local/patches/<comp>/:
     - Extract target file from ---/+++ headers
     - Extract first 5 added lines (+ markers)
     - Check substring presence in fork HEAD version
  2. If 0/5 added lines found, patch is 'orphaned'

Current state (after Phase 1.0A recovery):
  - 251 patches total, 155 preserved, 96 still orphaned
  - The remaining orphans are patches where the upstream file structure
    has shifted too far for patch(1) to apply — those need
    upstream-tracking upgrade, deferred to Phase 2.

Usage:
  ./local/scripts/verify-patch-content.sh                       (report)
  ./local/scripts/verify-patch-content.sh --strict             (exit 1 on orphans)
  ./local/scripts/verify-patch-content.sh base kernel          (specific forks)

Wired in via build-preflight.sh in the next commit (Phase 1.0B cont.).

This closes the 'silent patch loss' gap identified in the audit.
2026-07-12 01:31:03 +03:00
vasilito 1deaf0b240 phase 0: add COLLISION-DETECTION-STATUS.md audit
Honest documentation of the actual state of collision detection:
- Init-service path collisions: WORKING via lint-config
- Package-vs-config runtime collision detection: NOT implemented
  (no code anywhere emits the [COLLISION-ERROR] markers
   that validate-collision-log.sh looks for)
- Recipe installs manifest: limited utility because no recipe
  currently declares installs

Phase 1 follow-up: implement runtime collision detection in
local/sources/installer/src/ to match the broken AGENTS.md
promise (already updated in the prior commit).
2026-07-12 01:21:06 +03:00
vasilito 636f0d02d6 phase 0: remove self-referential symlink loops
1. DRIVER RECIPE LOOPS (G11 driver subset)
   Removed 4 self-referential symlinks:
   - local/recipes/drivers/ohcid/ohcid -> ...ohcid (loop)
   - local/recipes/drivers/ehcid/ehcid -> ...ehcid (loop)
   - local/recipes/drivers/uhcid/uhcid -> ...uhcid (loop)
   - local/recipes/drivers/usb-core/usb-core -> ...usb-core (loop)
   Inner symlinks pointing at own parent dir broke any
   recursive directory traversal. Recipe dirs themselves
   (Cargo.toml + recipe.toml + source/) are intact.

2. REDOX-SCHEME LOOP (G12)
   Removed self-referential symlink at:
   local/sources/redox-scheme/redox-scheme -> ...redox-scheme
   Inner-loop artifact; the real source is at dir root.
2026-07-12 01:20:33 +03:00
vasilito da60fd4f6d phase 0: cookbook version, TODO fallback, Cargo.lock drift, AGENTS.md honesty
Phase 0 stop-the-bleeding fixes:

1. ROOT COOKBOOK VERSION DRIFT (G2)
   Cargo.toml was at 0.2.5 while branch is 0.3.1. Now matches.
   Added inline comment explaining the sync-versions.sh invariant
   to prevent the next fork bump from re-introducing drift.

2. SILENT TODO FALLBACK (G3)
   src/cook/package.rs:199 used .unwrap_or("TODO".into()) which
   emitted literal "TODO" into pkgar metadata when a recipe had
   no parseable version. Now fails fast with a precise error
   message that names the offending recipe and suggests a fix.
   Replaces silent metadata lie with actionable diagnostic.

3. CARGO.LOCK DRIFT (G1)
   After 0.3.0 -> 0.3.1 fork version sync, four Cargo.lock files
   were regenerated to match the new +rb0.3.1 suffix:
   - root Cargo.lock
   - local/sources/libredox/Cargo.lock
   - local/sources/userutils/Cargo.lock
   - local/sources/base/Cargo.lock (also accumulated bytemuck
     and bytemuck_derive patch bumps as a side effect)
   - local/sources/bootloader/Cargo.lock
   - local/sources/installer/Cargo.lock
   Used 'cargo generate-lockfile' per fork with their path-dep
   + [patch.crates-io] config preserved. Verified each lockfile
   now contains the correct Cat 2 fork versions matching their
   Cargo.toml at +rb0.3.1.

4. BOOTLOADER VERSION OVERSIGHT
   local/sources/bootloader/Cargo.toml was still at
   1.0.0+rb0.3.0 after sync-versions.sh --check passed for
   everything else. Manual fix applied. Also regenerated its
   Cargo.lock to match.

5. COLLISION DETECTION HONESTY (G9)
   AGENTS.md and local/AGENTS.md claimed a CollisionTracker
   module existed in src/cook/collision.rs and was wired
   through the installer at runtime. A whole-tree search
   confirmed NO such code exists anywhere. Removed the false
   promises and linked to local/docs/COLLISION-DETECTION-STATUS.md
   which documents the actual current state (lint-config-only
   init-service detection works; general package-vs-config
   detection does NOT).

Verified:
  - bash -n on all touched scripts: clean
  - cargo check --bin repo: clean (redbear_cookbook v0.3.1 now)
  - sync-versions.sh --check: clean (75 Cat 1 + 10 Cat 2)
  - verify-fork-versions.sh: 1 pre-existing FAIL (bootloader
    fork genuinely diverges from upstream tag 1.0.0 — out of
    scope for Phase 0; documented for Phase 1 upgrade-forks work)
2026-07-12 01:20:21 +03:00
vasilito 79285e4ebf verify-fork-versions.sh: add per-fork upstream content fingerprint cache
When the upstream commit hash of the claimed upstream tag has not changed
since the last successful verify, reuse the cached file list instead of
re-cloning and re-hashing from scratch. This makes the canonical preflight
fast on the common case where upstream didn't move.

Cache is stored in .redbear-fork-verify/<fork>-<tag>.fingerprint. Touched
only after a successful full content diff, so cache corruption is detected
on the next run (commit hash mismatch triggers fresh clone).
2026-07-12 00:33:52 +03:00
vasilito 1b8fd21eba build-redbear.sh: re-enable overlay integrity check (was disabled for symlink corruption)
The verify-overlay-integrity.sh script is now active. It runs at the
start of canonical builds and auto-repairs via apply-patches.sh on
failure.

Restored missing symlinks for:
- recipes/core/base/redox.patch
- recipes/core/bootloader/redox.patch
- recipes/core/bootloader/P2-live-preload-guard.patch
- recipes/core/bootloader/P3-uefi-live-image-safe-read.patch
- recipes/wip/wayland/qt6-wayland-smoke (incorrect relative path)

Created empty stub at local/patches/base/redox.patch so the relibc/base
symlinks can be re-created by apply-patches.sh.

Overlay integrity now reports:
  365 recipe symlinks, 0 broken
  9 patch symlinks, 0 broken
  9 critical patches, 0 missing
  10 critical configs, 0 missing
2026-07-12 00:27:27 +03:00
vasilito 1c3c543ba1 graphics upgrade round 2 + relibc absorbed audit tool
Graphics package upgrades (canonical-version verified, downloaded fresh
tarballs from upstream, BLAKE3 hashes computed):
- meson         1.3.0   -> 1.8.3
- kf6-extra-cmake-modules 3.18.0 -> 4.0.3
- freetype2      2.13.3  -> 2.14.3
- glib          2.87.0  -> 2.89.1
- libxkbcommon  1.11.0  -> 1.13.2
- pango/redox.patch updated for 1.56.4
- cairo         symlinked local recipe (1.18.4)
- mesa          26.1.4 (target, recipe rebased)

Submodule pointer updates from prior rebase runs:
- base
- bootloader
- installer
- relibc

New: local/scripts/verify-absorbed-patches.sh — verifies which absorbed/
patches still apply against the current relibc source. Initial scan
shows 11 of 56 absorbed patches are still effective/merged-upstream;
45 are now BROKEN (line offsets diverged, mostly harmless; 0 missing).
This is a known risk where absorbed/ patches accumulate after rebases
and need periodic clean-up.
2026-07-12 00:19:30 +03:00
vasilito 2153bf5f6e build-system: add function-level fork verification + fix critical bugs
CRITICAL: Add verify-fork-functions.sh — detects silent upstream code loss
from bad merges that file-level verification cannot catch. This is the
verification that would have caught the kfdwrite drop bug.

Wire it into build-preflight.sh (pre-build gate) and upgrade-forks.sh
(post-upgrade gate with automatic rollback on failure).

Fix upgrade-forks.sh:
- Fetch failures now abort instead of being silently swallowed
- Backup branch names include fork name + PID to prevent collisions
- Post-upgrade verification runs verify-fork-functions.sh and rolls
  back if upstream functions are missing

Fix bump-fork.sh:
- Replace wrong 'git tag -e' with 'git rev-parse --verify refs/tags/'
- Clone failures now error explicitly instead of silent fallback
- Version sed uses proper regex escaping for + characters
- Atomic swap has rollback recovery if mv fails
- Instructions now mention fork-upstream-map.toml update

Fix sync-upstream.sh:
- Define PROJECT_ROOT before use (was crashing under set -u)

Fix build-preflight.sh:
- Add REDBEAR_SKIP_FUNCTION_CHECK gate for verify-fork-functions.sh

Kernel submodule pointer updated to 0.3.1 branch with kfdwrite restored.
2026-07-11 23:18:41 +03:00
vasilito 71baacb1e8 graphics/full stack sync: finalize local symlink targets + remaining version bumps
- sync local harfbuzz/pango recipes to latest
- keep cairo/freetype2/glib/libxkbcommon local fork symlinks active
- keep mesa on 26.1.4 local recipe path
- include latest KDE/Plasma app versions and recent media/lib updates
2026-07-11 17:50:21 +03:00
vasilito 9164a255dd mesa: adapt recipe to upstream 26.1.4 structure
- drop obsolete/unapplied Redox platform patches 03/06/07
- keep only patches that still apply cleanly (01/02/04/05)
- switch non-existent platform 'redox' to upstream-supported wayland + egl-native-platform=surfaceless
- replace removed gallium driver alias 'swrast' with softpipe,llvmpipe
2026-07-11 17:23:31 +03:00
vasilito a906c11c36 libs: SDL2_image 2.0.4→2.8.12, SDL2_ttf 2.0.15→2.24.0, SDL2_mixer 2.8.1→2.8.2
Massive version jumps for image and TTF — 4+ years of accumulated fixes.
Both had no BLAKE3 hash originally (untracked). All tarballs re-downloaded
from https://www.libsdl.org/release/ and hashes verified.
2026-07-11 17:03:54 +03:00
vasilito 7a6e897a8c mesa: 24.0.8 → 26.1.4 (tar-based, 4/7 patches applied, 3 need manual rebase)
Per user instruction — upgrade to latest. Redox mesa fork at redox-24.0
has no redox-26.0 branch; switched to tar-based upstream 26.1.4 with
Red Bear patches applied on top.

Patch dry-run results vs 26.1.4:
   02-gbm-dumb-prime-export.patch
   04-sys-ioccom-stub-header.patch
   05-vk-sync-wchar-include.patch
  🔴 01-virgl-redox-disk-cache.patch (hunk #1 FAIL at 1054)
  🔴 03-platform-redox-gpu-probe.patch (8 hunks ignored)
  🔴 06-redox-surface-image-fields.patch (hunk #1 FAIL at 333)
  🔴 07-wayland-scanner-env-override.patch (hunk #1 FAIL at 1992)

Patches 01,03,06,07 require manual rebase — documented in recipe comment.
Added mesa to apply-patches.sh graphics symlinks for local fork tracking.
2026-07-11 17:02:30 +03:00
vasilito 31a92b2f66 libs: freeciv 3.1.4→3.2.5, gstreamer 1.24.12→1.29.2, nettle 3.9.1→4.0
freeciv: latest stable release (game).
gstreamer: jumped 5 minor versions, needed for modern desktop audio/video
  features.
nettle: 4.0 is the latest (2024-11 release), includes security fixes.
2026-07-11 16:49:37 +03:00
vasilito f87bf22abb lib: libjpeg-turbo 3.1.0→3.2.0 (May 2025 release) 2026-07-11 16:23:34 +03:00
vasilito 6c30be9700 dev: lua54 5.4.7→5.4.8 2026-07-11 16:16:01 +03:00
vasilito 35325b9fae libs: libssh2 1.10.0→1.11.1 (security), ncdu 1.22→2.9.2 (security + features) 2026-07-11 16:14:16 +03:00
vasilito 2df98b27bf KDE Plasma upgrades: kirigami 6.10→6.28, plasma-framework 6.10→6.7.2, kglobalacceld 6.0→6.7.2, kde-cli-tools 6.3.4→6.7.2, plasma-desktop 6.3.4→6.7.2
All current per https://invent.kde.org/ tags (live verification).
Per user instruction: 6 months old is already old — these packages
were 1.5+ years stale against latest. All tarballs re-downloaded,
BLAKE3 hashes verified.
2026-07-11 16:11:41 +03:00
vasilito ffaf6befb5 active build: iperf3 3.20→3.21, rsync 3.4.1→3.4.4, git 2.13.1→2.55.0
iPerf3 3.21 is a bug fix release from July 2025.
rsync 3.4.4 is the latest 3.4.x maintenance release.
git 2.55.0 is the latest 2.55.x stable release, fixing 9+ years of CVEs
and bugs since the Red Bear build's 2.13.1 baseline. This is a security
critical upgrade.
2026-07-11 16:07:17 +03:00
vasilito 5474781a9b active build: bash 5.2.15 → 5.3 (latest stable) 2026-07-11 16:02:41 +03:00
vasilito 6a4af4b95b library upgrades: libffi 3.4.5→3.7.1, libarchive 3.6.2→3.8.8, libuv 1.51.0→1.52.1, libxml2 2.11.3→2.15.3
All tarballs re-downloaded from upstream mirrors, BLAKE3 hashes verified.
Continuing the comprehensive recipe walk per user instruction.
2026-07-11 15:59:18 +03:00
vasilito f28d633284 apply-patches.sh: symlink graphics libs to local forks (latest versions)
The 5 graphics libraries (freetype2, glib, harfbuzz, pango, cairo)
now use their local fork versions instead of the mainline
recipe versions:
- freetype2: 2.13.3 → 2.14.3
- glib: 2.87.0 → 2.89.1
- harfbuzz: 11.0.1 → 14.2.1
- pango: 1.56.3 → 1.56.4
- cairo: 1.18.4 (current)

Mainline recipe.toml files removed via symlink replacement.
Each local fork recipe tracks the latest stable release.
2026-07-11 15:37:03 +03:00
vasilito 344de21bb6 active build upgrades (Round 2 cont.): sed 4.4→4.10, meson 1.3→1.8.3, gettext 0.22→0.25.1, xz 5.2→5.8.1, zlib 1.3→1.3.1, file 5.46→5.47, patchelf 0.18→0.19.1
All tarballs re-downloaded from upstream mirrors, BLAKE3 hashes
verified against downloaded files. Per user request: walk through ALL
recipes, not just graphics. This is the active build pipeline batch.
2026-07-11 15:28:03 +03:00
vasilito b70f75b1e3 graphics packages: comprehensive version upgrades (Round 2)
KF6 frameworks: 44 packages 6.27.0 → 6.28.0
- Verified live upstream at https://download.kde.org/stable/frameworks/6.28/
- All tarballs re-downloaded, BLAKE3 hashes computed
- 39 auto-updated via script, 5 hand-fixed (kded6, notifyconfig,
  parts, pty, syntaxhighlighting) due to package-name variants

Local forks (CachyOS-stable):
- freetype2: 2.13.3 → 2.14.3
- libxkbcommon: 1.11.0 → 1.13.2
- glib: 2.87.0 → 2.89.1

Upstream recipes (gnome.org):
- harfbuzz: 11.0.1 → 14.2.1
- pango: 1.56.3 → 1.56.4

All tarballs re-downloaded from upstream mirrors, BLAKE3 hashes
verified against the downloaded files. Each recipe updated with
new tar URL + BLAKE3 hash.

This is the first batch of the Round-2 comprehensive upgrade.
cstdlib/fstring.h file 'tostring' recipe was already at 1.19.1
(was a 404 from cairographics.org, kept at 1.18.4). cairo recipe
was already at 1.18.4 (latest).

Build verification pending via build-redbear.sh. Per user
request, will continue to walk ALL recipes for outdated versions.
2026-07-11 15:10:43 +03:00
vasilito 8f655e757c kernel: debug markers 2026-07-11 14:38:52 +03:00
vasilito f114a3b3fb base: submodule pointer — bootstrap fix 2026-07-11 14:22:00 +03:00
vasilito f6f1dcb197 base: submodule pointer — bootstrap API adaptation 2026-07-11 14:13:51 +03:00
vasilito bb15b7b117 relibc: submodule pointer — float.h C11 macros 2026-07-11 13:57:04 +03:00
vasilito 5008627335 relibc: submodule pointer — unsafe fix 2026-07-11 13:48:03 +03:00
vasilito 0150e8bacb relibc: submodule pointer — getprogname() implementation 2026-07-11 13:42:07 +03:00
vasilito 05a003038d installer: submodule pointer — Cargo.lock fix 2026-07-11 13:17:35 +03:00
vasilito cb53247afa kernel: submodule pointer — merge-fix commit 2026-07-11 13:16:54 +03:00
vasilito edaebf9012 submodules: sync redoxfs Cargo.lock + deps 2026-07-11 12:44:40 +03:00
vasilito f70b482348 submodules: sync installer Cargo.lock 2026-07-11 12:29:24 +03:00
vasilito 27dd80b01f submodules: sync bootloader Cargo.lock 2026-07-11 12:19:53 +03:00
vasilito a72281c311 submodules: sync base Cargo.lock 2026-07-11 12:02:49 +03:00
vasilito 8f3a363a59 0.3.1: upgrade all forks to latest upstream
Fork upgrades:
- base: rebased to upstream/main (2551→0 behind), 251 files RB-patched
- kernel: merged upstream/master (7→0 behind), NUMA scheduler adopted
- installer: merged upstream/master (55→0 behind), path deps preserved
- libredox: reset to upstream/master (67→0 behind), RB path deps applied
- userutils: reset to upstream/master (200→0 behind), RB patches applied
- redoxfs: cherry-picked RB patches on upstream/master (4→0 behind)
- relibc: reset to upstream/master (3420→0 behind), fresh start with
  only path deps + version suffix. All previous RB patches for
  already-upstreamed functionality dropped per golden rule.
- syscall: already at 0 behind, version bumped
- bootloader: already upgraded in previous session

fork-upstream-map.toml: relibc version updated 0.6.0→0.2.5 (upstream
major version reset)
2026-07-11 11:46:20 +03:00
vasilito 2fb034fd62 submodules: sync 0.3.1 version bumps 2026-07-11 11:22:49 +03:00
vasilito 6e7c17d811 0.3.1: sync all Cat 1 + Cat 2 versions to +rb0.3.1 2026-07-11 11:21:22 +03:00
vasilito 4e88d1915f build system: add upstream drift detection and fork upgrade tooling
- check-fork-drift.sh: compares each submodule HEAD against upstream/master,
  reports behind/ahead counts, exits 1 if any fork exceeds threshold
- upgrade-forks.sh: fetches latest upstream, saves RB commits, resets to
  upstream, cherry-picks RB patches with conflict handling and backups
- build-preflight.sh: wired drift check into preflight (threshold=50,
  suppressible via REDBEAR_SKIP_DRIFT_CHECK=1)
- bootloader submodule pointer updated to latest upstream rebase
2026-07-11 11:20:29 +03:00
vasilito f2f6030dab bootloader: update recipe.toml for latest upstream Makefile format
Upstream bootloader Makefile uses BUILD=$(CURDIR) and auto-detects SOURCE.
Override BUILD to relative path so targets resolve correctly.
2026-07-11 10:51:38 +03:00
vasilito 068a1ca63e bootloader: rebase onto upstream 1.0.0, sync firmware-loader version
Bootloader fork rebase:
- Base changed from 0.1.0 pre-patched archive to upstream 1.0.0 tag (c7eeb9f)
- Applied 0001-redbear-local-forks.patch (Cargo.toml crate path redirects)
- Applied fix-uefi-alloc-panic.patch equivalents (4 panic!() -> graceful
  error handling in src/main.rs)
- Applied P5-live-preload-cap-1gib.patch (1 GiB cap on live image preload)
- Skipped: P0 GPT partition scan (requires new module + integration),
  P1 timeout/default-resolution, P2 live preload guard (subsumed by
  panic fixes + cap), P3 live image safe read, P4 large ISO boot,
  redox.patch — to be applied in dedicated rebase session.

firmware-loader/Cargo.toml: version 0.1.0 -> 0.3.0 (sync with other
Red Bear custom crates which are at 0.3.0).

fork-upstream-map.toml: bootloader back from PENDING_REBASE to 1.0.0
since the partial rebase matches upstream 1.0.0 content.

fork-upstream-map.toml: base restored to 'main' tracked (was correctly
tracked by build-redbear.sh).
2026-07-11 09:47:59 +03:00
2185 changed files with 265513 additions and 301415 deletions
+9
View File
@@ -28,6 +28,10 @@ recipes/**/source.tar.tmp
recipes/**/source.pre-preservation-test/ recipes/**/source.pre-preservation-test/
local/recipes/archives/uutils-tar/source local/recipes/archives/uutils-tar/source
local/recipes/dev/ninja-build/source local/recipes/dev/ninja-build/source
# Bump-recipe cache used by local/scripts/bump-graphics-recipes.sh.
# Cache is fetched from upstream release indexes; reproducible from script run.
.redbear-recipe-bump/
local/recipes/kde/sddm/source local/recipes/kde/sddm/source
local/recipes/kde/sddm/source-pristine local/recipes/kde/sddm/source-pristine
@@ -45,6 +49,11 @@ wget-log
local/reference/linux-*/ local/reference/linux-*/
local/reference/seL4/ local/reference/seL4/
# Per-fork upstream content fingerprint cache. Built by
# verify-fork-versions.sh on each preflight run; reproducible from
# a fork upgrade, not source of truth.
.redbear-fork-verify/
# Compiled objects # Compiled objects
*.o *.o
*.so *.so
+721
View File
@@ -0,0 +1,721 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html>
<head>
<title>Index of /releases</title>
</head>
<body>
<h1>Index of /releases</h1>
<table>
<tr><th><a href="?C=N;O=D">Name</a></th><th><a href="?C=M;O=A">Last modified</a></th><th><a href="?C=S;O=A">Size</a></th><th><a href="?C=D;O=A">Description</a></th></tr>
<tr><th colspan="4"><hr></th></tr>
<tr><td><a href="/">Parent Directory</a></td><td>&nbsp;</td><td align="right"> - </td><td>&nbsp;</td></tr>
<tr><td><a href="ChangeLog.cairo-1.14.4">ChangeLog.cairo-1.14.4</a></td><td align="right">2015-10-29 04:43 </td><td align="right"> 75K</td><td>&nbsp;</td></tr>
<tr><td><a href="ChangeLog.cairo-1.14.6">ChangeLog.cairo-1.14.6</a></td><td align="right">2015-12-11 08:47 </td><td align="right">1.3K</td><td>&nbsp;</td></tr>
<tr><td><a href="ChangeLog.cairo-1.14.8">ChangeLog.cairo-1.14.8</a></td><td align="right">2016-12-09 23:39 </td><td align="right">8.6K</td><td>&nbsp;</td></tr>
<tr><td><a href="ChangeLog.cairo-1.14.10">ChangeLog.cairo-1.14.10</a></td><td align="right">2017-06-15 22:52 </td><td align="right">9.2K</td><td>&nbsp;</td></tr>
<tr><td><a href="ChangeLog.cairo-1.14.12">ChangeLog.cairo-1.14.12</a></td><td align="right">2017-12-06 23:45 </td><td align="right">7.6K</td><td>&nbsp;</td></tr>
<tr><td><a href="ChangeLog.cairo-1.15.2">ChangeLog.cairo-1.15.2</a></td><td align="right">2015-12-11 08:54 </td><td align="right">120K</td><td>&nbsp;</td></tr>
<tr><td><a href="ChangeLog.cairo-1.15.4">ChangeLog.cairo-1.15.4</a></td><td align="right">2016-12-09 23:40 </td><td align="right"> 88K</td><td>&nbsp;</td></tr>
<tr><td><a href="ChangeLog.cairo-1.15.6">ChangeLog.cairo-1.15.6</a></td><td align="right">2017-06-13 22:22 </td><td align="right"> 18K</td><td>&nbsp;</td></tr>
<tr><td><a href="ChangeLog.cairo-1.15.10">ChangeLog.cairo-1.15.10</a></td><td align="right">2017-12-11 22:42 </td><td align="right"> 46K</td><td>&nbsp;</td></tr>
<tr><td><a href="ChangeLog.cairo-1.15.12">ChangeLog.cairo-1.15.12</a></td><td align="right">2018-04-12 02:46 </td><td align="right"> 82K</td><td>&nbsp;</td></tr>
<tr><td><a href="ChangeLog.cairo-1.15.14">ChangeLog.cairo-1.15.14</a></td><td align="right">2018-09-20 23:18 </td><td align="right"> 35K</td><td>&nbsp;</td></tr>
<tr><td><a href="ChangeLog.cairo-1.16.0">ChangeLog.cairo-1.16.0</a></td><td align="right">2018-10-19 20:33 </td><td align="right">370K</td><td>&nbsp;</td></tr>
<tr><td><a href="ChangeLog.cairo-1.17.2">ChangeLog.cairo-1.17.2</a></td><td align="right">2019-02-01 03:53 </td><td align="right"> 14K</td><td>&nbsp;</td></tr>
<tr><td><a href="LATEST-cairo-1.18.4">LATEST-cairo-1.18.4</a></td><td align="right">2025-03-08 12:38 </td><td align="right"> 31M</td><td>&nbsp;</td></tr>
<tr><td><a href="LATEST-cairomm-1.19.1">LATEST-cairomm-1.19.1</a></td><td align="right">2026-06-03 14:41 </td><td align="right">717K</td><td>&nbsp;</td></tr>
<tr><td><a href="LATEST-pixman-0.42.2">LATEST-pixman-0.42.2</a></td><td align="right">2022-11-02 17:30 </td><td align="right">937K</td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.0.0.tar.gz">cairo-1.0.0.tar.gz</a></td><td align="right">2005-08-24 16:39 </td><td align="right">1.4M</td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.0.0.tar.gz.sha1">cairo-1.0.0.tar.gz.sha1</a></td><td align="right">2005-08-24 16:39 </td><td align="right"> 61 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.0.0.tar.gz.sha1.asc">cairo-1.0.0.tar.gz.sha1.asc</a></td><td align="right">2005-08-24 16:39 </td><td align="right">307 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.0.2.tar.gz">cairo-1.0.2.tar.gz</a></td><td align="right">2005-10-04 01:11 </td><td align="right">1.4M</td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.0.2.tar.gz.sha1">cairo-1.0.2.tar.gz.sha1</a></td><td align="right">2005-10-04 01:11 </td><td align="right"> 61 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.0.2.tar.gz.sha1.asc">cairo-1.0.2.tar.gz.sha1.asc</a></td><td align="right">2005-10-04 01:11 </td><td align="right">307 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.0.4.tar.gz">cairo-1.0.4.tar.gz</a></td><td align="right">2006-03-15 19:13 </td><td align="right">1.4M</td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.0.4.tar.gz.sha1">cairo-1.0.4.tar.gz.sha1</a></td><td align="right">2006-03-15 19:13 </td><td align="right"> 61 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.0.4.tar.gz.sha1.asc">cairo-1.0.4.tar.gz.sha1.asc</a></td><td align="right">2006-03-15 19:13 </td><td align="right">309 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.2.0.tar.gz">cairo-1.2.0.tar.gz</a></td><td align="right">2006-07-01 01:44 </td><td align="right">2.5M</td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.2.0.tar.gz.sha1">cairo-1.2.0.tar.gz.sha1</a></td><td align="right">2006-07-01 01:44 </td><td align="right"> 61 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.2.0.tar.gz.sha1.asc">cairo-1.2.0.tar.gz.sha1.asc</a></td><td align="right">2006-07-01 01:44 </td><td align="right">307 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.2.2.tar.gz">cairo-1.2.2.tar.gz</a></td><td align="right">2006-08-08 23:21 </td><td align="right">2.7M</td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.2.2.tar.gz.sha1">cairo-1.2.2.tar.gz.sha1</a></td><td align="right">2006-08-08 23:21 </td><td align="right"> 61 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.2.2.tar.gz.sha1.asc">cairo-1.2.2.tar.gz.sha1.asc</a></td><td align="right">2006-08-08 23:21 </td><td align="right">303 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.2.4.tar.gz">cairo-1.2.4.tar.gz</a></td><td align="right">2006-08-19 01:28 </td><td align="right">2.7M</td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.2.4.tar.gz.sha1">cairo-1.2.4.tar.gz.sha1</a></td><td align="right">2006-08-19 01:28 </td><td align="right"> 61 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.2.4.tar.gz.sha1.asc">cairo-1.2.4.tar.gz.sha1.asc</a></td><td align="right">2006-08-19 01:28 </td><td align="right">307 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.2.6.tar.gz">cairo-1.2.6.tar.gz</a></td><td align="right">2006-11-03 01:07 </td><td align="right">2.8M</td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.2.6.tar.gz.sha1">cairo-1.2.6.tar.gz.sha1</a></td><td align="right">2006-11-03 01:07 </td><td align="right"> 61 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.2.6.tar.gz.sha1.asc">cairo-1.2.6.tar.gz.sha1.asc</a></td><td align="right">2006-11-03 01:07 </td><td align="right">307 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.4.0.tar.gz">cairo-1.4.0.tar.gz</a></td><td align="right">2007-03-06 09:38 </td><td align="right">2.9M</td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.4.0.tar.gz.sha1">cairo-1.4.0.tar.gz.sha1</a></td><td align="right">2007-03-06 09:38 </td><td align="right"> 61 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.4.0.tar.gz.sha1.asc">cairo-1.4.0.tar.gz.sha1.asc</a></td><td align="right">2007-03-06 09:38 </td><td align="right">307 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.4.2.tar.gz">cairo-1.4.2.tar.gz</a></td><td align="right">2007-03-20 06:56 </td><td align="right">2.9M</td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.4.2.tar.gz.sha1">cairo-1.4.2.tar.gz.sha1</a></td><td align="right">2007-03-20 06:56 </td><td align="right"> 61 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.4.2.tar.gz.sha1.asc">cairo-1.4.2.tar.gz.sha1.asc</a></td><td align="right">2007-03-20 06:56 </td><td align="right">307 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.4.4.tar.gz">cairo-1.4.4.tar.gz</a></td><td align="right">2007-04-14 00:45 </td><td align="right">3.0M</td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.4.4.tar.gz.sha1">cairo-1.4.4.tar.gz.sha1</a></td><td align="right">2007-04-14 00:45 </td><td align="right"> 61 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.4.4.tar.gz.sha1.asc">cairo-1.4.4.tar.gz.sha1.asc</a></td><td align="right">2007-04-14 00:45 </td><td align="right">307 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.4.6.tar.gz">cairo-1.4.6.tar.gz</a></td><td align="right">2007-05-01 20:43 </td><td align="right">3.0M</td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.4.6.tar.gz.sha1">cairo-1.4.6.tar.gz.sha1</a></td><td align="right">2007-05-01 20:43 </td><td align="right"> 61 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.4.6.tar.gz.sha1.asc">cairo-1.4.6.tar.gz.sha1.asc</a></td><td align="right">2007-05-01 20:43 </td><td align="right">307 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.4.8.tar.gz">cairo-1.4.8.tar.gz</a></td><td align="right">2007-06-08 23:08 </td><td align="right">3.1M</td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.4.8.tar.gz.sha1">cairo-1.4.8.tar.gz.sha1</a></td><td align="right">2007-06-08 23:08 </td><td align="right"> 61 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.4.8.tar.gz.sha1.asc">cairo-1.4.8.tar.gz.sha1.asc</a></td><td align="right">2007-06-08 23:08 </td><td align="right">307 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.4.10.tar.gz">cairo-1.4.10.tar.gz</a></td><td align="right">2007-06-27 21:40 </td><td align="right">3.1M</td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.4.10.tar.gz.sha1">cairo-1.4.10.tar.gz.sha1</a></td><td align="right">2007-06-27 21:40 </td><td align="right"> 62 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.4.10.tar.gz.sha1.asc">cairo-1.4.10.tar.gz.sha1.asc</a></td><td align="right">2007-06-27 21:40 </td><td align="right">307 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.4.12.tar.gz">cairo-1.4.12.tar.gz</a></td><td align="right">2007-11-27 06:39 </td><td align="right">3.1M</td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.4.12.tar.gz.sha1">cairo-1.4.12.tar.gz.sha1</a></td><td align="right">2007-11-27 06:39 </td><td align="right"> 62 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.4.12.tar.gz.sha1.asc">cairo-1.4.12.tar.gz.sha1.asc</a></td><td align="right">2007-11-27 06:39 </td><td align="right">307 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.4.14.tar.gz">cairo-1.4.14.tar.gz</a></td><td align="right">2008-01-15 00:40 </td><td align="right">3.1M</td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.4.14.tar.gz.sha1">cairo-1.4.14.tar.gz.sha1</a></td><td align="right">2008-01-15 00:40 </td><td align="right"> 62 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.4.14.tar.gz.sha1.asc">cairo-1.4.14.tar.gz.sha1.asc</a></td><td align="right">2008-01-15 00:40 </td><td align="right">307 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.6.0.tar.gz">cairo-1.6.0.tar.gz</a></td><td align="right">2008-04-11 00:48 </td><td align="right">4.8M</td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.6.0.tar.gz.sha1">cairo-1.6.0.tar.gz.sha1</a></td><td align="right">2008-04-11 00:48 </td><td align="right"> 61 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.6.0.tar.gz.sha1.asc">cairo-1.6.0.tar.gz.sha1.asc</a></td><td align="right">2008-04-11 00:48 </td><td align="right">307 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.6.2.tar.gz">cairo-1.6.2.tar.gz</a></td><td align="right">2008-04-11 17:04 </td><td align="right">4.8M</td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.6.2.tar.gz.sha1">cairo-1.6.2.tar.gz.sha1</a></td><td align="right">2008-04-11 17:04 </td><td align="right"> 61 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.6.2.tar.gz.sha1.asc">cairo-1.6.2.tar.gz.sha1.asc</a></td><td align="right">2008-04-11 17:04 </td><td align="right">307 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.6.4.tar.gz">cairo-1.6.4.tar.gz</a></td><td align="right">2008-04-11 21:45 </td><td align="right">4.8M</td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.6.4.tar.gz.sha1">cairo-1.6.4.tar.gz.sha1</a></td><td align="right">2008-04-11 21:45 </td><td align="right"> 61 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.6.4.tar.gz.sha1.asc">cairo-1.6.4.tar.gz.sha1.asc</a></td><td align="right">2008-04-11 21:45 </td><td align="right">307 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.8.0.tar.gz">cairo-1.8.0.tar.gz</a></td><td align="right">2008-09-25 23:05 </td><td align="right">5.4M</td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.8.0.tar.gz.sha1">cairo-1.8.0.tar.gz.sha1</a></td><td align="right">2008-09-25 23:05 </td><td align="right"> 61 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.8.0.tar.gz.sha1.asc">cairo-1.8.0.tar.gz.sha1.asc</a></td><td align="right">2008-09-25 23:05 </td><td align="right">307 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.8.2.tar.gz">cairo-1.8.2.tar.gz</a></td><td align="right">2008-10-30 15:19 </td><td align="right">6.8M</td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.8.2.tar.gz.sha1">cairo-1.8.2.tar.gz.sha1</a></td><td align="right">2008-10-30 15:19 </td><td align="right"> 61 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.8.2.tar.gz.sha1.asc">cairo-1.8.2.tar.gz.sha1.asc</a></td><td align="right">2008-10-30 15:19 </td><td align="right">307 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.8.4.tar.gz">cairo-1.8.4.tar.gz</a></td><td align="right">2008-11-14 11:42 </td><td align="right">6.7M</td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.8.4.tar.gz.sha1">cairo-1.8.4.tar.gz.sha1</a></td><td align="right">2008-11-14 11:42 </td><td align="right"> 61 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.8.4.tar.gz.sha1.asc">cairo-1.8.4.tar.gz.sha1.asc</a></td><td align="right">2008-11-14 11:42 </td><td align="right">307 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.8.6.tar.gz">cairo-1.8.6.tar.gz</a></td><td align="right">2008-12-14 16:32 </td><td align="right">6.3M</td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.8.6.tar.gz.sha1">cairo-1.8.6.tar.gz.sha1</a></td><td align="right">2008-12-14 16:32 </td><td align="right"> 61 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.8.6.tar.gz.sha1.asc">cairo-1.8.6.tar.gz.sha1.asc</a></td><td align="right">2008-12-14 16:32 </td><td align="right">315 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.8.8.tar.gz">cairo-1.8.8.tar.gz</a></td><td align="right">2009-06-16 13:07 </td><td align="right">6.3M</td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.8.8.tar.gz.sha1">cairo-1.8.8.tar.gz.sha1</a></td><td align="right">2009-06-16 13:07 </td><td align="right"> 61 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.8.8.tar.gz.sha1.asc">cairo-1.8.8.tar.gz.sha1.asc</a></td><td align="right">2009-06-16 13:07 </td><td align="right">315 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.8.10.tar.gz">cairo-1.8.10.tar.gz</a></td><td align="right">2010-02-20 00:29 </td><td align="right">6.8M</td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.8.10.tar.gz.sha1">cairo-1.8.10.tar.gz.sha1</a></td><td align="right">2010-02-20 00:29 </td><td align="right"> 62 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.8.10.tar.gz.sha1.asc">cairo-1.8.10.tar.gz.sha1.asc</a></td><td align="right">2010-02-20 00:29 </td><td align="right">308 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.10.0.tar.gz">cairo-1.10.0.tar.gz</a></td><td align="right">2010-09-06 17:39 </td><td align="right"> 23M</td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.10.0.tar.gz.sha1">cairo-1.10.0.tar.gz.sha1</a></td><td align="right">2010-09-06 17:39 </td><td align="right"> 62 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.10.0.tar.gz.sha1.asc">cairo-1.10.0.tar.gz.sha1.asc</a></td><td align="right">2010-09-06 17:39 </td><td align="right">320 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.10.2.tar.gz">cairo-1.10.2.tar.gz</a></td><td align="right">2010-12-25 23:03 </td><td align="right"> 22M</td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.10.2.tar.gz.sha1">cairo-1.10.2.tar.gz.sha1</a></td><td align="right">2010-12-25 23:03 </td><td align="right"> 62 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.10.2.tar.gz.sha1.asc">cairo-1.10.2.tar.gz.sha1.asc</a></td><td align="right">2010-12-25 23:03 </td><td align="right">320 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.12.0.tar.gz">cairo-1.12.0.tar.gz</a></td><td align="right">2012-03-23 20:15 </td><td align="right"> 60M</td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.12.0.tar.gz.sha1">cairo-1.12.0.tar.gz.sha1</a></td><td align="right">2012-03-23 20:15 </td><td align="right"> 62 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.12.0.tar.gz.sha1.asc">cairo-1.12.0.tar.gz.sha1.asc</a></td><td align="right">2012-03-23 20:15 </td><td align="right">320 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.12.2.tar.xz">cairo-1.12.2.tar.xz</a></td><td align="right">2012-04-29 19:52 </td><td align="right"> 40M</td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.12.2.tar.xz.sha1">cairo-1.12.2.tar.xz.sha1</a></td><td align="right">2012-04-29 19:52 </td><td align="right"> 62 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.12.2.tar.xz.sha1.asc">cairo-1.12.2.tar.xz.sha1.asc</a></td><td align="right">2012-04-29 19:52 </td><td align="right">320 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.12.4.tar.xz">cairo-1.12.4.tar.xz</a></td><td align="right">2012-10-05 16:20 </td><td align="right"> 40M</td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.12.4.tar.xz.sha1">cairo-1.12.4.tar.xz.sha1</a></td><td align="right">2012-10-05 16:20 </td><td align="right"> 62 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.12.4.tar.xz.sha1.asc">cairo-1.12.4.tar.xz.sha1.asc</a></td><td align="right">2012-10-05 16:20 </td><td align="right">320 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.12.6.tar.xz">cairo-1.12.6.tar.xz</a></td><td align="right">2012-10-22 12:44 </td><td align="right"> 40M</td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.12.6.tar.xz.sha1">cairo-1.12.6.tar.xz.sha1</a></td><td align="right">2012-10-22 12:44 </td><td align="right"> 62 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.12.6.tar.xz.sha1.asc">cairo-1.12.6.tar.xz.sha1.asc</a></td><td align="right">2012-10-22 12:44 </td><td align="right">316 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.12.8.tar.xz">cairo-1.12.8.tar.xz</a></td><td align="right">2012-11-04 15:23 </td><td align="right"> 40M</td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.12.8.tar.xz.sha1">cairo-1.12.8.tar.xz.sha1</a></td><td align="right">2012-11-04 15:23 </td><td align="right"> 62 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.12.8.tar.xz.sha1.asc">cairo-1.12.8.tar.xz.sha1.asc</a></td><td align="right">2012-11-04 15:23 </td><td align="right">316 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.12.10.tar.xz">cairo-1.12.10.tar.xz</a></td><td align="right">2013-01-16 20:54 </td><td align="right"> 40M</td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.12.10.tar.xz.sha1">cairo-1.12.10.tar.xz.sha1</a></td><td align="right">2013-01-16 20:54 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.12.10.tar.xz.sha1.asc">cairo-1.12.10.tar.xz.sha1.asc</a></td><td align="right">2013-01-16 20:54 </td><td align="right">320 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.12.12.tar.xz">cairo-1.12.12.tar.xz</a></td><td align="right">2013-01-31 16:17 </td><td align="right"> 40M</td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.12.12.tar.xz.sha1">cairo-1.12.12.tar.xz.sha1</a></td><td align="right">2013-01-31 16:17 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.12.12.tar.xz.sha1.asc">cairo-1.12.12.tar.xz.sha1.asc</a></td><td align="right">2013-01-31 16:17 </td><td align="right">316 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.12.14.tar.xz">cairo-1.12.14.tar.xz</a></td><td align="right">2013-02-10 14:10 </td><td align="right"> 40M</td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.12.14.tar.xz.sha1">cairo-1.12.14.tar.xz.sha1</a></td><td align="right">2013-02-10 14:10 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.12.14.tar.xz.sha1.asc">cairo-1.12.14.tar.xz.sha1.asc</a></td><td align="right">2013-02-10 14:10 </td><td align="right">320 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.12.16.tar.xz">cairo-1.12.16.tar.xz</a></td><td align="right">2013-08-26 17:43 </td><td align="right"> 34M</td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.12.16.tar.xz.sha1">cairo-1.12.16.tar.xz.sha1</a></td><td align="right">2013-08-26 17:43 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.12.16.tar.xz.sha1.asc">cairo-1.12.16.tar.xz.sha1.asc</a></td><td align="right">2013-08-26 17:43 </td><td align="right">320 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.12.18.tar.xz">cairo-1.12.18.tar.xz</a></td><td align="right">2014-11-07 02:04 </td><td align="right"> 37M</td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.12.18.tar.xz.sha1">cairo-1.12.18.tar.xz.sha1</a></td><td align="right">2014-11-07 02:04 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.12.18.tar.xz.sha1.asc">cairo-1.12.18.tar.xz.sha1.asc</a></td><td align="right">2014-11-07 02:04 </td><td align="right">320 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.14.0.tar.xz">cairo-1.14.0.tar.xz</a></td><td align="right">2014-10-14 02:39 </td><td align="right"> 35M</td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.14.0.tar.xz.sha1">cairo-1.14.0.tar.xz.sha1</a></td><td align="right">2014-10-14 02:39 </td><td align="right"> 62 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.14.0.tar.xz.sha1.asc">cairo-1.14.0.tar.xz.sha1.asc</a></td><td align="right">2014-10-14 02:39 </td><td align="right">320 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.14.2.tar.xz">cairo-1.14.2.tar.xz</a></td><td align="right">2015-03-11 02:06 </td><td align="right"> 34M</td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.14.2.tar.xz.sha1">cairo-1.14.2.tar.xz.sha1</a></td><td align="right">2015-03-11 02:06 </td><td align="right"> 62 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.14.2.tar.xz.sha1.asc">cairo-1.14.2.tar.xz.sha1.asc</a></td><td align="right">2015-03-11 02:06 </td><td align="right">303 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.14.4.tar.xz">cairo-1.14.4.tar.xz</a></td><td align="right">2015-10-29 03:27 </td><td align="right"> 34M</td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.14.4.tar.xz.sha1">cairo-1.14.4.tar.xz.sha1</a></td><td align="right">2015-10-29 03:27 </td><td align="right"> 62 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.14.4.tar.xz.sha1.asc">cairo-1.14.4.tar.xz.sha1.asc</a></td><td align="right">2015-10-29 03:27 </td><td align="right">303 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.14.6.tar.xz">cairo-1.14.6.tar.xz</a></td><td align="right">2015-12-09 20:48 </td><td align="right"> 34M</td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.14.6.tar.xz.sha1">cairo-1.14.6.tar.xz.sha1</a></td><td align="right">2015-12-09 20:48 </td><td align="right"> 62 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.14.6.tar.xz.sha1.asc">cairo-1.14.6.tar.xz.sha1.asc</a></td><td align="right">2015-12-09 20:48 </td><td align="right">303 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.14.8.tar.xz">cairo-1.14.8.tar.xz</a></td><td align="right">2016-12-08 05:01 </td><td align="right"> 34M</td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.14.8.tar.xz.sha1">cairo-1.14.8.tar.xz.sha1</a></td><td align="right">2016-12-08 05:01 </td><td align="right"> 62 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.14.8.tar.xz.sha1.asc">cairo-1.14.8.tar.xz.sha1.asc</a></td><td align="right">2016-12-08 05:01 </td><td align="right">303 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.14.10.tar.xz">cairo-1.14.10.tar.xz</a></td><td align="right">2017-06-15 22:45 </td><td align="right"> 35M</td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.14.10.tar.xz.sha1">cairo-1.14.10.tar.xz.sha1</a></td><td align="right">2017-06-15 22:45 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.14.10.tar.xz.sha1.asc">cairo-1.14.10.tar.xz.sha1.asc</a></td><td align="right">2017-06-15 22:45 </td><td align="right">303 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.14.12.tar.xz">cairo-1.14.12.tar.xz</a></td><td align="right">2017-12-06 23:08 </td><td align="right"> 35M</td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.14.12.tar.xz.sha1">cairo-1.14.12.tar.xz.sha1</a></td><td align="right">2017-12-06 23:08 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.14.12.tar.xz.sha1.asc">cairo-1.14.12.tar.xz.sha1.asc</a></td><td align="right">2017-12-06 23:08 </td><td align="right">303 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.16.0.tar.xz">cairo-1.16.0.tar.xz</a></td><td align="right">2018-10-19 20:26 </td><td align="right"> 40M</td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.16.0.tar.xz.sha1">cairo-1.16.0.tar.xz.sha1</a></td><td align="right">2018-10-19 20:26 </td><td align="right"> 62 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.16.0.tar.xz.sha1.asc">cairo-1.16.0.tar.xz.sha1.asc</a></td><td align="right">2018-10-19 20:26 </td><td align="right">305 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.18.0.tar.xz">cairo-1.18.0.tar.xz</a></td><td align="right">2023-09-23 14:56 </td><td align="right"> 32M</td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.18.0.tar.xz.sha256sum">cairo-1.18.0.tar.xz.sha256sum</a></td><td align="right">2023-09-23 14:56 </td><td align="right"> 86 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.18.0.tar.xz.sha256sum.asc">cairo-1.18.0.tar.xz.sha256sum.asc</a></td><td align="right">2023-09-23 15:22 </td><td align="right">1.0K</td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.18.2.tar.xz">cairo-1.18.2.tar.xz</a></td><td align="right">2024-09-01 14:07 </td><td align="right"> 31M</td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.18.2.tar.xz.sha256sum">cairo-1.18.2.tar.xz.sha256sum</a></td><td align="right">2024-09-01 14:10 </td><td align="right"> 86 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.18.2.tar.xz.sha256sum.asc">cairo-1.18.2.tar.xz.sha256sum.asc</a></td><td align="right">2024-09-01 14:11 </td><td align="right">1.0K</td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.18.4.tar.xz">cairo-1.18.4.tar.xz</a></td><td align="right">2025-03-08 12:38 </td><td align="right"> 31M</td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.18.4.tar.xz.sha256sum">cairo-1.18.4.tar.xz.sha256sum</a></td><td align="right">2025-03-08 12:38 </td><td align="right"> 86 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-1.18.4.tar.xz.sha256sum.asc">cairo-1.18.4.tar.xz.sha256sum.asc</a></td><td align="right">2025-03-08 12:39 </td><td align="right">1.0K</td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-5c-1.1.tar.gz">cairo-5c-1.1.tar.gz</a></td><td align="right">2008-01-14 06:06 </td><td align="right">400K</td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-5c-1.2.tar.gz">cairo-5c-1.2.tar.gz</a></td><td align="right">2008-01-26 03:25 </td><td align="right">410K</td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-5c-1.2.tar.gz.sha1">cairo-5c-1.2.tar.gz.sha1</a></td><td align="right">2008-01-26 03:25 </td><td align="right"> 44 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-5c-1.2.tar.gz.sha1.asc">cairo-5c-1.2.tar.gz.sha1.asc</a></td><td align="right">2008-01-26 03:25 </td><td align="right">307 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-5c-1.5.tar.gz">cairo-5c-1.5.tar.gz</a></td><td align="right">2012-02-29 09:52 </td><td align="right">418K</td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-5c-1.5.tar.gz.sha1">cairo-5c-1.5.tar.gz.sha1</a></td><td align="right">2012-02-29 09:52 </td><td align="right"> 44 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-5c-1.5.tar.gz.sha1.asc">cairo-5c-1.5.tar.gz.sha1.asc</a></td><td align="right">2012-02-29 09:52 </td><td align="right">958 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-5c-1.15.tar.gz">cairo-5c-1.15.tar.gz</a></td><td align="right">2018-10-04 22:36 </td><td align="right">477K</td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-5c-1.15.tar.gz.sha1">cairo-5c-1.15.tar.gz.sha1</a></td><td align="right">2018-10-04 22:36 </td><td align="right"> 44 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-5c-1.15.tar.gz.sha1.asc">cairo-5c-1.15.tar.gz.sha1.asc</a></td><td align="right">2018-10-04 22:36 </td><td align="right">963 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-5c-1.20.tar.gz">cairo-5c-1.20.tar.gz</a></td><td align="right">2019-06-08 23:27 </td><td align="right">478K</td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-5c-1.20.tar.gz.sha1">cairo-5c-1.20.tar.gz.sha1</a></td><td align="right">2019-06-08 23:27 </td><td align="right"> 44 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairo-5c-1.20.tar.gz.sha1.asc">cairo-5c-1.20.tar.gz.sha1.asc</a></td><td align="right">2019-06-08 23:27 </td><td align="right">963 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-0.2.0.tar.gz">cairomm-0.2.0.tar.gz</a></td><td align="right">2005-12-02 16:08 </td><td align="right">314K</td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-0.2.0.tar.gz.sha1">cairomm-0.2.0.tar.gz.sha1</a></td><td align="right">2005-12-02 16:08 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-0.2.0.tar.gz.sha1.asc">cairomm-0.2.0.tar.gz.sha1.asc</a></td><td align="right">2005-12-02 16:08 </td><td align="right">311 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-0.3.0.tar.gz">cairomm-0.3.0.tar.gz</a></td><td align="right">2005-12-13 13:29 </td><td align="right">315K</td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-0.3.0.tar.gz.sha1">cairomm-0.3.0.tar.gz.sha1</a></td><td align="right">2005-12-13 13:29 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-0.3.0.tar.gz.sha1.asc">cairomm-0.3.0.tar.gz.sha1.asc</a></td><td align="right">2005-12-13 13:29 </td><td align="right">311 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-0.4.0.tar.gz">cairomm-0.4.0.tar.gz</a></td><td align="right">2005-12-23 15:17 </td><td align="right">318K</td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-0.4.0.tar.gz.sha1">cairomm-0.4.0.tar.gz.sha1</a></td><td align="right">2005-12-23 15:17 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-0.4.0.tar.gz.sha1.asc">cairomm-0.4.0.tar.gz.sha1.asc</a></td><td align="right">2005-12-23 15:17 </td><td align="right">311 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-0.5.0.tar.gz">cairomm-0.5.0.tar.gz</a></td><td align="right">2006-02-09 18:48 </td><td align="right">418K</td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-0.5.0.tar.gz.sha1">cairomm-0.5.0.tar.gz.sha1</a></td><td align="right">2006-02-09 18:48 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-0.5.0.tar.gz.sha1.asc">cairomm-0.5.0.tar.gz.sha1.asc</a></td><td align="right">2006-02-09 18:48 </td><td align="right">311 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-0.6.0.tar.gz">cairomm-0.6.0.tar.gz</a></td><td align="right">2006-04-05 01:54 </td><td align="right">432K</td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-0.6.0.tar.gz.sha1">cairomm-0.6.0.tar.gz.sha1</a></td><td align="right">2006-04-05 01:54 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-0.6.0.tar.gz.sha1.asc">cairomm-0.6.0.tar.gz.sha1.asc</a></td><td align="right">2006-04-05 01:54 </td><td align="right">311 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.2.0.tar.gz">cairomm-1.2.0.tar.gz</a></td><td align="right">2006-08-20 17:24 </td><td align="right">569K</td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.2.0.tar.gz.sha1">cairomm-1.2.0.tar.gz.sha1</a></td><td align="right">2006-08-20 17:24 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.2.0.tar.gz.sha1.asc">cairomm-1.2.0.tar.gz.sha1.asc</a></td><td align="right">2006-08-20 17:24 </td><td align="right">313 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.2.2.tar.gz">cairomm-1.2.2.tar.gz</a></td><td align="right">2006-08-21 19:19 </td><td align="right">569K</td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.2.2.tar.gz.sha1">cairomm-1.2.2.tar.gz.sha1</a></td><td align="right">2006-08-21 19:19 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.2.2.tar.gz.sha1.asc">cairomm-1.2.2.tar.gz.sha1.asc</a></td><td align="right">2006-08-21 19:19 </td><td align="right">309 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.2.4.tar.gz">cairomm-1.2.4.tar.gz</a></td><td align="right">2007-01-18 02:00 </td><td align="right">567K</td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.2.4.tar.gz.sha1">cairomm-1.2.4.tar.gz.sha1</a></td><td align="right">2007-01-18 02:00 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.2.4.tar.gz.sha1.asc">cairomm-1.2.4.tar.gz.sha1.asc</a></td><td align="right">2007-01-18 02:00 </td><td align="right">313 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.4.0.tar.gz">cairomm-1.4.0.tar.gz</a></td><td align="right">2007-07-12 16:45 </td><td align="right">611K</td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.4.0.tar.gz.sha1">cairomm-1.4.0.tar.gz.sha1</a></td><td align="right">2007-07-12 16:45 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.4.0.tar.gz.sha1.asc">cairomm-1.4.0.tar.gz.sha1.asc</a></td><td align="right">2007-07-12 16:45 </td><td align="right">311 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.4.2.tar.gz">cairomm-1.4.2.tar.gz</a></td><td align="right">2007-07-14 19:04 </td><td align="right">612K</td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.4.2.tar.gz.sha1">cairomm-1.4.2.tar.gz.sha1</a></td><td align="right">2007-07-14 19:04 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.4.2.tar.gz.sha1.asc">cairomm-1.4.2.tar.gz.sha1.asc</a></td><td align="right">2007-07-14 19:04 </td><td align="right">311 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.4.4.tar.gz">cairomm-1.4.4.tar.gz</a></td><td align="right">2007-07-29 19:19 </td><td align="right">662K</td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.4.4.tar.gz.sha1">cairomm-1.4.4.tar.gz.sha1</a></td><td align="right">2007-07-29 19:19 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.4.4.tar.gz.sha1.asc">cairomm-1.4.4.tar.gz.sha1.asc</a></td><td align="right">2007-07-29 19:19 </td><td align="right">307 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.4.6.tar.gz">cairomm-1.4.6.tar.gz</a></td><td align="right">2007-11-11 02:04 </td><td align="right">770K</td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.4.6.tar.gz.sha1">cairomm-1.4.6.tar.gz.sha1</a></td><td align="right">2007-11-11 02:04 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.4.6.tar.gz.sha1.asc">cairomm-1.4.6.tar.gz.sha1.asc</a></td><td align="right">2007-11-11 02:04 </td><td align="right">311 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.4.8.tar.gz">cairomm-1.4.8.tar.gz</a></td><td align="right">2008-03-11 03:32 </td><td align="right">768K</td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.4.8.tar.gz.sha1">cairomm-1.4.8.tar.gz.sha1</a></td><td align="right">2008-03-11 03:32 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.4.8.tar.gz.sha1.asc">cairomm-1.4.8.tar.gz.sha1.asc</a></td><td align="right">2008-03-11 03:32 </td><td align="right">311 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.5.0.tar.gz">cairomm-1.5.0.tar.gz</a></td><td align="right">2008-03-11 04:06 </td><td align="right">777K</td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.5.0.tar.gz.sha1">cairomm-1.5.0.tar.gz.sha1</a></td><td align="right">2008-03-11 04:06 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.5.0.tar.gz.sha1.asc">cairomm-1.5.0.tar.gz.sha1.asc</a></td><td align="right">2008-03-11 04:06 </td><td align="right">307 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.6.0.tar.gz">cairomm-1.6.0.tar.gz</a></td><td align="right">2008-04-11 18:23 </td><td align="right">779K</td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.6.0.tar.gz.sha1">cairomm-1.6.0.tar.gz.sha1</a></td><td align="right">2008-04-11 18:23 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.6.0.tar.gz.sha1.asc">cairomm-1.6.0.tar.gz.sha1.asc</a></td><td align="right">2008-04-11 18:23 </td><td align="right">311 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.6.2.tar.gz">cairomm-1.6.2.tar.gz</a></td><td align="right">2008-08-13 21:45 </td><td align="right">653K</td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.6.2.tar.gz.sha1">cairomm-1.6.2.tar.gz.sha1</a></td><td align="right">2008-08-13 21:45 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.6.2.tar.gz.sha1.asc">cairomm-1.6.2.tar.gz.sha1.asc</a></td><td align="right">2008-08-13 21:45 </td><td align="right">311 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.6.4.tar.gz">cairomm-1.6.4.tar.gz</a></td><td align="right">2008-09-05 02:59 </td><td align="right">651K</td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.6.4.tar.gz.sha1">cairomm-1.6.4.tar.gz.sha1</a></td><td align="right">2008-09-05 02:59 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.6.4.tar.gz.sha1.asc">cairomm-1.6.4.tar.gz.sha1.asc</a></td><td align="right">2008-09-05 02:59 </td><td align="right">311 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.7.0.tar.gz">cairomm-1.7.0.tar.gz</a></td><td align="right">2008-10-26 04:24 </td><td align="right">780K</td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.7.0.tar.gz.sha1">cairomm-1.7.0.tar.gz.sha1</a></td><td align="right">2008-10-26 04:24 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.7.0.tar.gz.sha1.asc">cairomm-1.7.0.tar.gz.sha1.asc</a></td><td align="right">2008-10-26 04:24 </td><td align="right">307 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.7.2.tar.gz">cairomm-1.7.2.tar.gz</a></td><td align="right">2008-12-20 23:03 </td><td align="right">834K</td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.7.2.tar.gz.sha1">cairomm-1.7.2.tar.gz.sha1</a></td><td align="right">2008-12-20 23:03 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.7.2.tar.gz.sha1.asc">cairomm-1.7.2.tar.gz.sha1.asc</a></td><td align="right">2008-12-20 23:03 </td><td align="right">319 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.8.0.tar.gz">cairomm-1.8.0.tar.gz</a></td><td align="right">2009-01-27 04:11 </td><td align="right">834K</td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.8.0.tar.gz.sha1">cairomm-1.8.0.tar.gz.sha1</a></td><td align="right">2009-01-27 04:11 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.8.0.tar.gz.sha1.asc">cairomm-1.8.0.tar.gz.sha1.asc</a></td><td align="right">2009-01-27 04:11 </td><td align="right">319 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.8.2.tar.gz">cairomm-1.8.2.tar.gz</a></td><td align="right">2009-07-08 00:41 </td><td align="right">1.1M</td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.8.2.tar.gz.sha1">cairomm-1.8.2.tar.gz.sha1</a></td><td align="right">2009-07-08 00:41 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.8.2.tar.gz.sha1.asc">cairomm-1.8.2.tar.gz.sha1.asc</a></td><td align="right">2009-07-08 00:41 </td><td align="right">319 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.8.4.tar.gz">cairomm-1.8.4.tar.gz</a></td><td align="right">2009-10-19 14:11 </td><td align="right">885K</td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.8.4.tar.gz.sha1">cairomm-1.8.4.tar.gz.sha1</a></td><td align="right">2009-10-19 14:11 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.8.4.tar.gz.sha1.asc">cairomm-1.8.4.tar.gz.sha1.asc</a></td><td align="right">2009-10-19 14:11 </td><td align="right">320 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.8.6.tar.gz">cairomm-1.8.6.tar.gz</a></td><td align="right">2010-11-03 08:15 </td><td align="right">830K</td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.8.6.tar.gz.sha1">cairomm-1.8.6.tar.gz.sha1</a></td><td align="right">2010-11-03 08:15 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.8.6.tar.gz.sha1.asc">cairomm-1.8.6.tar.gz.sha1.asc</a></td><td align="right">2010-11-03 08:15 </td><td align="right">320 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.9.1.tar.gz">cairomm-1.9.1.tar.gz</a></td><td align="right">2010-07-13 11:47 </td><td align="right">832K</td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.9.1.tar.gz.sha1">cairomm-1.9.1.tar.gz.sha1</a></td><td align="right">2010-07-13 11:47 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.9.1.tar.gz.sha1.asc">cairomm-1.9.1.tar.gz.sha1.asc</a></td><td align="right">2010-07-13 11:47 </td><td align="right">319 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.9.2.tar.gz">cairomm-1.9.2.tar.gz</a></td><td align="right">2010-09-06 11:58 </td><td align="right">837K</td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.9.2.tar.gz.sha1">cairomm-1.9.2.tar.gz.sha1</a></td><td align="right">2010-09-06 11:58 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.9.2.tar.gz.sha1.asc">cairomm-1.9.2.tar.gz.sha1.asc</a></td><td align="right">2010-09-06 11:58 </td><td align="right">320 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.9.4.tar.gz">cairomm-1.9.4.tar.gz</a></td><td align="right">2010-10-22 19:33 </td><td align="right">1.0M</td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.9.4.tar.gz.sha1">cairomm-1.9.4.tar.gz.sha1</a></td><td align="right">2010-10-22 19:33 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.9.4.tar.gz.sha1.asc">cairomm-1.9.4.tar.gz.sha1.asc</a></td><td align="right">2010-10-22 19:33 </td><td align="right">320 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.9.6.tar.gz">cairomm-1.9.6.tar.gz</a></td><td align="right">2010-10-26 07:35 </td><td align="right">858K</td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.9.6.tar.gz.sha1">cairomm-1.9.6.tar.gz.sha1</a></td><td align="right">2010-10-26 07:35 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.9.6.tar.gz.sha1.asc">cairomm-1.9.6.tar.gz.sha1.asc</a></td><td align="right">2010-10-26 07:35 </td><td align="right">320 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.9.8.tar.gz">cairomm-1.9.8.tar.gz</a></td><td align="right">2010-12-31 16:32 </td><td align="right">937K</td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.9.8.tar.gz.sha1">cairomm-1.9.8.tar.gz.sha1</a></td><td align="right">2010-12-31 16:32 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.9.8.tar.gz.sha1.asc">cairomm-1.9.8.tar.gz.sha1.asc</a></td><td align="right">2010-12-31 16:32 </td><td align="right">320 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.10.0.tar.gz">cairomm-1.10.0.tar.gz</a></td><td align="right">2011-05-09 07:54 </td><td align="right">1.0M</td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.10.0.tar.gz.sha1">cairomm-1.10.0.tar.gz.sha1</a></td><td align="right">2011-05-09 07:54 </td><td align="right"> 64 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.10.0.tar.gz.sha1.asc">cairomm-1.10.0.tar.gz.sha1.asc</a></td><td align="right">2011-05-09 07:54 </td><td align="right">324 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.11.2.tar.gz">cairomm-1.11.2.tar.gz</a></td><td align="right">2014-02-11 08:39 </td><td align="right">1.2M</td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.11.2.tar.gz.sha1">cairomm-1.11.2.tar.gz.sha1</a></td><td align="right">2014-02-11 08:39 </td><td align="right"> 64 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.11.2.tar.gz.sha1.asc">cairomm-1.11.2.tar.gz.sha1.asc</a></td><td align="right">2014-02-11 08:39 </td><td align="right">324 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.11.4.tar.gz">cairomm-1.11.4.tar.gz</a></td><td align="right">2015-08-12 09:35 </td><td align="right">1.3M</td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.11.4.tar.gz.sha1">cairomm-1.11.4.tar.gz.sha1</a></td><td align="right">2015-08-12 09:35 </td><td align="right"> 64 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.11.4.tar.gz.sha1.asc">cairomm-1.11.4.tar.gz.sha1.asc</a></td><td align="right">2015-08-12 09:35 </td><td align="right">303 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.12.0.tar.gz">cairomm-1.12.0.tar.gz</a></td><td align="right">2015-09-22 10:57 </td><td align="right">1.2M</td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.12.0.tar.gz.sha1">cairomm-1.12.0.tar.gz.sha1</a></td><td align="right">2015-09-22 10:57 </td><td align="right"> 64 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.12.0.tar.gz.sha1.asc">cairomm-1.12.0.tar.gz.sha1.asc</a></td><td align="right">2015-09-22 10:57 </td><td align="right">303 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.12.1.tar.gz">cairomm-1.12.1.tar.gz</a></td><td align="right">2016-11-15 11:44 </td><td align="right">1.3M</td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.12.1.tar.gz.sha1">cairomm-1.12.1.tar.gz.sha1</a></td><td align="right">2016-11-15 11:44 </td><td align="right"> 64 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.12.1.tar.gz.sha1.asc">cairomm-1.12.1.tar.gz.sha1.asc</a></td><td align="right">2016-11-15 11:44 </td><td align="right">285 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.12.2.tar.gz">cairomm-1.12.2.tar.gz</a></td><td align="right">2016-11-15 11:52 </td><td align="right">1.3M</td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.12.2.tar.gz.sha1">cairomm-1.12.2.tar.gz.sha1</a></td><td align="right">2016-11-15 11:52 </td><td align="right"> 64 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.12.2.tar.gz.sha1.asc">cairomm-1.12.2.tar.gz.sha1.asc</a></td><td align="right">2016-11-15 11:52 </td><td align="right">289 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.13.1.tar.gz">cairomm-1.13.1.tar.gz</a></td><td align="right">2016-11-15 11:59 </td><td align="right">1.3M</td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.13.1.tar.gz.sha1">cairomm-1.13.1.tar.gz.sha1</a></td><td align="right">2016-11-15 11:59 </td><td align="right"> 64 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.13.1.tar.gz.sha1.asc">cairomm-1.13.1.tar.gz.sha1.asc</a></td><td align="right">2016-11-15 11:59 </td><td align="right">289 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.14.0.tar.xz">cairomm-1.14.0.tar.xz</a></td><td align="right">2020-09-27 16:24 </td><td align="right">589K</td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.14.0.tar.xz.sha1">cairomm-1.14.0.tar.xz.sha1</a></td><td align="right">2020-09-27 16:24 </td><td align="right"> 64 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.14.0.tar.xz.sha1.asc">cairomm-1.14.0.tar.xz.sha1.asc</a></td><td align="right">2020-09-27 16:24 </td><td align="right">801 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.14.2.tar.xz">cairomm-1.14.2.tar.xz</a></td><td align="right">2020-09-30 13:41 </td><td align="right">590K</td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.14.2.tar.xz.asc">cairomm-1.14.2.tar.xz.asc</a></td><td align="right">2021-02-19 17:47 </td><td align="right">659 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.14.2.tar.xz.sha1">cairomm-1.14.2.tar.xz.sha1</a></td><td align="right">2020-09-30 13:41 </td><td align="right"> 64 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.14.2.tar.xz.sha1.asc">cairomm-1.14.2.tar.xz.sha1.asc</a></td><td align="right">2020-09-30 13:41 </td><td align="right">801 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.14.3.tar.xz">cairomm-1.14.3.tar.xz</a></td><td align="right">2021-05-20 14:15 </td><td align="right">590K</td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.14.3.tar.xz.asc">cairomm-1.14.3.tar.xz.asc</a></td><td align="right">2021-05-20 14:15 </td><td align="right">659 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.14.3.tar.xz.sha1">cairomm-1.14.3.tar.xz.sha1</a></td><td align="right">2021-05-20 14:15 </td><td align="right"> 64 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.14.3.tar.xz.sha1.asc">cairomm-1.14.3.tar.xz.sha1.asc</a></td><td align="right">2021-05-20 14:15 </td><td align="right">801 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.14.4.tar.xz">cairomm-1.14.4.tar.xz</a></td><td align="right">2022-09-21 13:37 </td><td align="right">604K</td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.14.4.tar.xz.asc">cairomm-1.14.4.tar.xz.asc</a></td><td align="right">2022-09-21 13:37 </td><td align="right">659 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.14.4.tar.xz.sha1">cairomm-1.14.4.tar.xz.sha1</a></td><td align="right">2022-09-21 13:37 </td><td align="right"> 64 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.14.4.tar.xz.sha1.asc">cairomm-1.14.4.tar.xz.sha1.asc</a></td><td align="right">2022-09-21 13:37 </td><td align="right">801 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.14.5.tar.xz">cairomm-1.14.5.tar.xz</a></td><td align="right">2023-09-27 07:12 </td><td align="right">638K</td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.14.5.tar.xz.asc">cairomm-1.14.5.tar.xz.asc</a></td><td align="right">2023-09-27 07:12 </td><td align="right">659 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.14.5.tar.xz.sha1">cairomm-1.14.5.tar.xz.sha1</a></td><td align="right">2023-09-27 07:12 </td><td align="right"> 64 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.14.5.tar.xz.sha1.asc">cairomm-1.14.5.tar.xz.sha1.asc</a></td><td align="right">2023-09-27 07:12 </td><td align="right">801 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.14.6.tar.xz">cairomm-1.14.6.tar.xz</a></td><td align="right">2026-06-03 13:52 </td><td align="right">617K</td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.14.6.tar.xz.asc">cairomm-1.14.6.tar.xz.asc</a></td><td align="right">2026-06-03 13:53 </td><td align="right">659 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.14.6.tar.xz.sha256sum">cairomm-1.14.6.tar.xz.sha256sum</a></td><td align="right">2026-06-03 13:52 </td><td align="right"> 88 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.14.6.tar.xz.sha256sum.asc">cairomm-1.14.6.tar.xz.sha256sum.asc</a></td><td align="right">2026-06-03 13:53 </td><td align="right">837 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.15.1.tar.gz">cairomm-1.15.1.tar.gz</a></td><td align="right">2016-11-15 12:18 </td><td align="right">1.3M</td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.15.1.tar.gz.sha1">cairomm-1.15.1.tar.gz.sha1</a></td><td align="right">2016-11-15 12:18 </td><td align="right"> 64 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.15.1.tar.gz.sha1.asc">cairomm-1.15.1.tar.gz.sha1.asc</a></td><td align="right">2016-11-15 12:18 </td><td align="right">289 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.15.2.tar.gz">cairomm-1.15.2.tar.gz</a></td><td align="right">2016-12-07 10:25 </td><td align="right">1.3M</td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.15.2.tar.gz.sha1">cairomm-1.15.2.tar.gz.sha1</a></td><td align="right">2016-12-07 10:25 </td><td align="right"> 64 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.15.2.tar.gz.sha1.asc">cairomm-1.15.2.tar.gz.sha1.asc</a></td><td align="right">2016-12-07 10:25 </td><td align="right">289 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.15.3.tar.gz">cairomm-1.15.3.tar.gz</a></td><td align="right">2017-01-12 11:01 </td><td align="right">1.2M</td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.15.3.tar.gz.sha1">cairomm-1.15.3.tar.gz.sha1</a></td><td align="right">2017-01-12 11:01 </td><td align="right"> 64 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.15.3.tar.gz.sha1.asc">cairomm-1.15.3.tar.gz.sha1.asc</a></td><td align="right">2017-01-12 11:01 </td><td align="right">289 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.15.5.tar.gz">cairomm-1.15.5.tar.gz</a></td><td align="right">2017-08-25 10:11 </td><td align="right">1.3M</td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.15.5.tar.gz.sha1">cairomm-1.15.5.tar.gz.sha1</a></td><td align="right">2017-08-25 10:11 </td><td align="right"> 64 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.15.5.tar.gz.sha1.asc">cairomm-1.15.5.tar.gz.sha1.asc</a></td><td align="right">2017-08-25 10:11 </td><td align="right">285 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.16.0.tar.xz">cairomm-1.16.0.tar.xz</a></td><td align="right">2020-09-29 15:06 </td><td align="right">566K</td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.16.0.tar.xz.asc">cairomm-1.16.0.tar.xz.asc</a></td><td align="right">2021-02-19 17:49 </td><td align="right">659 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.16.0.tar.xz.sha1">cairomm-1.16.0.tar.xz.sha1</a></td><td align="right">2020-09-29 15:06 </td><td align="right"> 64 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.16.0.tar.xz.sha1.asc">cairomm-1.16.0.tar.xz.sha1.asc</a></td><td align="right">2020-09-29 15:06 </td><td align="right">797 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.16.1.tar.xz">cairomm-1.16.1.tar.xz</a></td><td align="right">2021-05-20 14:19 </td><td align="right">566K</td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.16.1.tar.xz.asc">cairomm-1.16.1.tar.xz.asc</a></td><td align="right">2021-05-20 14:19 </td><td align="right">659 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.16.1.tar.xz.sha1">cairomm-1.16.1.tar.xz.sha1</a></td><td align="right">2021-05-20 14:19 </td><td align="right"> 64 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.16.1.tar.xz.sha1.asc">cairomm-1.16.1.tar.xz.sha1.asc</a></td><td align="right">2021-05-20 14:19 </td><td align="right">801 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.16.2.tar.xz">cairomm-1.16.2.tar.xz</a></td><td align="right">2022-09-21 13:35 </td><td align="right">580K</td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.16.2.tar.xz.asc">cairomm-1.16.2.tar.xz.asc</a></td><td align="right">2022-09-21 13:35 </td><td align="right">659 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.16.2.tar.xz.sha1">cairomm-1.16.2.tar.xz.sha1</a></td><td align="right">2022-09-21 13:35 </td><td align="right"> 64 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.16.2.tar.xz.sha1.asc">cairomm-1.16.2.tar.xz.sha1.asc</a></td><td align="right">2022-09-21 13:35 </td><td align="right">801 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.17.1.tar.xz">cairomm-1.17.1.tar.xz</a></td><td align="right">2023-07-16 13:03 </td><td align="right">618K</td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.17.1.tar.xz.asc">cairomm-1.17.1.tar.xz.asc</a></td><td align="right">2023-07-16 13:10 </td><td align="right">659 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.17.1.tar.xz.sha1">cairomm-1.17.1.tar.xz.sha1</a></td><td align="right">2023-07-16 13:03 </td><td align="right"> 64 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.17.1.tar.xz.sha1.asc">cairomm-1.17.1.tar.xz.sha1.asc</a></td><td align="right">2023-07-16 13:03 </td><td align="right">801 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.18.0.tar.xz">cairomm-1.18.0.tar.xz</a></td><td align="right">2023-09-27 07:42 </td><td align="right">618K</td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.18.0.tar.xz.asc">cairomm-1.18.0.tar.xz.asc</a></td><td align="right">2023-09-27 07:42 </td><td align="right">659 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.18.0.tar.xz.sha1">cairomm-1.18.0.tar.xz.sha1</a></td><td align="right">2023-09-27 07:42 </td><td align="right"> 64 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.18.0.tar.xz.sha1.asc">cairomm-1.18.0.tar.xz.sha1.asc</a></td><td align="right">2023-09-27 07:42 </td><td align="right">801 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.18.1.tar.xz">cairomm-1.18.1.tar.xz</a></td><td align="right">2026-06-03 14:11 </td><td align="right">599K</td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.18.1.tar.xz.asc">cairomm-1.18.1.tar.xz.asc</a></td><td align="right">2026-06-03 14:12 </td><td align="right">659 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.18.1.tar.xz.sha256sum">cairomm-1.18.1.tar.xz.sha256sum</a></td><td align="right">2026-06-03 14:11 </td><td align="right"> 88 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.18.1.tar.xz.sha256sum.asc">cairomm-1.18.1.tar.xz.sha256sum.asc</a></td><td align="right">2026-06-03 14:11 </td><td align="right">841 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.19.0.tar.xz">cairomm-1.19.0.tar.xz</a></td><td align="right">2025-10-10 14:18 </td><td align="right">749K</td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.19.0.tar.xz.asc">cairomm-1.19.0.tar.xz.asc</a></td><td align="right">2025-10-10 14:18 </td><td align="right">659 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.19.0.tar.xz.sha1">cairomm-1.19.0.tar.xz.sha1</a></td><td align="right">2025-10-10 14:18 </td><td align="right"> 64 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.19.0.tar.xz.sha1.asc">cairomm-1.19.0.tar.xz.sha1.asc</a></td><td align="right">2025-10-10 14:18 </td><td align="right">801 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.19.1.tar.xz">cairomm-1.19.1.tar.xz</a></td><td align="right">2026-06-03 14:41 </td><td align="right">717K</td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.19.1.tar.xz.asc">cairomm-1.19.1.tar.xz.asc</a></td><td align="right">2026-06-03 14:42 </td><td align="right">659 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.19.1.tar.xz.sha256sum">cairomm-1.19.1.tar.xz.sha256sum</a></td><td align="right">2026-06-03 14:41 </td><td align="right"> 88 </td><td>&nbsp;</td></tr>
<tr><td><a href="cairomm-1.19.1.tar.xz.sha256sum.asc">cairomm-1.19.1.tar.xz.sha256sum.asc</a></td><td align="right">2026-06-03 14:41 </td><td align="right">837 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.9.6.tar.gz">pixman-0.9.6.tar.gz</a></td><td align="right">2007-10-30 19:26 </td><td align="right">392K</td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.9.6.tar.gz.sha1">pixman-0.9.6.tar.gz.sha1</a></td><td align="right">2007-10-30 19:26 </td><td align="right"> 62 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.9.6.tar.gz.sha1.asc">pixman-0.9.6.tar.gz.sha1.asc</a></td><td align="right">2007-10-30 19:26 </td><td align="right">311 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.10.0.tar.gz">pixman-0.10.0.tar.gz</a></td><td align="right">2008-03-27 14:18 </td><td align="right">402K</td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.10.0.tar.gz.sha1">pixman-0.10.0.tar.gz.sha1</a></td><td align="right">2008-03-27 14:18 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.10.0.tar.gz.sha1.asc">pixman-0.10.0.tar.gz.sha1.asc</a></td><td align="right">2008-03-27 14:18 </td><td align="right">311 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.12.0.tar.gz">pixman-0.12.0.tar.gz</a></td><td align="right">2008-09-17 18:08 </td><td align="right">446K</td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.12.0.tar.gz.sha1">pixman-0.12.0.tar.gz.sha1</a></td><td align="right">2008-09-17 18:08 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.12.0.tar.gz.sha1.asc">pixman-0.12.0.tar.gz.sha1.asc</a></td><td align="right">2008-09-17 18:08 </td><td align="right">319 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.14.0.tar.gz">pixman-0.14.0.tar.gz</a></td><td align="right">2009-02-06 22:40 </td><td align="right">457K</td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.14.0.tar.gz.sha1">pixman-0.14.0.tar.gz.sha1</a></td><td align="right">2009-02-06 22:40 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.14.0.tar.gz.sha1.asc">pixman-0.14.0.tar.gz.sha1.asc</a></td><td align="right">2009-02-06 22:40 </td><td align="right">319 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.16.0.tar.gz">pixman-0.16.0.tar.gz</a></td><td align="right">2009-08-28 12:11 </td><td align="right">470K</td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.16.0.tar.gz.sha1">pixman-0.16.0.tar.gz.sha1</a></td><td align="right">2009-08-28 12:11 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.16.0.tar.gz.sha1.asc">pixman-0.16.0.tar.gz.sha1.asc</a></td><td align="right">2009-08-28 12:11 </td><td align="right">319 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.16.2.tar.gz">pixman-0.16.2.tar.gz</a></td><td align="right">2009-09-28 13:25 </td><td align="right">471K</td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.16.2.tar.gz.sha1">pixman-0.16.2.tar.gz.sha1</a></td><td align="right">2009-09-28 13:25 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.16.2.tar.gz.sha1.asc">pixman-0.16.2.tar.gz.sha1.asc</a></td><td align="right">2009-09-28 13:25 </td><td align="right">319 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.16.4.tar.gz">pixman-0.16.4.tar.gz</a></td><td align="right">2009-12-15 17:16 </td><td align="right">475K</td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.16.4.tar.gz.sha1">pixman-0.16.4.tar.gz.sha1</a></td><td align="right">2009-12-15 17:16 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.16.4.tar.gz.sha1.asc">pixman-0.16.4.tar.gz.sha1.asc</a></td><td align="right">2009-12-15 17:16 </td><td align="right">320 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.16.6.tar.gz">pixman-0.16.6.tar.gz</a></td><td align="right">2010-02-08 16:24 </td><td align="right">475K</td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.16.6.tar.gz.sha1">pixman-0.16.6.tar.gz.sha1</a></td><td align="right">2010-02-08 16:24 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.16.6.tar.gz.sha1.asc">pixman-0.16.6.tar.gz.sha1.asc</a></td><td align="right">2010-02-08 16:24 </td><td align="right">320 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.18.0.tar.gz">pixman-0.18.0.tar.gz</a></td><td align="right">2010-04-01 09:32 </td><td align="right">498K</td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.18.0.tar.gz.sha1">pixman-0.18.0.tar.gz.sha1</a></td><td align="right">2010-04-01 09:32 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.18.0.tar.gz.sha1.asc">pixman-0.18.0.tar.gz.sha1.asc</a></td><td align="right">2010-04-01 09:32 </td><td align="right">320 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.18.2.tar.gz">pixman-0.18.2.tar.gz</a></td><td align="right">2010-05-12 20:31 </td><td align="right">499K</td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.18.2.tar.gz.sha1">pixman-0.18.2.tar.gz.sha1</a></td><td align="right">2010-05-12 20:31 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.18.2.tar.gz.sha1.asc">pixman-0.18.2.tar.gz.sha1.asc</a></td><td align="right">2010-05-12 20:31 </td><td align="right">320 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.18.4.tar.gz">pixman-0.18.4.tar.gz</a></td><td align="right">2010-08-16 10:50 </td><td align="right">499K</td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.18.4.tar.gz.sha1">pixman-0.18.4.tar.gz.sha1</a></td><td align="right">2010-08-16 10:50 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.18.4.tar.gz.sha1.asc">pixman-0.18.4.tar.gz.sha1.asc</a></td><td align="right">2010-08-16 10:50 </td><td align="right">320 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.20.0.tar.gz">pixman-0.20.0.tar.gz</a></td><td align="right">2010-10-27 20:57 </td><td align="right">525K</td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.20.0.tar.gz.sha1">pixman-0.20.0.tar.gz.sha1</a></td><td align="right">2010-10-27 20:57 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.20.0.tar.gz.sha1.asc">pixman-0.20.0.tar.gz.sha1.asc</a></td><td align="right">2010-10-27 20:57 </td><td align="right">320 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.20.2.tar.gz">pixman-0.20.2.tar.gz</a></td><td align="right">2011-01-19 13:34 </td><td align="right">530K</td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.20.2.tar.gz.sha1">pixman-0.20.2.tar.gz.sha1</a></td><td align="right">2011-01-19 13:34 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.20.2.tar.gz.sha1.asc">pixman-0.20.2.tar.gz.sha1.asc</a></td><td align="right">2011-01-19 13:34 </td><td align="right">316 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.22.0.tar.gz">pixman-0.22.0.tar.gz</a></td><td align="right">2011-05-02 09:04 </td><td align="right">565K</td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.22.0.tar.gz.sha1">pixman-0.22.0.tar.gz.sha1</a></td><td align="right">2011-05-02 09:04 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.22.0.tar.gz.sha1.asc">pixman-0.22.0.tar.gz.sha1.asc</a></td><td align="right">2011-05-02 09:04 </td><td align="right">320 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.22.2.tar.gz">pixman-0.22.2.tar.gz</a></td><td align="right">2011-07-04 20:37 </td><td align="right">601K</td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.22.2.tar.gz.sha1">pixman-0.22.2.tar.gz.sha1</a></td><td align="right">2011-07-04 20:37 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.22.2.tar.gz.sha1.asc">pixman-0.22.2.tar.gz.sha1.asc</a></td><td align="right">2011-07-04 20:37 </td><td align="right">319 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.24.0.tar.gz">pixman-0.24.0.tar.gz</a></td><td align="right">2011-11-06 21:34 </td><td align="right">612K</td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.24.0.tar.gz.sha1">pixman-0.24.0.tar.gz.sha1</a></td><td align="right">2011-11-06 21:34 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.24.0.tar.gz.sha1.asc">pixman-0.24.0.tar.gz.sha1.asc</a></td><td align="right">2011-11-06 21:34 </td><td align="right">319 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.24.2.tar.gz">pixman-0.24.2.tar.gz</a></td><td align="right">2012-01-18 21:06 </td><td align="right">612K</td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.24.2.tar.gz.sha1">pixman-0.24.2.tar.gz.sha1</a></td><td align="right">2012-01-18 21:06 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.24.2.tar.gz.sha1.asc">pixman-0.24.2.tar.gz.sha1.asc</a></td><td align="right">2012-01-18 21:06 </td><td align="right">319 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.24.4.tar.gz">pixman-0.24.4.tar.gz</a></td><td align="right">2012-02-09 00:22 </td><td align="right">613K</td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.24.4.tar.gz.sha1">pixman-0.24.4.tar.gz.sha1</a></td><td align="right">2012-02-09 00:22 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.24.4.tar.gz.sha1.asc">pixman-0.24.4.tar.gz.sha1.asc</a></td><td align="right">2012-02-09 00:22 </td><td align="right">315 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.26.0.tar.gz">pixman-0.26.0.tar.gz</a></td><td align="right">2012-05-26 20:33 </td><td align="right">730K</td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.26.0.tar.gz.sha1">pixman-0.26.0.tar.gz.sha1</a></td><td align="right">2012-05-26 20:33 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.26.0.tar.gz.sha1.asc">pixman-0.26.0.tar.gz.sha1.asc</a></td><td align="right">2012-05-26 20:33 </td><td align="right">629 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.26.2.tar.gz">pixman-0.26.2.tar.gz</a></td><td align="right">2012-06-29 19:19 </td><td align="right">726K</td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.26.2.tar.gz.sha1">pixman-0.26.2.tar.gz.sha1</a></td><td align="right">2012-06-29 20:20 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.26.2.tar.gz.sha1.asc">pixman-0.26.2.tar.gz.sha1.asc</a></td><td align="right">2012-06-29 20:20 </td><td align="right">1.0K</td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.28.0.tar.gz">pixman-0.28.0.tar.gz</a></td><td align="right">2012-11-07 18:47 </td><td align="right">734K</td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.28.0.tar.gz.sha1">pixman-0.28.0.tar.gz.sha1</a></td><td align="right">2012-11-07 18:47 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.28.0.tar.gz.sha1.asc">pixman-0.28.0.tar.gz.sha1.asc</a></td><td align="right">2012-11-07 18:47 </td><td align="right">625 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.28.2.tar.gz">pixman-0.28.2.tar.gz</a></td><td align="right">2012-12-10 12:01 </td><td align="right">717K</td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.28.2.tar.gz.sha1">pixman-0.28.2.tar.gz.sha1</a></td><td align="right">2012-12-10 12:01 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.28.2.tar.gz.sha1.asc">pixman-0.28.2.tar.gz.sha1.asc</a></td><td align="right">2012-12-10 12:01 </td><td align="right">320 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.30.0.tar.gz">pixman-0.30.0.tar.gz</a></td><td align="right">2013-05-08 23:39 </td><td align="right">783K</td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.30.0.tar.gz.sha1">pixman-0.30.0.tar.gz.sha1</a></td><td align="right">2013-05-08 23:39 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.30.0.tar.gz.sha1.asc">pixman-0.30.0.tar.gz.sha1.asc</a></td><td align="right">2013-05-08 23:39 </td><td align="right">625 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.30.2.tar.gz">pixman-0.30.2.tar.gz</a></td><td align="right">2013-08-07 14:10 </td><td align="right">781K</td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.30.2.tar.gz.sha1">pixman-0.30.2.tar.gz.sha1</a></td><td align="right">2013-08-07 14:10 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.30.2.tar.gz.sha1.asc">pixman-0.30.2.tar.gz.sha1.asc</a></td><td align="right">2013-08-07 14:10 </td><td align="right">625 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.32.0.tar.gz">pixman-0.32.0.tar.gz</a></td><td align="right">2013-11-10 23:11 </td><td align="right">691K</td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.32.0.tar.gz.sha1">pixman-0.32.0.tar.gz.sha1</a></td><td align="right">2013-11-10 23:11 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.32.0.tar.gz.sha1.asc">pixman-0.32.0.tar.gz.sha1.asc</a></td><td align="right">2013-11-10 23:11 </td><td align="right">629 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.32.2.tar.gz">pixman-0.32.2.tar.gz</a></td><td align="right">2013-11-12 00:47 </td><td align="right">786K</td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.32.2.tar.gz.sha1">pixman-0.32.2.tar.gz.sha1</a></td><td align="right">2013-11-12 00:47 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.32.2.tar.gz.sha1.asc">pixman-0.32.2.tar.gz.sha1.asc</a></td><td align="right">2013-11-12 00:47 </td><td align="right">629 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.32.4.tar.gz">pixman-0.32.4.tar.gz</a></td><td align="right">2013-11-18 02:37 </td><td align="right">798K</td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.32.4.tar.gz.sha1">pixman-0.32.4.tar.gz.sha1</a></td><td align="right">2013-11-18 02:37 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.32.4.tar.gz.sha1.asc">pixman-0.32.4.tar.gz.sha1.asc</a></td><td align="right">2013-11-18 02:37 </td><td align="right">1.0K</td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.32.6.tar.gz">pixman-0.32.6.tar.gz</a></td><td align="right">2014-07-05 23:09 </td><td align="right">798K</td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.32.6.tar.gz.sha1">pixman-0.32.6.tar.gz.sha1</a></td><td align="right">2014-07-05 23:09 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.32.6.tar.gz.sha1.asc">pixman-0.32.6.tar.gz.sha1.asc</a></td><td align="right">2014-07-05 23:09 </td><td align="right">629 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.32.8.tar.gz">pixman-0.32.8.tar.gz</a></td><td align="right">2015-09-22 14:20 </td><td align="right">806K</td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.32.8.tar.gz.sha1">pixman-0.32.8.tar.gz.sha1</a></td><td align="right">2015-09-22 14:20 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.32.8.tar.gz.sha1.asc">pixman-0.32.8.tar.gz.sha1.asc</a></td><td align="right">2015-09-22 14:20 </td><td align="right">608 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.34.0.tar.gz">pixman-0.34.0.tar.gz</a></td><td align="right">2016-01-31 14:43 </td><td align="right">858K</td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.34.0.tar.gz.sha1">pixman-0.34.0.tar.gz.sha1</a></td><td align="right">2016-01-31 14:43 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.34.0.tar.gz.sha1.asc">pixman-0.34.0.tar.gz.sha1.asc</a></td><td align="right">2016-01-31 14:43 </td><td align="right">612 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.36.0.tar.gz">pixman-0.36.0.tar.gz</a></td><td align="right">2018-11-21 11:46 </td><td align="right">861K</td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.36.0.tar.gz.sha1">pixman-0.36.0.tar.gz.sha1</a></td><td align="right">2018-11-21 11:46 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.36.0.tar.gz.sha1.asc">pixman-0.36.0.tar.gz.sha1.asc</a></td><td align="right">2018-11-21 11:47 </td><td align="right">1.0K</td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.38.0.tar.gz">pixman-0.38.0.tar.gz</a></td><td align="right">2019-02-11 12:32 </td><td align="right">870K</td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.38.0.tar.gz.sha1">pixman-0.38.0.tar.gz.sha1</a></td><td align="right">2019-02-11 12:32 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.38.0.tar.gz.sha1.asc">pixman-0.38.0.tar.gz.sha1.asc</a></td><td align="right">2019-02-11 12:32 </td><td align="right">1.0K</td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.38.2.tar.gz">pixman-0.38.2.tar.gz</a></td><td align="right">2019-04-07 20:34 </td><td align="right">876K</td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.38.2.tar.gz.sha1">pixman-0.38.2.tar.gz.sha1</a></td><td align="right">2019-04-07 20:34 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.38.2.tar.gz.sha1.asc">pixman-0.38.2.tar.gz.sha1.asc</a></td><td align="right">2019-04-07 20:34 </td><td align="right">490 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.38.4.tar.gz">pixman-0.38.4.tar.gz</a></td><td align="right">2019-04-10 17:22 </td><td align="right">877K</td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.38.4.tar.gz.sha1">pixman-0.38.4.tar.gz.sha1</a></td><td align="right">2019-04-10 17:22 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.38.4.tar.gz.sha1.asc">pixman-0.38.4.tar.gz.sha1.asc</a></td><td align="right">2019-04-10 17:22 </td><td align="right">490 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.40.0.tar.gz">pixman-0.40.0.tar.gz</a></td><td align="right">2020-04-19 21:56 </td><td align="right">893K</td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.40.0.tar.gz.sha512">pixman-0.40.0.tar.gz.sha512</a></td><td align="right">2020-04-19 21:56 </td><td align="right">151 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.40.0.tar.gz.sha512.asc">pixman-0.40.0.tar.gz.sha512.asc</a></td><td align="right">2020-04-19 21:56 </td><td align="right">604 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.42.0.tar.gz">pixman-0.42.0.tar.gz</a></td><td align="right">2022-10-18 08:53 </td><td align="right">936K</td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.42.0.tar.gz.sha512">pixman-0.42.0.tar.gz.sha512</a></td><td align="right">2022-10-18 08:53 </td><td align="right">151 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.42.0.tar.gz.sha512.asc">pixman-0.42.0.tar.gz.sha512.asc</a></td><td align="right">2022-10-18 08:53 </td><td align="right">1.1K</td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.42.2.tar.gz">pixman-0.42.2.tar.gz</a></td><td align="right">2022-11-02 17:30 </td><td align="right">937K</td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.42.2.tar.gz.sha512">pixman-0.42.2.tar.gz.sha512</a></td><td align="right">2022-11-02 17:30 </td><td align="right">151 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.42.2.tar.gz.sha512.asc">pixman-0.42.2.tar.gz.sha512.asc</a></td><td align="right">2022-11-02 17:30 </td><td align="right">599 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.43.0.tar.gz">pixman-0.43.0.tar.gz</a></td><td align="right">2024-01-04 10:42 </td><td align="right">775K</td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.43.0.tar.gz.sha512">pixman-0.43.0.tar.gz.sha512</a></td><td align="right">2024-01-04 10:42 </td><td align="right">151 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.43.0.tar.gz.sha512.asc">pixman-0.43.0.tar.gz.sha512.asc</a></td><td align="right">2024-01-04 10:42 </td><td align="right">1.1K</td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.43.2.tar.gz">pixman-0.43.2.tar.gz</a></td><td align="right">2024-01-28 12:32 </td><td align="right">775K</td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.43.2.tar.gz.sha512">pixman-0.43.2.tar.gz.sha512</a></td><td align="right">2024-01-28 12:32 </td><td align="right">151 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.43.2.tar.gz.sha512.asc">pixman-0.43.2.tar.gz.sha512.asc</a></td><td align="right">2024-01-28 12:32 </td><td align="right">1.1K</td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.43.4.tar.gz">pixman-0.43.4.tar.gz</a></td><td align="right">2024-02-29 16:19 </td><td align="right">775K</td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.43.4.tar.gz.sha512">pixman-0.43.4.tar.gz.sha512</a></td><td align="right">2024-02-29 16:19 </td><td align="right">151 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.43.4.tar.gz.sha512.asc">pixman-0.43.4.tar.gz.sha512.asc</a></td><td align="right">2024-02-29 16:19 </td><td align="right">599 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.44.0.tar.gz">pixman-0.44.0.tar.gz</a></td><td align="right">2024-11-05 17:04 </td><td align="right">794K</td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.44.0.tar.gz.sha512">pixman-0.44.0.tar.gz.sha512</a></td><td align="right">2024-11-05 17:04 </td><td align="right">151 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.44.0.tar.gz.sha512.asc">pixman-0.44.0.tar.gz.sha512.asc</a></td><td align="right">2024-11-05 17:04 </td><td align="right">604 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.44.2.tar.gz">pixman-0.44.2.tar.gz</a></td><td align="right">2024-12-03 03:52 </td><td align="right">795K</td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.44.2.tar.gz.sha512">pixman-0.44.2.tar.gz.sha512</a></td><td align="right">2024-12-03 03:52 </td><td align="right">151 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.44.2.tar.gz.sha512.asc">pixman-0.44.2.tar.gz.sha512.asc</a></td><td align="right">2024-12-03 03:52 </td><td align="right">608 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.44.2.tar.xz">pixman-0.44.2.tar.xz</a></td><td align="right">2024-12-03 03:52 </td><td align="right">635K</td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.44.2.tar.xz.sha512">pixman-0.44.2.tar.xz.sha512</a></td><td align="right">2024-12-03 03:52 </td><td align="right">151 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.44.2.tar.xz.sha512.asc">pixman-0.44.2.tar.xz.sha512.asc</a></td><td align="right">2024-12-03 03:52 </td><td align="right">587 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.46.0.tar.gz">pixman-0.46.0.tar.gz</a></td><td align="right">2025-04-30 03:47 </td><td align="right">808K</td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.46.0.tar.gz.sha512">pixman-0.46.0.tar.gz.sha512</a></td><td align="right">2025-04-30 03:47 </td><td align="right">151 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.46.0.tar.gz.sha512.asc">pixman-0.46.0.tar.gz.sha512.asc</a></td><td align="right">2025-04-30 03:47 </td><td align="right">604 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.46.0.tar.xz">pixman-0.46.0.tar.xz</a></td><td align="right">2025-04-30 03:47 </td><td align="right">645K</td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.46.0.tar.xz.sha512">pixman-0.46.0.tar.xz.sha512</a></td><td align="right">2025-04-30 03:47 </td><td align="right">151 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.46.0.tar.xz.sha512.asc">pixman-0.46.0.tar.xz.sha512.asc</a></td><td align="right">2025-04-30 03:47 </td><td align="right">608 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.46.2.tar.gz">pixman-0.46.2.tar.gz</a></td><td align="right">2025-06-09 22:58 </td><td align="right">808K</td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.46.2.tar.gz.sha512">pixman-0.46.2.tar.gz.sha512</a></td><td align="right">2025-06-09 22:58 </td><td align="right">151 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.46.2.tar.gz.sha512.asc">pixman-0.46.2.tar.gz.sha512.asc</a></td><td align="right">2025-06-09 22:58 </td><td align="right">608 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.46.2.tar.xz">pixman-0.46.2.tar.xz</a></td><td align="right">2025-06-09 22:58 </td><td align="right">645K</td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.46.2.tar.xz.sha512">pixman-0.46.2.tar.xz.sha512</a></td><td align="right">2025-06-09 22:58 </td><td align="right">151 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.46.2.tar.xz.sha512.asc">pixman-0.46.2.tar.xz.sha512.asc</a></td><td align="right">2025-06-09 22:58 </td><td align="right">599 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.46.4.tar.gz">pixman-0.46.4.tar.gz</a></td><td align="right">2025-07-20 16:16 </td><td align="right">808K</td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.46.4.tar.gz.sha512">pixman-0.46.4.tar.gz.sha512</a></td><td align="right">2025-07-20 16:16 </td><td align="right">151 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.46.4.tar.gz.sha512.asc">pixman-0.46.4.tar.gz.sha512.asc</a></td><td align="right">2025-07-20 16:16 </td><td align="right">604 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.46.4.tar.xz">pixman-0.46.4.tar.xz</a></td><td align="right">2025-07-20 16:16 </td><td align="right">645K</td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.46.4.tar.xz.sha512">pixman-0.46.4.tar.xz.sha512</a></td><td align="right">2025-07-20 16:16 </td><td align="right">151 </td><td>&nbsp;</td></tr>
<tr><td><a href="pixman-0.46.4.tar.xz.sha512.asc">pixman-0.46.4.tar.xz.sha512.asc</a></td><td align="right">2025-07-20 16:16 </td><td align="right">599 </td><td>&nbsp;</td></tr>
<tr><td><a href="py2cairo-1.8.10-docs-html.tar.bz2">py2cairo-1.8.10-docs-html.tar.bz2</a></td><td align="right">2010-05-21 06:51 </td><td align="right"> 88K</td><td>&nbsp;</td></tr>
<tr><td><a href="py2cairo-1.8.10.tar.gz">py2cairo-1.8.10.tar.gz</a></td><td align="right">2010-05-20 11:42 </td><td align="right">575K</td><td>&nbsp;</td></tr>
<tr><td><a href="py2cairo-1.8.10.tar.gz.md5">py2cairo-1.8.10.tar.gz.md5</a></td><td align="right">2010-05-20 11:42 </td><td align="right"> 56 </td><td>&nbsp;</td></tr>
<tr><td><a href="py2cairo-1.10.0.tar.bz2">py2cairo-1.10.0.tar.bz2</a></td><td align="right">2011-05-01 11:22 </td><td align="right">393K</td><td>&nbsp;</td></tr>
<tr><td><a href="py2cairo-1.10.0.tar.bz2.sha1">py2cairo-1.10.0.tar.bz2.sha1</a></td><td align="right">2011-05-01 11:22 </td><td align="right"> 66 </td><td>&nbsp;</td></tr>
<tr><td><a href="pycairo-1.0.0.tar.gz">pycairo-1.0.0.tar.gz</a></td><td align="right">2005-08-31 23:48 </td><td align="right">458K</td><td>&nbsp;</td></tr>
<tr><td><a href="pycairo-1.0.0.tar.gz.md5">pycairo-1.0.0.tar.gz.md5</a></td><td align="right">2005-08-31 23:48 </td><td align="right"> 55 </td><td>&nbsp;</td></tr>
<tr><td><a href="pycairo-1.0.2.tar.gz">pycairo-1.0.2.tar.gz</a></td><td align="right">2005-10-11 06:51 </td><td align="right">459K</td><td>&nbsp;</td></tr>
<tr><td><a href="pycairo-1.0.2.tar.gz.md5">pycairo-1.0.2.tar.gz.md5</a></td><td align="right">2005-10-11 06:51 </td><td align="right"> 55 </td><td>&nbsp;</td></tr>
<tr><td><a href="pycairo-1.2.0.tar.gz">pycairo-1.2.0.tar.gz</a></td><td align="right">2006-07-03 03:53 </td><td align="right">479K</td><td>&nbsp;</td></tr>
<tr><td><a href="pycairo-1.2.0.tar.gz.md5">pycairo-1.2.0.tar.gz.md5</a></td><td align="right">2006-07-03 03:53 </td><td align="right"> 55 </td><td>&nbsp;</td></tr>
<tr><td><a href="pycairo-1.2.2.tar.gz">pycairo-1.2.2.tar.gz</a></td><td align="right">2006-08-21 03:19 </td><td align="right">471K</td><td>&nbsp;</td></tr>
<tr><td><a href="pycairo-1.2.2.tar.gz.md5">pycairo-1.2.2.tar.gz.md5</a></td><td align="right">2006-08-21 03:19 </td><td align="right"> 55 </td><td>&nbsp;</td></tr>
<tr><td><a href="pycairo-1.2.6.tar.gz">pycairo-1.2.6.tar.gz</a></td><td align="right">2006-11-27 01:49 </td><td align="right">469K</td><td>&nbsp;</td></tr>
<tr><td><a href="pycairo-1.2.6.tar.gz.md5">pycairo-1.2.6.tar.gz.md5</a></td><td align="right">2006-11-27 01:49 </td><td align="right"> 55 </td><td>&nbsp;</td></tr>
<tr><td><a href="pycairo-1.4.0.tar.gz">pycairo-1.4.0.tar.gz</a></td><td align="right">2007-03-14 09:44 </td><td align="right">468K</td><td>&nbsp;</td></tr>
<tr><td><a href="pycairo-1.4.0.tar.gz.md5">pycairo-1.4.0.tar.gz.md5</a></td><td align="right">2007-03-14 09:44 </td><td align="right"> 55 </td><td>&nbsp;</td></tr>
<tr><td><a href="pycairo-1.4.12.tar.gz">pycairo-1.4.12.tar.gz</a></td><td align="right">2007-12-13 06:33 </td><td align="right">479K</td><td>&nbsp;</td></tr>
<tr><td><a href="pycairo-1.4.12.tar.gz.md5">pycairo-1.4.12.tar.gz.md5</a></td><td align="right">2007-12-13 06:33 </td><td align="right"> 56 </td><td>&nbsp;</td></tr>
<tr><td><a href="pycairo-1.6.4.tar.gz">pycairo-1.6.4.tar.gz</a></td><td align="right">2008-08-18 11:22 </td><td align="right">480K</td><td>&nbsp;</td></tr>
<tr><td><a href="pycairo-1.6.4.tar.gz.md5">pycairo-1.6.4.tar.gz.md5</a></td><td align="right">2008-08-18 11:24 </td><td align="right"> 55 </td><td>&nbsp;</td></tr>
<tr><td><a href="pycairo-1.8.0.tar.gz">pycairo-1.8.0.tar.gz</a></td><td align="right">2008-12-15 06:43 </td><td align="right">506K</td><td>&nbsp;</td></tr>
<tr><td><a href="pycairo-1.8.0.tar.gz.md5">pycairo-1.8.0.tar.gz.md5</a></td><td align="right">2008-12-15 06:43 </td><td align="right"> 55 </td><td>&nbsp;</td></tr>
<tr><td><a href="pycairo-1.8.2.tar.gz">pycairo-1.8.2.tar.gz</a></td><td align="right">2009-01-15 09:42 </td><td align="right">507K</td><td>&nbsp;</td></tr>
<tr><td><a href="pycairo-1.8.2.tar.gz.md5">pycairo-1.8.2.tar.gz.md5</a></td><td align="right">2009-01-15 09:42 </td><td align="right"> 55 </td><td>&nbsp;</td></tr>
<tr><td><a href="pycairo-1.8.4.tar.gz">pycairo-1.8.4.tar.gz</a></td><td align="right">2009-03-19 08:51 </td><td align="right">509K</td><td>&nbsp;</td></tr>
<tr><td><a href="pycairo-1.8.4.tar.gz.md5">pycairo-1.8.4.tar.gz.md5</a></td><td align="right">2009-03-19 08:51 </td><td align="right"> 55 </td><td>&nbsp;</td></tr>
<tr><td><a href="pycairo-1.8.6-docs-html.tar.bz2">pycairo-1.8.6-docs-html.tar.bz2</a></td><td align="right">2009-06-25 09:11 </td><td align="right"> 86K</td><td>&nbsp;</td></tr>
<tr><td><a href="pycairo-1.8.6.tar.gz">pycairo-1.8.6.tar.gz</a></td><td align="right">2009-06-25 08:45 </td><td align="right">525K</td><td>&nbsp;</td></tr>
<tr><td><a href="pycairo-1.8.6.tar.gz.md5">pycairo-1.8.6.tar.gz.md5</a></td><td align="right">2009-06-25 08:45 </td><td align="right"> 55 </td><td>&nbsp;</td></tr>
<tr><td><a href="pycairo-1.8.8-docs-html.tar.bz2">pycairo-1.8.8-docs-html.tar.bz2</a></td><td align="right">2009-08-26 11:50 </td><td align="right"> 87K</td><td>&nbsp;</td></tr>
<tr><td><a href="pycairo-1.8.8.tar.gz">pycairo-1.8.8.tar.gz</a></td><td align="right">2009-08-26 11:04 </td><td align="right">465K</td><td>&nbsp;</td></tr>
<tr><td><a href="pycairo-1.8.8.tar.gz.md5">pycairo-1.8.8.tar.gz.md5</a></td><td align="right">2009-08-26 11:04 </td><td align="right"> 55 </td><td>&nbsp;</td></tr>
<tr><td><a href="pycairo-1.8.10.tar.bz2">pycairo-1.8.10.tar.bz2</a></td><td align="right">2010-09-12 13:28 </td><td align="right">252K</td><td>&nbsp;</td></tr>
<tr><td><a href="pycairo-1.8.10.tar.bz2.sha1">pycairo-1.8.10.tar.bz2.sha1</a></td><td align="right">2010-09-12 13:28 </td><td align="right"> 65 </td><td>&nbsp;</td></tr>
<tr><td><a href="pycairo-1.10.0.tar.bz2">pycairo-1.10.0.tar.bz2</a></td><td align="right">2011-04-18 08:23 </td><td align="right">241K</td><td>&nbsp;</td></tr>
<tr><td><a href="pycairo-1.10.0.tar.bz2.sha1">pycairo-1.10.0.tar.bz2.sha1</a></td><td align="right">2011-04-18 08:23 </td><td align="right"> 65 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.0.0.tar.gz">rcairo-1.0.0.tar.gz</a></td><td align="right">2005-10-15 16:02 </td><td align="right"> 41K</td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.0.0.tar.gz.md5">rcairo-1.0.0.tar.gz.md5</a></td><td align="right">2005-10-15 16:02 </td><td align="right"> 54 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.0.0.tar.gz.sha1">rcairo-1.0.0.tar.gz.sha1</a></td><td align="right">2005-10-15 16:02 </td><td align="right"> 62 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.2.0.tar.gz">rcairo-1.2.0.tar.gz</a></td><td align="right">2006-07-01 14:50 </td><td align="right"> 46K</td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.2.0.tar.gz.md5">rcairo-1.2.0.tar.gz.md5</a></td><td align="right">2006-07-01 14:52 </td><td align="right"> 54 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.2.0.tar.gz.sha1">rcairo-1.2.0.tar.gz.sha1</a></td><td align="right">2006-07-01 14:52 </td><td align="right"> 62 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.4.0.tar.gz">rcairo-1.4.0.tar.gz</a></td><td align="right">2007-03-06 12:55 </td><td align="right"> 41K</td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.4.0.tar.gz.md5">rcairo-1.4.0.tar.gz.md5</a></td><td align="right">2007-03-06 12:55 </td><td align="right"> 54 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.4.0.tar.gz.sha1">rcairo-1.4.0.tar.gz.sha1</a></td><td align="right">2007-03-06 12:55 </td><td align="right"> 62 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.4.1.tar.gz">rcairo-1.4.1.tar.gz</a></td><td align="right">2007-03-10 11:54 </td><td align="right"> 42K</td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.4.1.tar.gz.md5">rcairo-1.4.1.tar.gz.md5</a></td><td align="right">2007-03-10 11:54 </td><td align="right"> 54 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.4.1.tar.gz.sha1">rcairo-1.4.1.tar.gz.sha1</a></td><td align="right">2007-03-10 11:54 </td><td align="right"> 62 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.5.0.tar.gz">rcairo-1.5.0.tar.gz</a></td><td align="right">2007-05-27 02:36 </td><td align="right"> 62K</td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.5.0.tar.gz.md5">rcairo-1.5.0.tar.gz.md5</a></td><td align="right">2007-05-27 02:36 </td><td align="right"> 54 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.5.0.tar.gz.sha1">rcairo-1.5.0.tar.gz.sha1</a></td><td align="right">2007-05-27 02:36 </td><td align="right"> 62 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.5.1.tar.gz">rcairo-1.5.1.tar.gz</a></td><td align="right">2008-01-11 13:26 </td><td align="right"> 67K</td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.5.1.tar.gz.md5">rcairo-1.5.1.tar.gz.md5</a></td><td align="right">2008-01-11 13:26 </td><td align="right"> 54 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.5.1.tar.gz.sha1">rcairo-1.5.1.tar.gz.sha1</a></td><td align="right">2008-01-11 13:26 </td><td align="right"> 62 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.6.0.tar.gz">rcairo-1.6.0.tar.gz</a></td><td align="right">2008-04-11 12:46 </td><td align="right">237K</td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.6.0.tar.gz.md5">rcairo-1.6.0.tar.gz.md5</a></td><td align="right">2008-04-11 12:46 </td><td align="right"> 54 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.6.0.tar.gz.sha1">rcairo-1.6.0.tar.gz.sha1</a></td><td align="right">2008-04-11 12:46 </td><td align="right"> 62 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.6.1.tar.gz">rcairo-1.6.1.tar.gz</a></td><td align="right">2008-04-24 12:15 </td><td align="right">195K</td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.6.1.tar.gz.md5">rcairo-1.6.1.tar.gz.md5</a></td><td align="right">2008-04-24 12:15 </td><td align="right"> 54 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.6.1.tar.gz.sha1">rcairo-1.6.1.tar.gz.sha1</a></td><td align="right">2008-04-24 12:15 </td><td align="right"> 62 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.6.2.tar.gz">rcairo-1.6.2.tar.gz</a></td><td align="right">2008-06-14 13:09 </td><td align="right">217K</td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.6.2.tar.gz.md5">rcairo-1.6.2.tar.gz.md5</a></td><td align="right">2008-06-14 13:09 </td><td align="right"> 54 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.6.2.tar.gz.sha1">rcairo-1.6.2.tar.gz.sha1</a></td><td align="right">2008-06-14 13:09 </td><td align="right"> 62 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.6.3.tar.gz">rcairo-1.6.3.tar.gz</a></td><td align="right">2008-07-19 11:16 </td><td align="right">218K</td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.6.3.tar.gz.md5">rcairo-1.6.3.tar.gz.md5</a></td><td align="right">2008-07-19 11:16 </td><td align="right"> 54 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.6.3.tar.gz.sha1">rcairo-1.6.3.tar.gz.sha1</a></td><td align="right">2008-07-19 11:16 </td><td align="right"> 62 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.7.0.tar.gz">rcairo-1.7.0.tar.gz</a></td><td align="right">2008-08-17 08:04 </td><td align="right">272K</td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.7.0.tar.gz.md5">rcairo-1.7.0.tar.gz.md5</a></td><td align="right">2008-08-17 08:04 </td><td align="right"> 54 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.7.0.tar.gz.sha1">rcairo-1.7.0.tar.gz.sha1</a></td><td align="right">2008-08-17 08:04 </td><td align="right"> 62 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.8.0.tar.gz">rcairo-1.8.0.tar.gz</a></td><td align="right">2008-09-26 14:49 </td><td align="right">271K</td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.8.0.tar.gz.md5">rcairo-1.8.0.tar.gz.md5</a></td><td align="right">2008-09-26 14:49 </td><td align="right"> 54 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.8.0.tar.gz.sha1">rcairo-1.8.0.tar.gz.sha1</a></td><td align="right">2008-09-26 14:50 </td><td align="right"> 62 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.8.1.tar.gz">rcairo-1.8.1.tar.gz</a></td><td align="right">2009-12-13 12:13 </td><td align="right">272K</td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.8.1.tar.gz.md5">rcairo-1.8.1.tar.gz.md5</a></td><td align="right">2009-12-13 12:13 </td><td align="right"> 54 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.8.1.tar.gz.sha1">rcairo-1.8.1.tar.gz.sha1</a></td><td align="right">2009-12-13 12:13 </td><td align="right"> 62 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.8.2.tar.gz">rcairo-1.8.2.tar.gz</a></td><td align="right">2010-08-26 12:21 </td><td align="right">259K</td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.8.2.tar.gz.md5">rcairo-1.8.2.tar.gz.md5</a></td><td align="right">2010-08-26 12:21 </td><td align="right"> 54 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.8.2.tar.gz.sha1">rcairo-1.8.2.tar.gz.sha1</a></td><td align="right">2010-08-26 12:21 </td><td align="right"> 62 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.8.3.tar.gz">rcairo-1.8.3.tar.gz</a></td><td align="right">2010-08-26 12:57 </td><td align="right">259K</td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.8.3.tar.gz.md5">rcairo-1.8.3.tar.gz.md5</a></td><td align="right">2010-08-26 12:57 </td><td align="right"> 54 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.8.3.tar.gz.sha1">rcairo-1.8.3.tar.gz.sha1</a></td><td align="right">2010-08-26 12:57 </td><td align="right"> 62 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.8.4.tar.gz">rcairo-1.8.4.tar.gz</a></td><td align="right">2010-08-27 03:36 </td><td align="right">260K</td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.8.4.tar.gz.md5">rcairo-1.8.4.tar.gz.md5</a></td><td align="right">2010-08-27 03:36 </td><td align="right"> 54 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.8.4.tar.gz.sha1">rcairo-1.8.4.tar.gz.sha1</a></td><td align="right">2010-08-27 03:36 </td><td align="right"> 62 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.8.5.tar.gz">rcairo-1.8.5.tar.gz</a></td><td align="right">2010-08-28 00:43 </td><td align="right">260K</td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.8.5.tar.gz.md5">rcairo-1.8.5.tar.gz.md5</a></td><td align="right">2010-08-28 00:43 </td><td align="right"> 54 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.8.5.tar.gz.sha1">rcairo-1.8.5.tar.gz.sha1</a></td><td align="right">2010-08-28 00:43 </td><td align="right"> 62 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.10.0.tar.gz">rcairo-1.10.0.tar.gz</a></td><td align="right">2010-09-12 07:21 </td><td align="right">215K</td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.10.0.tar.gz.md5">rcairo-1.10.0.tar.gz.md5</a></td><td align="right">2010-09-12 07:21 </td><td align="right"> 55 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.10.0.tar.gz.sha1">rcairo-1.10.0.tar.gz.sha1</a></td><td align="right">2010-09-12 07:21 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.10.1.tar.gz">rcairo-1.10.1.tar.gz</a></td><td align="right">2011-10-12 13:51 </td><td align="right">216K</td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.10.1.tar.gz.md5">rcairo-1.10.1.tar.gz.md5</a></td><td align="right">2011-10-12 13:51 </td><td align="right"> 55 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.10.1.tar.gz.sha1">rcairo-1.10.1.tar.gz.sha1</a></td><td align="right">2011-10-12 13:51 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.10.2.tar.gz">rcairo-1.10.2.tar.gz</a></td><td align="right">2011-11-20 05:13 </td><td align="right"> 84K</td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.10.2.tar.gz.md5">rcairo-1.10.2.tar.gz.md5</a></td><td align="right">2011-11-20 05:13 </td><td align="right"> 55 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.10.2.tar.gz.sha1">rcairo-1.10.2.tar.gz.sha1</a></td><td align="right">2011-11-20 05:13 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.12.0.tar.gz">rcairo-1.12.0.tar.gz</a></td><td align="right">2012-03-25 10:26 </td><td align="right"> 89K</td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.12.0.tar.gz.md5">rcairo-1.12.0.tar.gz.md5</a></td><td align="right">2012-03-25 10:26 </td><td align="right"> 55 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.12.0.tar.gz.sha1">rcairo-1.12.0.tar.gz.sha1</a></td><td align="right">2012-03-25 10:26 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.12.1.tar.gz">rcairo-1.12.1.tar.gz</a></td><td align="right">2012-03-31 07:05 </td><td align="right"> 89K</td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.12.1.tar.gz.md5">rcairo-1.12.1.tar.gz.md5</a></td><td align="right">2012-03-31 07:05 </td><td align="right"> 55 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.12.1.tar.gz.sha1">rcairo-1.12.1.tar.gz.sha1</a></td><td align="right">2012-03-31 07:05 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.12.2.tar.gz">rcairo-1.12.2.tar.gz</a></td><td align="right">2012-06-03 09:32 </td><td align="right"> 91K</td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.12.2.tar.gz.md5">rcairo-1.12.2.tar.gz.md5</a></td><td align="right">2012-06-03 09:32 </td><td align="right"> 55 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.12.2.tar.gz.sha1">rcairo-1.12.2.tar.gz.sha1</a></td><td align="right">2012-06-03 09:32 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.12.6.tar.gz">rcairo-1.12.6.tar.gz</a></td><td align="right">2013-05-24 13:12 </td><td align="right"> 93K</td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.12.6.tar.gz.md5">rcairo-1.12.6.tar.gz.md5</a></td><td align="right">2013-05-24 13:12 </td><td align="right"> 55 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.12.6.tar.gz.sha1">rcairo-1.12.6.tar.gz.sha1</a></td><td align="right">2013-05-24 13:12 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.12.7.tar.gz">rcairo-1.12.7.tar.gz</a></td><td align="right">2013-12-23 13:21 </td><td align="right"> 94K</td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.12.7.tar.gz.md5">rcairo-1.12.7.tar.gz.md5</a></td><td align="right">2013-12-23 13:21 </td><td align="right"> 55 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.12.7.tar.gz.sha1">rcairo-1.12.7.tar.gz.sha1</a></td><td align="right">2013-12-23 13:21 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.12.8.tar.gz">rcairo-1.12.8.tar.gz</a></td><td align="right">2013-12-23 13:40 </td><td align="right"> 94K</td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.12.8.tar.gz.md5">rcairo-1.12.8.tar.gz.md5</a></td><td align="right">2013-12-23 13:40 </td><td align="right"> 55 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.12.8.tar.gz.sha1">rcairo-1.12.8.tar.gz.sha1</a></td><td align="right">2013-12-23 13:40 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.12.9.tar.gz">rcairo-1.12.9.tar.gz</a></td><td align="right">2014-04-05 06:14 </td><td align="right"> 95K</td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.12.9.tar.gz.md5">rcairo-1.12.9.tar.gz.md5</a></td><td align="right">2014-04-05 06:14 </td><td align="right"> 55 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.12.9.tar.gz.sha1">rcairo-1.12.9.tar.gz.sha1</a></td><td align="right">2014-04-05 06:14 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.14.0.tar.gz">rcairo-1.14.0.tar.gz</a></td><td align="right">2014-11-24 11:56 </td><td align="right"> 99K</td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.14.0.tar.gz.md5">rcairo-1.14.0.tar.gz.md5</a></td><td align="right">2014-11-24 11:56 </td><td align="right"> 55 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.14.0.tar.gz.sha1">rcairo-1.14.0.tar.gz.sha1</a></td><td align="right">2014-11-24 11:56 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.14.1.tar.gz">rcairo-1.14.1.tar.gz</a></td><td align="right">2014-12-23 10:11 </td><td align="right"> 99K</td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.14.1.tar.gz.md5">rcairo-1.14.1.tar.gz.md5</a></td><td align="right">2014-12-23 10:11 </td><td align="right"> 55 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.14.1.tar.gz.sha1">rcairo-1.14.1.tar.gz.sha1</a></td><td align="right">2014-12-23 10:11 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.15.2.tar.gz">rcairo-1.15.2.tar.gz</a></td><td align="right">2016-04-03 01:06 </td><td align="right"> 99K</td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.15.2.tar.gz.md5">rcairo-1.15.2.tar.gz.md5</a></td><td align="right">2016-04-03 01:06 </td><td align="right"> 55 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.15.2.tar.gz.sha1">rcairo-1.15.2.tar.gz.sha1</a></td><td align="right">2016-04-03 01:06 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.15.4.tar.gz">rcairo-1.15.4.tar.gz</a></td><td align="right">2017-01-06 16:14 </td><td align="right">102K</td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.15.4.tar.gz.md5">rcairo-1.15.4.tar.gz.md5</a></td><td align="right">2017-01-06 16:14 </td><td align="right"> 55 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.15.4.tar.gz.sha1">rcairo-1.15.4.tar.gz.sha1</a></td><td align="right">2017-01-06 16:14 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.15.5.tar.gz">rcairo-1.15.5.tar.gz</a></td><td align="right">2017-01-14 02:09 </td><td align="right">103K</td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.15.5.tar.gz.md5">rcairo-1.15.5.tar.gz.md5</a></td><td align="right">2017-01-14 02:09 </td><td align="right"> 55 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.15.5.tar.gz.sha1">rcairo-1.15.5.tar.gz.sha1</a></td><td align="right">2017-01-14 02:09 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.15.6.tar.gz">rcairo-1.15.6.tar.gz</a></td><td align="right">2017-04-27 01:44 </td><td align="right">102K</td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.15.6.tar.gz.md5">rcairo-1.15.6.tar.gz.md5</a></td><td align="right">2017-04-27 01:44 </td><td align="right"> 55 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.15.6.tar.gz.sha1">rcairo-1.15.6.tar.gz.sha1</a></td><td align="right">2017-04-27 01:44 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.15.7.tar.gz">rcairo-1.15.7.tar.gz</a></td><td align="right">2017-05-01 10:58 </td><td align="right">102K</td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.15.7.tar.gz.md5">rcairo-1.15.7.tar.gz.md5</a></td><td align="right">2017-05-01 10:58 </td><td align="right"> 55 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.15.7.tar.gz.sha1">rcairo-1.15.7.tar.gz.sha1</a></td><td align="right">2017-05-01 10:58 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.15.9.tar.gz">rcairo-1.15.9.tar.gz</a></td><td align="right">2017-06-03 12:50 </td><td align="right">106K</td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.15.9.tar.gz.md5">rcairo-1.15.9.tar.gz.md5</a></td><td align="right">2017-06-03 12:50 </td><td align="right"> 55 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.15.9.tar.gz.sha1">rcairo-1.15.9.tar.gz.sha1</a></td><td align="right">2017-06-03 12:50 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.15.10.tar.gz">rcairo-1.15.10.tar.gz</a></td><td align="right">2017-10-15 14:21 </td><td align="right">106K</td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.15.10.tar.gz.md5">rcairo-1.15.10.tar.gz.md5</a></td><td align="right">2017-10-15 14:21 </td><td align="right"> 56 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.15.10.tar.gz.sha1">rcairo-1.15.10.tar.gz.sha1</a></td><td align="right">2017-10-15 14:21 </td><td align="right"> 64 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.15.11.tar.gz">rcairo-1.15.11.tar.gz</a></td><td align="right">2017-12-14 07:41 </td><td align="right">107K</td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.15.11.tar.gz.md5">rcairo-1.15.11.tar.gz.md5</a></td><td align="right">2017-12-14 07:41 </td><td align="right"> 56 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.15.11.tar.gz.sha1">rcairo-1.15.11.tar.gz.sha1</a></td><td align="right">2017-12-14 07:41 </td><td align="right"> 64 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.15.12.tar.gz">rcairo-1.15.12.tar.gz</a></td><td align="right">2018-03-15 01:37 </td><td align="right">107K</td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.15.12.tar.gz.md5">rcairo-1.15.12.tar.gz.md5</a></td><td align="right">2018-03-15 01:37 </td><td align="right"> 56 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.15.12.tar.gz.sha1">rcairo-1.15.12.tar.gz.sha1</a></td><td align="right">2018-03-15 01:37 </td><td align="right"> 64 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.15.13.tar.gz">rcairo-1.15.13.tar.gz</a></td><td align="right">2018-05-01 13:19 </td><td align="right">107K</td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.15.13.tar.gz.md5">rcairo-1.15.13.tar.gz.md5</a></td><td align="right">2018-05-01 13:19 </td><td align="right"> 56 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.15.13.tar.gz.sha1">rcairo-1.15.13.tar.gz.sha1</a></td><td align="right">2018-05-01 13:19 </td><td align="right"> 64 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.15.14.tar.gz">rcairo-1.15.14.tar.gz</a></td><td align="right">2018-08-20 07:55 </td><td align="right">108K</td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.15.14.tar.gz.md5">rcairo-1.15.14.tar.gz.md5</a></td><td align="right">2018-08-20 07:55 </td><td align="right"> 56 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.15.14.tar.gz.sha1">rcairo-1.15.14.tar.gz.sha1</a></td><td align="right">2018-08-20 07:55 </td><td align="right"> 64 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.16.0.tar.gz">rcairo-1.16.0.tar.gz</a></td><td align="right">2018-10-28 05:36 </td><td align="right">108K</td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.16.0.tar.gz.md5">rcairo-1.16.0.tar.gz.md5</a></td><td align="right">2018-10-28 05:36 </td><td align="right"> 55 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.16.0.tar.gz.sha1">rcairo-1.16.0.tar.gz.sha1</a></td><td align="right">2018-10-28 05:36 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.16.2.tar.gz">rcairo-1.16.2.tar.gz</a></td><td align="right">2018-10-31 05:57 </td><td align="right">102K</td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.16.2.tar.gz.md5">rcairo-1.16.2.tar.gz.md5</a></td><td align="right">2018-10-31 05:57 </td><td align="right"> 55 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.16.2.tar.gz.sha1">rcairo-1.16.2.tar.gz.sha1</a></td><td align="right">2018-10-31 05:57 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.16.3.tar.gz">rcairo-1.16.3.tar.gz</a></td><td align="right">2019-03-09 04:03 </td><td align="right">197K</td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.16.3.tar.gz.md5">rcairo-1.16.3.tar.gz.md5</a></td><td align="right">2019-03-09 04:03 </td><td align="right"> 55 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.16.3.tar.gz.sha1">rcairo-1.16.3.tar.gz.sha1</a></td><td align="right">2019-03-09 04:03 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.16.4.tar.gz">rcairo-1.16.4.tar.gz</a></td><td align="right">2019-03-09 04:36 </td><td align="right">197K</td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.16.4.tar.gz.md5">rcairo-1.16.4.tar.gz.md5</a></td><td align="right">2019-03-09 04:36 </td><td align="right"> 55 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.16.4.tar.gz.sha1">rcairo-1.16.4.tar.gz.sha1</a></td><td align="right">2019-03-09 04:36 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.16.5.tar.gz">rcairo-1.16.5.tar.gz</a></td><td align="right">2020-02-02 21:00 </td><td align="right">200K</td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.16.5.tar.gz.md5">rcairo-1.16.5.tar.gz.md5</a></td><td align="right">2020-02-02 21:00 </td><td align="right"> 55 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.16.5.tar.gz.sha1">rcairo-1.16.5.tar.gz.sha1</a></td><td align="right">2020-02-02 21:00 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.16.6.tar.gz">rcairo-1.16.6.tar.gz</a></td><td align="right">2020-07-22 20:57 </td><td align="right">200K</td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.16.6.tar.gz.md5">rcairo-1.16.6.tar.gz.md5</a></td><td align="right">2020-07-22 20:57 </td><td align="right"> 55 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.16.6.tar.gz.sha1">rcairo-1.16.6.tar.gz.sha1</a></td><td align="right">2020-07-22 20:57 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.17.4.tar.gz">rcairo-1.17.4.tar.gz</a></td><td align="right">2021-01-16 21:49 </td><td align="right">200K</td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.17.4.tar.gz.md5">rcairo-1.17.4.tar.gz.md5</a></td><td align="right">2021-01-16 21:49 </td><td align="right"> 55 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.17.4.tar.gz.sha1">rcairo-1.17.4.tar.gz.sha1</a></td><td align="right">2021-01-16 21:49 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.17.6.tar.gz">rcairo-1.17.6.tar.gz</a></td><td align="right">2022-07-30 08:13 </td><td align="right">201K</td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.17.6.tar.gz.md5">rcairo-1.17.6.tar.gz.md5</a></td><td align="right">2022-07-30 08:13 </td><td align="right"> 55 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.17.6.tar.gz.sha1">rcairo-1.17.6.tar.gz.sha1</a></td><td align="right">2022-07-30 08:13 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.17.7.tar.gz">rcairo-1.17.7.tar.gz</a></td><td align="right">2022-07-31 13:46 </td><td align="right">202K</td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.17.7.tar.gz.md5">rcairo-1.17.7.tar.gz.md5</a></td><td align="right">2022-07-31 13:46 </td><td align="right"> 55 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.17.7.tar.gz.sha1">rcairo-1.17.7.tar.gz.sha1</a></td><td align="right">2022-07-31 13:46 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.17.8.tar.gz">rcairo-1.17.8.tar.gz</a></td><td align="right">2022-09-01 07:22 </td><td align="right">202K</td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.17.8.tar.gz.md5">rcairo-1.17.8.tar.gz.md5</a></td><td align="right">2022-09-01 07:22 </td><td align="right"> 55 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.17.8.tar.gz.sha1">rcairo-1.17.8.tar.gz.sha1</a></td><td align="right">2022-09-01 07:22 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.17.9.tar.gz">rcairo-1.17.9.tar.gz</a></td><td align="right">2023-06-14 08:17 </td><td align="right">202K</td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.17.9.tar.gz.md5">rcairo-1.17.9.tar.gz.md5</a></td><td align="right">2023-06-14 08:17 </td><td align="right"> 55 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.17.9.tar.gz.sha1">rcairo-1.17.9.tar.gz.sha1</a></td><td align="right">2023-06-14 08:17 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.17.10.tar.gz">rcairo-1.17.10.tar.gz</a></td><td align="right">2023-06-16 01:56 </td><td align="right">202K</td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.17.10.tar.gz.md5">rcairo-1.17.10.tar.gz.md5</a></td><td align="right">2023-06-16 01:56 </td><td align="right"> 56 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.17.10.tar.gz.sha1">rcairo-1.17.10.tar.gz.sha1</a></td><td align="right">2023-06-16 01:56 </td><td align="right"> 64 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.17.11.tar.gz">rcairo-1.17.11.tar.gz</a></td><td align="right">2023-06-16 02:42 </td><td align="right">202K</td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.17.11.tar.gz.md5">rcairo-1.17.11.tar.gz.md5</a></td><td align="right">2023-06-16 02:42 </td><td align="right"> 56 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.17.11.tar.gz.sha1">rcairo-1.17.11.tar.gz.sha1</a></td><td align="right">2023-06-16 02:42 </td><td align="right"> 64 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.17.11.tar.gz.sha256">rcairo-1.17.11.tar.gz.sha256</a></td><td align="right">2023-06-16 02:42 </td><td align="right"> 88 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.17.12.tar.gz">rcairo-1.17.12.tar.gz</a></td><td align="right">2023-06-16 20:44 </td><td align="right">202K</td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.17.12.tar.gz.md5">rcairo-1.17.12.tar.gz.md5</a></td><td align="right">2023-06-16 20:44 </td><td align="right"> 56 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.17.12.tar.gz.sha1">rcairo-1.17.12.tar.gz.sha1</a></td><td align="right">2023-06-16 20:44 </td><td align="right"> 64 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.17.12.tar.gz.sha256">rcairo-1.17.12.tar.gz.sha256</a></td><td align="right">2023-06-16 20:44 </td><td align="right"> 88 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.17.13.tar.gz">rcairo-1.17.13.tar.gz</a></td><td align="right">2023-12-18 06:19 </td><td align="right">202K</td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.17.13.tar.gz.md5">rcairo-1.17.13.tar.gz.md5</a></td><td align="right">2023-12-18 06:19 </td><td align="right"> 56 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.17.13.tar.gz.sha1">rcairo-1.17.13.tar.gz.sha1</a></td><td align="right">2023-12-18 06:19 </td><td align="right"> 64 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.17.13.tar.gz.sha256">rcairo-1.17.13.tar.gz.sha256</a></td><td align="right">2023-12-18 06:19 </td><td align="right"> 88 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.17.14.tar.gz">rcairo-1.17.14.tar.gz</a></td><td align="right">2024-12-20 22:32 </td><td align="right">203K</td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.17.14.tar.gz.md5">rcairo-1.17.14.tar.gz.md5</a></td><td align="right">2024-12-20 22:32 </td><td align="right"> 56 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.17.14.tar.gz.sha1">rcairo-1.17.14.tar.gz.sha1</a></td><td align="right">2024-12-20 22:32 </td><td align="right"> 64 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.17.14.tar.gz.sha256">rcairo-1.17.14.tar.gz.sha256</a></td><td align="right">2024-12-20 22:32 </td><td align="right"> 88 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.18.4.tar.gz">rcairo-1.18.4.tar.gz</a></td><td align="right">2025-03-12 02:51 </td><td align="right">203K</td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.18.4.tar.gz.md5">rcairo-1.18.4.tar.gz.md5</a></td><td align="right">2025-03-12 02:51 </td><td align="right"> 55 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.18.4.tar.gz.sha1">rcairo-1.18.4.tar.gz.sha1</a></td><td align="right">2025-03-12 02:51 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.18.4.tar.gz.sha256">rcairo-1.18.4.tar.gz.sha256</a></td><td align="right">2025-03-12 02:51 </td><td align="right"> 87 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.18.5.tar.gz">rcairo-1.18.5.tar.gz</a></td><td align="right">2026-04-03 08:36 </td><td align="right">202K</td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.18.5.tar.gz.md5">rcairo-1.18.5.tar.gz.md5</a></td><td align="right">2026-04-03 08:36 </td><td align="right"> 55 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.18.5.tar.gz.sha1">rcairo-1.18.5.tar.gz.sha1</a></td><td align="right">2026-04-03 08:36 </td><td align="right"> 63 </td><td>&nbsp;</td></tr>
<tr><td><a href="rcairo-1.18.5.tar.gz.sha256">rcairo-1.18.5.tar.gz.sha256</a></td><td align="right">2026-04-03 08:36 </td><td align="right"> 87 </td><td>&nbsp;</td></tr>
<tr><th colspan="4"><hr></th></tr>
</table>
<address>Apache Server at cairographics.org Port 443</address>
</body></html>
+72 -17
View File
@@ -1,7 +1,7 @@
# RED BEAR OS BUILD SYSTEM — PROJECT KNOWLEDGE BASE # RED BEAR OS BUILD SYSTEM — PROJECT KNOWLEDGE BASE
**Generated:** 2026-04-12 (P1/P2 complete) **Generated:** 2026-04-12 (P1/P2 complete)
**Toolchain:** Rust nightly-2025-10-03 (edition 2024) **Toolchain:** Rust nightly-2026-05-24 (edition 2024)
**Architecture:** Microkernel OS in Rust, ~38k files, ~294k LoC Rust **Architecture:** Microkernel OS in Rust, ~38k files, ~294k LoC Rust
**Target Hardware**: AMD64 bare metal, with AMD and Intel machines treated as equal-priority Red Bear OS targets **Target Hardware**: AMD64 bare metal, with AMD and Intel machines treated as equal-priority Red Bear OS targets
@@ -34,8 +34,8 @@ No "this seems too heavy for mini". **When in doubt: KEEP IT AND FIX IT.**
This rule exists because agents have repeatedly destroyed months of work by deciding This rule exists because agents have repeatedly destroyed months of work by deciding
packages were "unnecessary" and silently removing them during syncs and config changes. packages were "unnecessary" and silently removing them during syncs and config changes.
The current baseline is **Red Bear OS 0.1.0** (Redox snapshot at build-system commit `f55acba68`). The current baseline is **Red Bear OS 0.3.1** (Redox snapshot at build-system commit `f55acba68`).
All recipe sources are pinned and archived in `sources/redbear-0.1.0/`. All recipe sources are pinned and archived in `sources/redbear-0.3.1/`.
## STRUCTURE ## STRUCTURE
@@ -69,7 +69,7 @@ redox-master/
├── .cargo/ # Cargo config: linker per target (aarch64, x86_64, i586, i686, riscv64gc) ├── .cargo/ # Cargo config: linker per target (aarch64, x86_64, i586, i686, riscv64gc)
├── Makefile # Root orchestrator (all, live, image, rebuild, clean, qemu, gdb) ├── Makefile # Root orchestrator (all, live, image, rebuild, clean, qemu, gdb)
├── Cargo.toml # Cookbook crate: binaries (repo, repo_builder), lib (cookbook) ├── Cargo.toml # Cookbook crate: binaries (repo, repo_builder), lib (cookbook)
├── rust-toolchain.toml # nightly-2025-10-03 + rust-src + rustfmt + clippy ├── rust-toolchain.toml # nightly-2026-05-24 + rust-src + rustfmt + clippy
└── .config # PODMAN_BUILD=0 (set to 1 for container builds) └── .config # PODMAN_BUILD=0 (set to 1 for container builds)
``` ```
@@ -101,7 +101,7 @@ redox-master/
```bash ```bash
# Prerequisites (Linux x86_64 host) # Prerequisites (Linux x86_64 host)
# rustup + nightly-2025-10-03, cargo install just cbedgen, nasm, qemu-system-x86 # rustup + nightly-2026-05-24, cargo install just cbedgen, nasm, qemu-system-x86
# See docs/06-BUILD-SYSTEM-SETUP.md for distro-specific packages # See docs/06-BUILD-SYSTEM-SETUP.md for distro-specific packages
# Configuration # Configuration
@@ -272,11 +272,16 @@ Layer 4: User/group creation (passwd, shadow, group)
- **Config `[[files]]` entries MUST NOT use `/usr/lib/init.d/` paths for init services** - **Config `[[files]]` entries MUST NOT use `/usr/lib/init.d/` paths for init services**
- Run `make lint-config` to detect violations - Run `make lint-config` to detect violations
### Collision Detection ### Collision Detection (status as of 2026-07-12)
The installer now includes a `CollisionTracker` (in `collision.rs`) that detects when package > **Honest status:** runtime package-vs-config collision detection is NOT yet
staging overwrites config pre-install files. Init service collisions always error. Other > implemented. Init-service path collisions ARE detected at build-config lint
collisions warn by default, error in strict mode (`REDBEAR_STRICT_COLLISION=1`). > time via `scripts/lint-config-paths.sh`, which runs as `make lint-config`.
> General runtime collisions (a config `[[files]]` writing to the same path as
> a package stages during install) are not yet caught. See
> `local/docs/COLLISION-DETECTION-STATUS.md` for the full audit and the
> planned Phase 1 fix. Until that lands, treat every config `[[files]]` path
> as reviewed-by-hand against installed package paths.
### Validation Gates ### Validation Gates
@@ -338,7 +343,7 @@ only inside a fetched source tree is not preserved.
**Why:** `make distclean`, `make clean`, and source immutable archivedes all **Why:** `make distclean`, `make clean`, and source immutable archivedes all
discard or replace `recipes/*/source/` trees. Only `local/patches/`, `local/recipes/`, discard or replace `recipes/*/source/` trees. Only `local/patches/`, `local/recipes/`,
tracked configs, `local/docs/`, and `sources/redbear-0.1.0/` survive. tracked configs, `local/docs/`, and `sources/redbear-0.3.1/` survive.
**Examples of changes that require immediate patching:** **Examples of changes that require immediate patching:**
@@ -466,10 +471,14 @@ script (or equivalent `repo bump-fork <component>` command) MUST:
backward compatibility for recipes that reference the `recipes/` path while backward compatibility for recipes that reference the `recipes/` path while
still preferring the local fork as the source of truth. still preferring the local fork as the source of truth.
**Implementation status**: Detection is partially implemented via Cargo's **Implementation status**: Detection is fully implemented across 5 tools:
own lockfile collision errors. Full automatic detection and remediation - `sync-versions.sh`: Cat 0 (cookbook) + Cat 1 (in-house) + Cat 2 (fork +rb suffix) versions
requires changes to `src/cook/fetch.rs` (version comparison logic) and the - `verify-fork-versions.sh`: Cat 2 fork supremacy + content check vs upstream tag
addition of `local/scripts/bump-fork.sh`. Until fully automated, the manual - `verify-patch-content.py`: orphan-patch detection + operator-decision automation
- `bump-fork.sh` + `upgrade-forks.sh`: fork rebase + patch reapplication
- `push-fork-branches.sh`: operator-reviewed fork push helper
See `local/docs/HOOKS.md` for the full tool inventory (10 tools as of Phase 9.2).
process is: process is:
1. `cd local/sources/<component>` 1. `cd local/sources/<component>`
2. Edit `Cargo.toml` version field to match upstream 2. Edit `Cargo.toml` version field to match upstream
@@ -481,14 +490,14 @@ process is:
Red Bear OS is a **fork with frozen sources**. The cookbook tool defaults to Red Bear OS is a **fork with frozen sources**. The cookbook tool defaults to
`COOKBOOK_OFFLINE=true` (changed from upstream Redox's `false`). Builds use archived `COOKBOOK_OFFLINE=true` (changed from upstream Redox's `false`). Builds use archived
sources from `sources/redbear-0.1.0/` — no network access during compilation. sources from `sources/redbear-0.3.1/` — no network access during compilation.
To allow online fetching for non-protected development recipes, use the `--upstream` flag: To allow online fetching for non-protected development recipes, use the `--upstream` flag:
```bash ```bash
./local/scripts/build-redbear.sh --upstream redbear-mini ./local/scripts/build-redbear.sh --upstream redbear-mini
``` ```
In release mode (`REDBEAR_RELEASE=0.1.0`), online fetching is **completely disabled** In release mode (`REDBEAR_RELEASE=0.3.1`), online fetching is **completely disabled**
even with `COOKBOOK_OFFLINE=false`. Sources are immutable in release mode. even with `COOKBOOK_OFFLINE=false`. Sources are immutable in release mode.
**For development with local forks** (see "LOCAL FORK MODEL" in `local/AGENTS.md`), **For development with local forks** (see "LOCAL FORK MODEL" in `local/AGENTS.md`),
@@ -610,6 +619,52 @@ For quirks and driver support specifically:
- if duplication is temporarily unavoidable, treat it as convergence work to remove, not as a - if duplication is temporarily unavoidable, treat it as convergence work to remove, not as a
permanent design. permanent design.
### Orphan-Patch Supersession Decision Tree
When `local/scripts/verify-patch-content.sh` reports that a patch in
`local/patches/<comp>/` is no longer present in the fork HEAD
(orphan), the default action is **NOT** to reapply the patch. Follow
this decision tree instead (per `local/docs/PATCH-PRESERVATION-AUDIT-2026-07-12.md`):
```
1. Run 'git -C local/sources/<comp> log --all --oneline -i --grep <topic-kw>'
where <topic-kw> is extracted from the orphan's filename.
2. ALSO check the target file's git log:
'git -C local/sources/<comp> log --oneline -- <target-file>'
3. Classify the orphan into one of three buckets:
(a) SUPERSEDED upstream
= Red Bear itself rewrote the function and superseded it
(e.g. acpid/mcfg migration).
Action: MOVE patch to local/patches/legacy-superseded-<date>/<comp>/
ALSO: if the fork's content covers the same need, no other action.
(b) INTEGRATED via different commit
= Fork already has commits touching the same file/topic, just
under different commit subjects (typical of mega-absorption
patterns).
Action: MOVE patch to local/patches/legacy-superseded-<date>/<comp>/
Verification: confirm fork's grep shows new equivalent code.
(c) MISSING-UPSTREAM (genuine gap)
= Fork has no commits touching the topic AND no upstream alternative.
Action: try `patch -p1 --fuzz=5` (file structure may have drifted).
If still fails: requires fork rebase via upgrade-forks.sh.
Mark patch as 'Phase 2.4+ work' and leave in local/patches/<comp>/.
Special cases (always SUPERSEDED regardless of fork state):
- 'bump' patches naming 'redox-scheme', 'syscall', or 'rb': managed
automatically by 'sync-versions.sh' (Cat 2 fork version +rb suffix).
- 'ecosystem-pins' patches: managed by Local Fork Supremacy Policy +
AGENTS.md 'Latest-upstream-before-freeze rule'.
This decision tree is wired into the operator workflow by Phase 2.1
audit + Phase 2.2 manual review + SUPERSEDED.md audit log entries.
Future fork-upstream sync operators should run 'verify-patch-content.sh'
on every fork upgrade and apply this decision tree before any attempt to
reapply orphan patches.
### Structure ### Structure
``` ```
@@ -661,7 +716,7 @@ local/patches/
### Release Model (Fork) ### Release Model (Fork)
Red Bear OS is a full fork based on frozen Redox snapshots. Sources are immutable Red Bear OS is a full fork based on frozen Redox snapshots. Sources are immutable
and never auto-immutable archived. The current baseline is 0.1.0. and never auto-immutable archived. The current baseline is 0.3.1 (sources archive at sources/redbear-0.1.0/ is the LAST frozen release; current branch builds from local/sources/ forks).
```bash ```bash
# Check for newer Redox snapshots (read-only, zero side effects): # Check for newer Redox snapshots (read-only, zero side effects):
Generated
+308 -279
View File
File diff suppressed because it is too large Load Diff
+5 -1
View File
@@ -1,6 +1,10 @@
[package] [package]
name = "redbear_cookbook" name = "redbear_cookbook"
version = "0.2.5" # IMPORTANT: keep in lock-step with the current Red Bear OS release branch.
# `local/scripts/sync-versions.sh` updates this field on every branch bump,
# so the cookbook binary always reports the correct OS version it builds.
# Branch 0.3.1 as of 2026-07-12.
version = "0.3.1"
authors = ["Jeremy Soller <jackpot51@gmail.com>"] authors = ["Jeremy Soller <jackpot51@gmail.com>"]
edition = "2024" edition = "2024"
default-run = "repo" default-run = "repo"
+14 -3
View File
@@ -19,8 +19,8 @@
## What is Red Bear OS? ## What is Red Bear OS?
Red Bear OS is a general-purpose, Unix-like operating system with a **microkernel architecture**, Red Bear OS is a general-purpose, Unix-like operating system with a **microkernel architecture**,
written entirely in **Rust**. It is a full fork of Redox OS (baseline 0.1.0), actively developed written entirely in **Rust**. It is a full fork of Redox OS (baseline 0.3.1), actively developed
on branch `0.2.5` with hardware enablement, multiple filesystems, a native greeter and login on branch `0.3.1` with hardware enablement, multiple filesystems, a native greeter and login
system, and a KDE Plasma desktop path. system, and a KDE Plasma desktop path.
We aim to stay close to upstream Redox — diverging only where necessary to add missing We aim to stay close to upstream Redox — diverging only where necessary to add missing
@@ -115,7 +115,7 @@ make qemu
Red Bear OS **boots to a login prompt** in QEMU with working wired networking, D-Bus system bus, Red Bear OS **boots to a login prompt** in QEMU with working wired networking, D-Bus system bus,
hardware detection daemons, and three filesystem backends (RedoxFS, ext4, FAT). The ISO builds hardware detection daemons, and three filesystem backends (RedoxFS, ext4, FAT). The ISO builds
successfully on branch `0.2.5`. Graphics packages are frozen at latest upstream stable successfully on branch `0.3.1`. Graphics packages are frozen at latest upstream stable
(Qt 6.11.1, KF6 6.27.0, Plasma 6.7.2, SDDM 0.21.0, Mesa 24.0.8). (Qt 6.11.1, KF6 6.27.0, Plasma 6.7.2, SDDM 0.21.0, Mesa 24.0.8).
| Area | Status | | Area | Status |
@@ -203,6 +203,11 @@ Red Bear OS operates under strict discipline. Full policies: [`local/AGENTS.md`]
- [Greeter & Login](local/docs/GREETER-LOGIN-IMPLEMENTATION-PLAN.md) — Native greeter, auth daemon, session launch - [Greeter & Login](local/docs/GREETER-LOGIN-IMPLEMENTATION-PLAN.md) — Native greeter, auth daemon, session launch
- [DRM Modernization](local/docs/DRM-MODERNIZATION-EXECUTION-PLAN.md) — DRM/KMS display and render maturity - [DRM Modernization](local/docs/DRM-MODERNIZATION-EXECUTION-PLAN.md) — DRM/KMS display and render maturity
- [USB Plan](local/docs/USB-IMPLEMENTATION-PLAN.md) — USB stack design and implementation - [USB Plan](local/docs/USB-IMPLEMENTATION-PLAN.md) — USB stack design and implementation
- [Patch Preservation Audit](local/docs/PATCH-PRESERVATION-AUDIT-2026-07-12.md) — orphan-patch governance, Rounds 1-6 audit results, SUPERSEDED.md log
- [Collision Detection Status](local/docs/COLLISION-DETECTION-STATUS.md) — runtime collision-detection current state
- [Hooks](local/docs/HOOKS.md) — opt-in git hooks (pre-push safety net, etc.)
- [Build Tools](local/scripts/TOOLS.md) — 10-tool reference (patch-status, sync, verify, collision, etc.)
- [Fork Push Status](local/docs/fork-push-status/2026-07-12-Round-9-phase-8.3.md) — fork-branch push results + base deadlock (updated Round 9)
- [WiFi Plan](local/docs/WIFI-IMPLEMENTATION-PLAN.md) — Wireless architecture and driver plan - [WiFi Plan](local/docs/WIFI-IMPLEMENTATION-PLAN.md) — Wireless architecture and driver plan
- [Bluetooth Plan](local/docs/BLUETOOTH-IMPLEMENTATION-PLAN.md) — Bluetooth stack design - [Bluetooth Plan](local/docs/BLUETOOTH-IMPLEMENTATION-PLAN.md) — Bluetooth stack design
- [Build Cache](local/docs/BUILD-CACHE-PLAN.md) — Content-hash (BLAKE3) build cache system - [Build Cache](local/docs/BUILD-CACHE-PLAN.md) — Content-hash (BLAKE3) build cache system
@@ -222,6 +227,12 @@ local/
├── sources/ # Local forks of core components (kernel, relibc, base, bootloader, …) ├── sources/ # Local forks of core components (kernel, relibc, base, bootloader, …)
├── recipes/ # Custom packages — drivers, GPU stack, system daemons, branding ├── recipes/ # Custom packages — drivers, GPU stack, system daemons, branding
├── patches/ # Durable changes to upstream source trees ├── patches/ # Durable changes to upstream source trees
│ └── (orphan-patch governance: every patch must correspond to work
│ present in the matching fork source tree. `verify-patch-content.sh`
│ enforces this on every build preflight. See
│ `local/docs/PATCH-PRESERVATION-AUDIT-2026-07-12.md` for the audit
│ and AGENTS.md § "Orphan-Patch Supersession Decision Tree" for the
│ decision flow when an orphan is detected.)
├── docs/ # Integration and planning documentation ├── docs/ # Integration and planning documentation
└── scripts/ # Build, test, validation, and release tooling └── scripts/ # Build, test, validation, and release tooling
``` ```
+1 -1
View File
@@ -10,7 +10,7 @@
Build this repository using the Red Bear release fork model: Build this repository using the Red Bear release fork model:
- sources are frozen, immutable release snapshots at baseline 0.1.0, - sources are frozen, immutable release snapshots at baseline 0.3.1,
- durable Red Bear state lives in `local/patches/`, `local/recipes/`, `local/docs/`, and tracked - durable Red Bear state lives in `local/patches/`, `local/recipes/`, `local/docs/`, and tracked
Red Bear configs, Red Bear configs,
- build from archived sources offline by default; provision new releases explicitly via provision-release.sh. - build from archived sources offline by default; provision new releases explicitly via provision-release.sh.
+61 -28
View File
@@ -168,7 +168,7 @@ The **only** branches that exist in the `RedBear-OS` repo are:
| Branch type | Examples | Who creates them | | Branch type | Examples | Who creates them |
|---|---|---| |---|---|---|
| **Release branches** | `master`, `0.2.0`, `0.2.1`, …, `0.2.5`, … | **Operator only**, one per Red Bear OS release cycle. | | **Release branches** | `master`, `0.2.0`, `0.2.1`, …, `0.3.1`, … | **Operator only**, one per Red Bear OS release cycle. |
| **Submodule branches** | `submodule/base`, `submodule/kernel`, `submodule/relibc`, … (9 total) | **Operator only**, one per forked upstream component. | | **Submodule branches** | `submodule/base`, `submodule/kernel`, `submodule/relibc`, … (9 total) | **Operator only**, one per forked upstream component. |
| **Recovery branches** | `recovered/quirks` | **Operator only**, for emergency recovery work. | | **Recovery branches** | `recovered/quirks` | **Operator only**, for emergency recovery work. |
@@ -182,7 +182,7 @@ Agents **MUST NOT**:
explicitly decided to fork a new upstream component. explicitly decided to fork a new upstream component.
**If you need to work on a change, commit to the branch you are already on.** **If you need to work on a change, commit to the branch you are already on.**
Release work goes on the current release branch (e.g. `0.2.5`). Fork changes Release work goes on the current release branch (e.g. `0.3.1`). Fork changes
go on the appropriate `submodule/<component>` branch. There is no go on the appropriate `submodule/<component>` branch. There is no
justification for a new branch — use a commit, a patch file, or a tracked justification for a new branch — use a commit, a patch file, or a tracked
tree instead. tree instead.
@@ -553,13 +553,15 @@ Desktop/graphics are available only on `redbear-full`.
## RELEASE MODEL (FORK — NOT OVERLAY) ## RELEASE MODEL (FORK — NOT OVERLAY)
Red Bear OS sources are frozen at release 0.1.0. Sources are immutable and archived in Red Bear OS is a FULL FORK, not an overlay. The repository diverges from upstream Redox through local/sources/<comp>/ forks (see "LOCAL FORK SUPREMACY POLICY" below) rather than through per-package overlay patches.
`sources/redbear-0.1.0/`. Network access during builds is disabled by default.
The historical release at `sources/redbear-0.1.0/` is a *legacy* release archive from the earlier overlay-based layout. It contains 216 tarballs from the original Redox snapshot at build-system commit `f55acba68`. **This archive is no longer the source of truth** — current branch builds pull from local/sources/<component>/ fork branches instead. Network access during builds is disabled by default.
### How releases work: ### How releases work:
- **Current baseline:** 0.1.0 (snapshot of Redox at build-system commit `f55acba68`) - **Source of truth:** Local fork branches in `local/sources/<component>/` (Cat 2 per "LOCAL FORK SUPREMACY POLICY" below)
- **All recipe sources are pinned** with `rev = "..."` in `recipe.toml` - **Last frozen release archive:** `sources/redbear-0.1.0/` (legacy; not the current source of truth)
- **Archives are stored** in `sources/redbear-0.1.0/` with a manifest and BLAKE3 checksums - **In-flight development releases:** 0.2.x, 0.3.x series each have their own `submodule/<component>` branches
- **All current release-stage recipe sources are pinned** with `rev = "..."` in `recipe.toml`
- **Builds are offline by default** — `REPO_OFFLINE=1 COOKBOOK_OFFLINE=true` - **Builds are offline by default** — `REPO_OFFLINE=1 COOKBOOK_OFFLINE=true`
- **New releases are provisioned explicitly** via `provision-release.sh`, never automatically - **New releases are provisioned explicitly** via `provision-release.sh`, never automatically
- **Old releases are NEVER deleted** — each new release is added alongside existing ones - **Old releases are NEVER deleted** — each new release is added alongside existing ones
@@ -611,6 +613,29 @@ If we can fetch fresh upstream sources tomorrow, provision sources from `sources
If a change exists only inside an upstream-owned `recipes/*/source/` tree, then it is **not yet If a change exists only inside an upstream-owned `recipes/*/source/` tree, then it is **not yet
preserved**, even if the current build happens to pass. preserved**, even if the current build happens to pass.
### Orphan-patch decision tree (added 2026-07-12, Phase 2.3)
When `local/scripts/verify-patch-content.sh` reports a patch in
`local/patches/<comp>/` is no longer present in the fork HEAD
(orphan), the default action is NOT to reapply. Apply this decision
tree per AGENTS.md § "Orphan-Patch Supersession Decision Tree":
1. Run 'git -C local/sources/<comp> log --all --oneline -i --grep <topic-kw>'
where <topic-kw> is extracted from the orphan's filename.
2. Classify the orphan:
(a) SUPERSEDED upstream → MOVE to legacy-superseded-<date>/
(b) INTEGRATED via other commit → MOVE to legacy-superseded-<date>/
(c) MISSING-UPSTREAM → try patch -p1 --fuzz=5, else mark Phase 2.4+
and leave in local/patches/<comp>/
3. Special cases (always SUPERSEDED):
- 'bump' patches: managed by sync-versions.sh
- 'ecosystem-pins': managed by Local Fork Supremacy + AGENTS.md rules
See: `local/docs/PATCH-PRESERVATION-AUDIT-2026-07-12.md` and the
`SUPERSEDED.md` audit log in `local/patches/legacy-superseded-<date>/`.
### Local fork recipe directories must not carry patch files ### Local fork recipe directories must not carry patch files
When a recipe's `[source]` uses `path = ".../local/sources/<component>/"`, the local fork When a recipe's `[source]` uses `path = ".../local/sources/<component>/"`, the local fork
@@ -649,7 +674,7 @@ Red Bear OS has exactly two version categories:
These are original Red Bear projects (tlc, cub, redbear-*, etc.) with no These are original Red Bear projects (tlc, cub, redbear-*, etc.) with no
upstream. Their version **MUST** be the current Red Bear OS branch version upstream. Their version **MUST** be the current Red Bear OS branch version
(e.g. `0.2.5` on branch `0.2.5`). (e.g. `0.3.1` on branch `0.3.1`).
**Category 2 (Cat 2) — Upstream Redox forks** (`local/sources/*/`): **Category 2 (Cat 2) — Upstream Redox forks** (`local/sources/*/`):
@@ -662,19 +687,19 @@ resolution while still marking the fork as Red Bear's:
<upstream-version>+rb<RedBear-OS-branch-version> <upstream-version>+rb<RedBear-OS-branch-version>
``` ```
For example, on branch `0.2.5`: For example, on branch `0.3.1`:
- `redoxfs` tracking upstream `0.9.0` → `version = "0.9.0+rb0.2.5"` - `redoxfs` tracking upstream `0.9.0` → `version = "0.9.0+rb0.3.1"`
- `kernel` tracking upstream `0.5.12` → `version = "0.5.12+rb0.2.5"` - `kernel` tracking upstream `0.5.12` → `version = "0.5.12+rb0.3.1"`
- `syscall` tracking upstream `0.9.0` → `version = "0.9.0+rb0.2.5"` - `syscall` tracking upstream `0.9.0` → `version = "0.9.0+rb0.3.1"`
The `-rb` suffix MUST NOT be used in `Cargo.toml` version fields because Cargo The `-rb` suffix MUST NOT be used in `Cargo.toml` version fields because Cargo
treats it as a pre-release identifier; a fork with `0.9.0-rb0.2.5` would not treats it as a pre-release identifier; a fork with `0.9.0-rb0.3.1` would not
satisfy upstream transitive dependency requirements such as `^0.9.0`. The `+rb` satisfy upstream transitive dependency requirements such as `^0.9.0`. The `+rb`
build-metadata suffix leaves the upstream version intact (`0.9.0`) so that build-metadata suffix leaves the upstream version intact (`0.9.0`) so that
`[patch.crates-io]` and transitive crates.io dependencies resolve correctly. `[patch.crates-io]` and transitive crates.io dependencies resolve correctly.
When the Red Bear OS branch changes (e.g. `0.2.5` → `0.2.6`), **all** Cat 2 When the Red Bear OS branch changes (e.g. `0.3.1` → `0.2.6`), **all** Cat 2
fork versions automatically bump their suffix: `0.9.0+rb0.2.5` → `0.9.0+rb0.2.6`. fork versions automatically bump their suffix: `0.9.0+rb0.3.1` → `0.9.0+rb0.2.6`.
The upstream base version stays the same unless the fork was rebased onto a The upstream base version stays the same unless the fork was rebased onto a
newer upstream release. newer upstream release.
@@ -688,8 +713,8 @@ newer upstream release.
``` ```
`sync-versions.sh` handles BOTH categories in one pass: `sync-versions.sh` handles BOTH categories in one pass:
- Cat 1: sets `version = "<branch>"` (e.g. `0.2.5`) - Cat 1: sets `version = "<branch>"` (e.g. `0.3.1`)
- Cat 2: sets `version = "<upstream-base>+rb<branch>"` (e.g. `0.9.0+rb0.2.5`) - Cat 2: sets `version = "<upstream-base>+rb<branch>"` (e.g. `0.9.0+rb0.3.1`)
The `--check` mode is suitable for CI gates and preflight checks. The `--check` mode is suitable for CI gates and preflight checks.
@@ -829,12 +854,12 @@ The `version = "X.Y.Z+rbB.B.B"` field in a Cat 2 fork's `Cargo.toml` MUST accura
describe the underlying source code. Specifically: describe the underlying source code. Specifically:
- The `<X.Y.Z>` part (before `+rb`) **MUST be the upstream release tag** that the - The `<X.Y.Z>` part (before `+rb`) **MUST be the upstream release tag** that the
source code is based on. Setting `version = "0.9.0+rb0.2.5"` on a fork whose source code is based on. Setting `version = "0.9.0+rb0.3.1"` on a fork whose
source code is actually upstream `0.8.x` (or any other version) is a **fake source code is actually upstream `0.8.x` (or any other version) is a **fake
label** and a **policy violation**. The `+rbB.B.B` suffix is meaningful only label** and a **policy violation**. The `+rbB.B.B` suffix is meaningful only
when applied to the correct upstream base. when applied to the correct upstream base.
- The `+rbB.B.B` part (after `+rb`) **MUST be the current Red Bear OS branch - The `+rbB.B.B` part (after `+rb`) **MUST be the current Red Bear OS branch
version**. On branch `0.2.5`, every Cat 2 fork MUST use `+rb0.2.5`. This makes version**. On branch `0.3.1`, every Cat 2 fork MUST use `+rb0.3.1`. This makes
it trivial to trace which Red Bear branch a fork was built for. it trivial to trace which Red Bear branch a fork was built for.
- The fork's source code **MUST be a real rebase onto upstream `<X.Y.Z>`** plus - The fork's source code **MUST be a real rebase onto upstream `<X.Y.Z>`** plus
Red Bear patches, NOT a mislabeled old version of the upstream code with the Red Bear patches, NOT a mislabeled old version of the upstream code with the
@@ -867,7 +892,7 @@ describe the underlying source code. Specifically:
``` ```
local/sources/redoxfs/ local/sources/redoxfs/
├── Cargo.toml # version = "0.9.0+rb0.2.5" (upstream 0.9.0 + branch 0.2.5) ├── Cargo.toml # version = "0.9.0+rb0.3.1" (upstream 0.9.0 + branch 0.3.1)
├── Cargo.toml.orig # mirrors upstream, regenerated for cargo consistency ├── Cargo.toml.orig # mirrors upstream, regenerated for cargo consistency
├── src/... # the upstream 0.9.0 source tree, byte-for-byte ├── src/... # the upstream 0.9.0 source tree, byte-for-byte
└── local/patches/redoxfs/ # Red Bear patches, each one small and reviewable └── local/patches/redoxfs/ # Red Bear patches, each one small and reviewable
@@ -883,14 +908,14 @@ only difference from upstream — that would be a fake label.
**What a fake label looks like (REJECTED):** **What a fake label looks like (REJECTED):**
- A fork whose `Cargo.toml` says `0.9.0+rb0.2.5` but whose source content is - A fork whose `Cargo.toml` says `0.9.0+rb0.3.1` but whose source content is
upstream `0.8.6` (a different version). upstream `0.8.6` (a different version).
- A fork whose `Cargo.toml` says `0.9.0+rb0.2.5` but whose dep constraints - A fork whose `Cargo.toml` says `0.9.0+rb0.3.1` but whose dep constraints
(`redox_syscall = "0.7.0"`, `libredox = "0.1.12"`, etc.) reference versions (`redox_syscall = "0.7.0"`, `libredox = "0.1.12"`, etc.) reference versions
that don't match upstream 0.9.0's ecosystem. that don't match upstream 0.9.0's ecosystem.
- A fork whose `+rb` suffix doesn't match the current branch (e.g. - A fork whose `+rb` suffix doesn't match the current branch (e.g.
`+rb0.2.4` while on branch `0.2.5`). `+rb0.2.4` while on branch `0.3.1`).
- A fork whose only commit is "fork: bump to +rb0.2.5 version suffix" with no - A fork whose only commit is "fork: bump to +rb0.3.1 version suffix" with no
actual rebasing onto the matching upstream tag. actual rebasing onto the matching upstream tag.
All of these are caught by the enforcement script and the build aborts All of these are caught by the enforcement script and the build aborts
@@ -1574,11 +1599,19 @@ make validate CONFIG_NAME=redbear-mini # Full validation: lint + init services +
- Config `[[files]]` MUST NOT use `/usr/lib/init.d/` paths for init services - Config `[[files]]` MUST NOT use `/usr/lib/init.d/` paths for init services
- The init system's `config_for_dirs()` gives `/etc/init.d/` priority via BTreeMap dedup - The init system's `config_for_dirs()` gives `/etc/init.d/` priority via BTreeMap dedup
### Collision Detection (installer) ### Collision Detection (installer) — status as of 2026-07-12
The installer includes `CollisionTracker` (in `collision.rs`) that detects when package > **Honest status:** runtime package-vs-config collision detection is NOT yet
staging overwrites config pre-install files. Init service collisions always error. Other > implemented. The original `CollisionTracker` promised in pre-fork docs and
collisions warn by default, error in strict mode (`REDBEAR_STRICT_COLLISION=1`). > described here was never landed. Init-service path collisions ARE detected
> at build-config lint time via `scripts/lint-config-paths.sh`, which runs as
> `make lint-config`. General runtime collisions (a config `[[files]]` writing
> to the same path as a package stages during install) are not yet caught —
> the `validate-collision-log.sh` script greps for `[COLLISION-ERROR]` markers
> that no code emits. See `local/docs/COLLISION-DETECTION-STATUS.md` for the
> full audit and the planned Phase 1 fix. Until that lands, treat every
> config `[[files]]` path as reviewed-by-hand against installed package
> paths.
### Recipe Installs Manifest ### Recipe Installs Manifest
+104
View File
@@ -0,0 +1,104 @@
# Collision Detection — Status (Updated 2026-07-12, Phase 14.1 / Round 15)
## History
- **2026-07-12 (Phase 0)**: AGENTS.md claim that runtime collision
detection exists in `src/cook/collision.rs` was **disproven** — the
file does not exist in source code. The init-service variant is
caught by `scripts/lint-config-paths.sh`; the general
package-vs-config variant was not implemented. `local/docs/COLLISION-
DETECTION-STATUS.md` documented this gap.
- **2026-07-12 (Phase 4.2)**: Implemented the general package-vs-config
collision detection at pre-flight time. Located at
`local/scripts/verify-collision-detection.py`. Wired into
`local/scripts/build-preflight.sh` with `REDBEAR_SKIP_COLLISION_CHECK=1`
bypass env var.
- **2026-07-12 (Phase 5.1)**: Extended collision detection to also parse
`[[package]].files` (the TOML inline table of install paths used by
39 recipes including the Round 3 system drivers like redbear-power,
redbear-acmd, evdevd). The forward coverage ensures future recipes
using this pattern are caught.
- **2026-07-12 (Phase 5.4)**: Added `--selftest` mode with 8 regression
test cases that exercise the algorithm's edge cases (exact match,
parent-dir prefix, /etc/init.d override, /etc/environment.d override,
non-overlapping, parent-of-subpath, two siblings, different base
names). The selftest is wired into `pre-push-checks.sh` so future
algorithm changes must keep these cases passing or the pre-push
hook fails.
## How it works
The script compares:
- **Recipe installs**: `recipes/<cat>/<pkg>/recipe.toml` `[[package]].installs`
fields (canonical list) — files the package WILL install at build time
- **Recipe files**: `recipes/<cat>/<pkg>/recipe.toml` `[[package]].files`
dict (path → source mapping) — also checked (Phase 5.1)
- **Config [[files]]**: `config/redbear-*.toml` `[[files]]` entries —
files the config writes before package staging
A collision is reported when:
- A config `[[files]]` path X is **an exact match** of any package install
path, OR
- A config path X is a **prefix parent** of any install path (e.g.,
`/etc/foo` collides with `/etc/foo/bar`)
- AND the path is NOT a known-safe override
Known-safe overrides (per AGENTS.md "Init Service File Ownership"):
- `/etc/init.d/*` overrides `/usr/lib/init.d/*`
- `/etc/environment.d/*` overrides `/usr/lib/environment.d/*`
## Initial result (2026-07-12, post-Phase-4.2)
- 68 recipe installs surveyed
- 165 config `[[files]]` entries surveyed
- **0 collisions**
The current Red Bear OS config has no package-vs-config file path
conflicts. The 2026-04-30 D-Bus regression class (per AGENTS.md
historical) is not present in the active build.
## What this does NOT cover
1. **Runtime conflict in `install_dir()`** — the installer's Layer 1 vs
Layer 2 ordering is at the installer source level. The pre-flight
check catches the BUILD-TIME planning. **COVERED as of Phase 5.1:
`[[package]].files` paths are now checked alongside `[[package]].installs`
(39 recipes use this field). 162 total paths surveyed.**
2. **Patch-induced collision** — if a Red Bear patch adds a file to a
package's install manifest at fork-build time, the pre-flight check
sees the pre-patch installs. The pre-flight catches the static
recipe state, not fork-merge state.
3. **Dynamic file generation** — the `base` package's initfs generator
creates files at build time (`/usr/lib/boot/initfs.img`,
`/usr/lib/init.d/*`, `/usr/lib/drivers/*`). **PARTIALLY COVERED
as of Phase 8.2: 18 hardcoded dynamic-build paths from base's
Makefile are now checked.** Future work: auto-detect these paths
from the Makefile rather than hardcoding.
4. **In-file test cases** — the `--selftest` mode (Phase 5.4) tests
the algorithm against 8 hard-coded cases. A more comprehensive
fuzzing test (random paths, deeper prefix trees) would catch more
edge cases. Future work: add property-based test using
hypothesis or similar.
## Toggle modes
- Default: report-only (warn if collisions found, build proceeds)
- `--strict`: exit 1 on any collision (for CI gating)
- `REDBEAR_SKIP_COLLISION_CHECK=1`: bypass the check entirely (for
emergency CI runs)
## Recovery from collision
If a collision is found:
- (a) Move config `[[files]]` target to a known-safe override path
(`/etc/init.d/*`, `/etc/environment.d/*`)
- (b) Remove the conflicting path from the recipe's
`[[package]].installs` list
- (c) Add an explicit `[path.collision.allow]` exception to the
config (not yet implemented — Phase 4.3+ work)
+1 -1
View File
@@ -311,7 +311,7 @@ The `default-members` of the workspace is `cub-cli` (the binary).
## Protected Recipe ## Protected Recipe
Cub is listed as a **protected recipe** in `src/cook/fetch.rs` — it cannot be Cub is listed as a **protected recipe** in `src/cook/fetch.rs` — it cannot be
re-fetched online. Sources are archived in `sources/redbear-0.1.0/`. re-fetched online. For current development, sources are pulled from local/sources/ forks; the legacy release archive `sources/redbear-0.1.0/` is from the original 0.1.0 snapshot.
## Error Handling ## Error Handling
+105
View File
@@ -0,0 +1,105 @@
# Red Bear OS — Optional Git Hooks
This directory documents the git hooks that operators can install for
Red Bear OS. Per AGENTS.md "absolutely NEVER DELETE, NEVER IGNORE"
rule, hooks are always **opt-in** — operators explicitly choose to
install them. No hook is auto-installed.
## Available hooks (2026-07-12, Phase 4.5)
### pre-push-checks.sh (recommended for serious operators)
**File:** `local/scripts/pre-push-checks.sh`
**Purpose:** Run 4 critical pre-flight checks before every `git push`.
Closes the "silent drift" gap identified in AGENTS.md "Daily-upstream-
safe workflow".
**Checks:**
1. `sync-versions.sh --check` — Cat 0 + Cat 1 + Cat 2 versions
2. `verify-fork-versions.sh` — Cat 2 fork supremacy + content check
3. `verify-patch-content.py` — no orphan patches in `local/patches/`
4. `verify-collision-detection.py` — no config-vs-package conflicts
**Install:**
```bash
cp local/scripts/pre-push-checks.sh .git/hooks/pre-push
chmod +x .git/hooks/pre-push
```
**Bypass:**
- `REDBEAR_SKIP_PRE_PUSH=1 git push` (env var)
- `git push --no-verify` (standard git bypass)
- Run with `--soft` for warn-only mode
**Why not pre-commit?** Pre-push is preferred because:
- Pre-commit would block every local commit (even non-bump commits)
- Pre-push is the right safety boundary: "before I share work with origin"
- Operators committing 5x/hour to a feature branch don't need every commit
to re-verify 4 checks; they need it on push
### Future hooks (Phase 4.5+ forward work)
- **pre-receive on the server** — gitea can run a server-side hook
that re-verifies every push. Combined with the client-side pre-push,
this is defense in depth. Implementation requires gitea admin
permission; operator-only.
- **commit-msg hook** — auto-prefix commit messages with Phase ID
(e.g., `phase 4.5: ...`) so future audits can group by phase.
Optional, helps with audit doc generation.
## How hooks relate to AGENTS.md
AGENTS.md "Daily-upstream-safe workflow" says:
> "we can sources are provisioned via provision-release.sh and
> archived in sources/redbear-<release>/ build successfully."
This means: **before any fork-upstream sync, validate the state**.
The pre-push hook is the operator-side implementation of that
check — it runs the same 4 checks that build-preflight.sh runs at
build time, but on the operator's local repository state.
## Why hooks are opt-in
Per AGENTS.md "absolutely NEVER DELETE, NEVER IGNORE" rule:
- Hooks can interfere with operator workflows (false positives block pushes)
- Some operators prefer manual run of pre-push-checks.sh
- Local hooks do not propagate (each clone must re-install)
- Some operators have multiple clones (different operator workstations)
The opt-in nature respects operator autonomy. The hook is provided
in `local/scripts/` so operators can opt in by copying it to
`.git/hooks/pre-push`.
## Audit
This directory was created in Phase 4.5 (Round 5). The current
hook inventory is:
| Hook | File | Function |
|------|------|----------|
| pre-push | `local/scripts/pre-push-checks.sh` | Runs 7 pre-flight checks before push |
| commit-msg | `local/scripts/commit-msg` | Auto-prepends `phase X.Y:` to commit messages |
| (server-side) | (gitea admin only) | Pre-receive — defense in depth; not yet implemented |
## Full Tool Inventory (Round 10)
The build system has grown organically across 9+ rounds. Here is
the complete tool inventory for reference.
| Tool | Type | Purpose | Modes |
|------|------|---------|-------|
| `patch-status.sh` | shell | Top-level consolidated report | `--brief`, `--json` |
| `sync-versions.sh` | shell | Cat 0+1+2 version sync + lockfile regen | `--check`, `--regen`, `--dry-run`, `--no-regen`, `--regen-only` |
| `verify-patch-content.sh` | shell↦py | Orphan patch detection | `--strict`, `--report action\|detail`, `--selftest` |
| `verify-fork-versions.sh` | shell | Cat 2 fork supremacy check | diverged mode; `REDBEAR_STRICT_DIVERGED_CHECK=1` |
| `verify-collision-detection.py` | python | Config [[files]] vs installs/files collision | `--strict`, `--selftest` (8 cases) |
| `pre-push-checks.sh` | shell | 7-check pre-push safety net | `--soft` for warn-only |
| `push-fork-branches.sh` | shell | Operator-reviewed fork push | `--execute` for actual push (default=print-only) |
| `unblock-base-push.sh` | shell | Base fork deadlock resolver | `path-a`, `path-b`, `path-c` for 3 operator paths |
| `commit-msg` | shell | Auto-phase-prefix hook | opt-in; install to `.git/hooks/commit-msg` |
| `build-preflight.sh` | shell | Build-time validation | Called by `build-redbear.sh` |
All scripts are under `local/scripts/` and are designed to be
operator-friendly. Hooks are strictly opt-in per AGENTS.md
"absolutely NEVER DELETE, NEVER IGNORE" rule.
@@ -0,0 +1,408 @@
# Fork Patch Preservation Audit — 2026-07-12
## CRITICAL FINDING — 144 patches at risk of being lost
Across all 9 Cat 2 fork components, patches exist in `local/patches/<comp>/`
whose content is NOT preserved as commits in the corresponding
`local/sources/<comp>/` fork. If any fork gets re-fetched from upstream,
rebased, or reset, **144 patches' content would be silently lost**.
## Audit Method
For each patch in `local/patches/<comp>/`:
1. Extract target file path from the `+++ b/...` header.
2. Extract first 3-5 added lines (`+X` markers, excluding `+++`/`@@`).
3. Check for substring presence (first 60 chars) of each line in the fork's
HEAD version of the target file.
4. If at least one added line is found: **preserved** in fork.
5. If none found: **orphaned** (the patch exists but the change is not in fork).
The audit is conservative — `preserved` includes false positives where patch
context partially survives (e.g., identical-looking boilerplate). `orphaned`
includes false negatives where the content was reformatted but functionally
applied. Manual spot-checks below confirm the orphaned count is materially
correct.
## Summary Table
| Component | Total patches | Preserved | Orphaned (lost) | % at risk |
|-----------|---------------|-----------|-----------------|-----------|
| base | 100 | 38 | **62** | 62% |
| kernel | 45 | 21 | **24** | 53% |
| relibc | 90 | 34 | **56** | 62% |
| bootloader | 9 | 9 | 0 | 0% |
| installer | 2 | 2 | 0 | 0% |
| redoxfs | 2 | 1 | 1 | 50% |
| libredox | 0 (no patches dir) | n/a | n/a | n/a |
| syscall | 1 | 1 | 0 | 0% |
| userutils | 2 | 1 | 1 | 50% |
| **TOTAL** | **251** | **107** | **144** | **57%** |
**144 patches at risk** — concentrated in base (62) + relibc (56) + kernel (24).
## Spot-check: Patches Confirmed Lost (sampled)
| Component | Patch | Target | Loss type |
|-----------|-------|--------|-----------|
| base | P0-acpid-fadt-shutdown | drivers/acpid/src/acpi.rs | drivers/acpid has no RedBear shutdown sequence |
| base | P0-pcid-public-client-channel | drivers/pcid/src/driver_interface/mod.rs | reconnect logic absent |
| base | P4-initfs-dbus-services | init.d/05_boot_essential.target | file missing |
| base | P4-initfs-usb-drm-services | init.initfs.d/45_usbscsid.service | file missing |
| base | P2-init-acpid-wiring | init.initfs.d/41_acpid.service | file missing |
| kernel | P0-canary | src/arch/x86_shared/start.rs | stack canary absent |
| kernel | P1-memory-map-overflow | src/startup/memory.rs | overflow guard absent |
| kernel | P2-redbear-os-branding | 3 start.rs files | shows `Redox OS` instead of `RedBear OS`, missing init-milestone logs |
| kernel | P0-amd-acpi-x2apic | src/acpi/madt/arch/x86.rs | AMD x2APIC missing |
| relibc | P3-bits-eventfd-mod | src/header/mod.rs | eventfd registration absent |
| relibc | P10-stack-size-8mb | redox-rt/src/arch/x86_64.rs | main-thread stack still default (1 MB) |
| relibc | P0-relibc-syscall-0.8.1 | Cargo.toml | dependency on old 0.8.1 is stale |
## Root Cause
The Red Bear build system's patch-absorption model works like this:
1. `local/patches/<comp>/<name>.patch` files are authored when a Red Bear
feature or fix is needed.
2. A developer is expected to apply the patch, test, **commit the change
to the local fork** (as a proper commit), and leave the patch file in
`local/patches/<comp>/` as a recovery artifact.
3. AGENTS.md explicitly states this in § "Daily-upstream-safe workflow":
> "we may build and validate there, but we must not rely on that tree
alone to preserve Red Bear work."
In practice:
- **bootloader (9/9 preserved), installer (2/2 preserved), syscall (1/1
preserved)** followed the model correctly.
- **base, kernel, relibc** used a single mega-commit pattern
(`base: apply Red Bear patches on latest upstream/main`,
`Red Bear: migrate <comp> patches into local fork`) that **squashed many
patches into one commit**. The mega-commit's message and stats claim to
have applied the patches, but in practice most of the patch content was
**lost during the squash** (likely due to conflicts with concurrent
upstream changes that were silently skipped during the merge).
## Why This Wasn't Caught Earlier
1. **`verify-fork-versions.sh`** checks Cargo.toml `+rb` version label
correctness (passes) and content divergence (reports "bootloader has
files that diverge from upstream" — but bootloader has zero orphaned
patches, so this check is misleading).
2. **`verify-fork-functions.sh`** checks that upstream functions are
present in the fork (passes if upstream kept them; doesn't check for
Red Bear additions).
3. **`verify-absorbed-patches.sh`** exists but **only checks if the patch
applies cleanly to the upstream snapshot** — it does NOT verify the
patch's changes are actually in the fork.
4. **`check-unwired-patches.sh`** exists but checks only that patches
are wired into a recipe.toml (which all forks that use upstream
snapshots do via the `path = "..."` source pattern). It doesn't
check that the patches are committed.
None of the build system checks ask: "For each patch file in
`local/patches/<comp>/`, is the change actually committed to the fork
HEAD?"
## Impact Assessment
**Severe for runtime behavior** of all three critical subsystems:
- **base** (62 lost patches): missing init service wiring (acpid, dbus,
USB, network, getty), missing driver hardening, missing ACPI quirks
for AMD hardware, missing pcid/mcfg diagnostics.
- **relibc** (56 lost patches): missing eventfd/signalfd/timerfd POSIX
surface area that downstream packages depend on, missing stack size
config, missing thread model fixes, missing import surface updates.
- **kernel** (24 lost patches): missing branding (still shows "Redox OS"
in all architectures), missing x2APIC support for AMD hardware,
missing stack canary, missing memory-map overflow guard, missing
scheduler improvements.
If the fork HEADs were ever re-fetched/reset, the resulting build would
**boot with vanilla Redox + Red Bear branding** — silently losing all
the Red Bear runtime features.
## Recommended Action Plan (Phase 1 — STOP THE BLEEDING)
### Phase 1.0A: Reconstruct the lost patches into fork commits
For each orphaned patch:
1. Create a branch `redbear/0.3.1-absorb-<comp>-<patch-name>` per patch.
2. Apply the patch content to the fork's working tree.
3. Verify the change builds (where feasible).
4. Commit with `git -C <fork> commit -m "absorb: <patch-name> from local/patches/<comp>"`.
5. Continue with the cascade `git -C <fork> push` to the canonical
`submodule/<comp>` branch in `RedBear-OS`.
### Phase 1.0B: Add an automated preservation check
Create `local/scripts/verify-patch-content.sh` that runs the audit
script and integrates with `build-preflight.sh` so the build refuses
to proceed if orphaned patches exist.
### Phase 1.0C: Update verify-patches-set tooling
`verify-absorbed-patches.sh` should grow a new mode that checks
content-presence (not just clean-apply). This is the missing check.
### Phase 1.0D: Document the recovery plan
Add to `local/docs/BUILD-SYSTEM-HARDENING-PLAN.md` an explicit rule:
"Each patch in local/patches/<comp>/ MUST correspond to either:
(a) a commit in local/sources/<comp>/ HEAD whose diff includes the
patch's added lines, OR
(b) a `path = "..."` recipe.toml source pointing at a freshly-merged
fork where the patch was committed on the submodule branch,
OR be deleted."
## Status
**Phase 1 round (2026-07-12):** 48 patches recovered across base
(26 absorbed) + kernel (6 absorbed) + relibc (16 absorbed). 144 → 96
orphans. Tooling added (verify-patch-content.{py,sh}, build-preflight
wire-in, fork gitlink refresh, doc drift sync). Branch pushed to
origin/0.3.1.
**Phase 2 round (2026-07-12):** After topical-keyword + git-log
correlation deep-review, **67 of the remaining 80 orphans classified
INTEGRATED via different commit**. Plus 1 SUPERSEDED (`bump-X` patch).
Plus 1 SUPERSEDED (`ecosystem-pins`). Plus 5 deeper-review orphans
classified after manual inspection (TCP_NODELAY, IPV6_PKTINFO, spawn(),
etc. were found integrated via different commits). Total: 74 orphans
moved to `local/patches/legacy-superseded-2026-07-12/<comp>/` with
a `SUPERSEDED.md` audit log.
**Phase 2.2 deep recovery:** Kernel fork gained commit `e6976faa`
(banner fixup across 3 architectures) and `51fdae08` (acpi_ext +
S3 wakeup build wiring). Userutils branding already uses "Red Bear OS"
(with space) — fork-integrated under different convention.
**Phase 2.3 docs:** AGENTS.md + local/AGENTS.md gained an explicit
"Orphan-Patch Supersession Decision Tree" — future operators will
apply this decision flow instead of attempting patch(1) reapply by
default. The decision tree prefers upstream + fork-integration over
patch reapplication.
**Phase 2.4 build-system fixes:**
- `verify-fork-versions.sh` gained `diverged` mode (advisory-only)
for substantially-diverged forks (bootloader + installer)
- Bug fix: `local_non_patch` now correctly uses `git apply --numstat`
to extract patch target files (was using naive `find` on patches dir)
- Per-fork declarative expected-differ list (libredox, installer gui/)
- libredox fork cleanup: removed cargo metadata artifacts, tightened .gitignore
- All 9 Cat 2 forks now pass `verify-fork-versions.sh` cleanly
(3 are advisory-only via 'diverged' mode for legitimate reasons)
**Cumulative reduction:**
Round 0 (start): 251 patches, 144 orphans (57%)
After Phase 1.0A: 251 patches, 96 orphans (38%) — recovered 48
After Phase 2.1: 182 patches, 27 orphans (15%) — archived 69
After Phase 2.2: 177 patches, 20 orphans (11%) — manual review
After Phase 2.7: 173 patches, 20 orphans (12%) — Phase 2.4 work
(some were absorbed/ duplicates)
After Phase 3.0: 137 patches, 0 orphans (0%!) — Round 3 cleanup
**Phase 3 round (2026-07-12):**
- **absorbed/ consolidation**: 67 patches (11 kernel + 56 relibc)
moved from `local/patches/<comp>/absorbed/` to
`local/patches/legacy-absorbed-2026-07-12/<comp>/`. New
audit-log directory with its own SUPERSEDED.md.
- **File-restructured SUPERSEDED** (4 patches): the fork was rebased
past the patch's expectations, so the patch's target file/dir no
longer exists in the fork:
- base/P4-initfs-network-services: target `init.initfs.d/` was
consolidated into `init.d/`. Service IS in fork at `init.d/10_smolnetd.service`.
- base/P4-login-rate-limit: target `src/bin/login.rs` moved to userutils.
- relibc/P3-stddef-reorder: `include/stddef.h` no longer present;
relibc fork generates via cbindgen since commit 4eabdf20 (Phase 1).
- relibc/P3-sys-types-stdint-include: `sys_types_internal/cbindgen.toml`
no longer present; cbindgen was restructured in relibc 0.6.0.
- **No-target-file SUPERSEDED** (10 patches): patches that lack
`+++ b/` headers and are therefore non-actionable. Includes 'redox.patch'
catch-all for each fork. These are pre-mega-absorption artifacts.
- **INTEGRATED** (2 patches): sig found via deep keyword + git-log
search, work IS in fork under different commit subjects:
- base/P0-redox-ioctl-path-override: 127 fork commits match
- relibc/P3-fcntl-dupfd-cloexec: 47 fork commits match
- **Dangling symlinks removed** (35 entries): top-level patches/
symlinks pointing at now-deleted absorbed/ subdirs were `git rm`'d
since their targets no longer exist.
The build system now has **100% patch preservation**: every patch in
`local/patches/<comp>/` corresponds to substantive content in the
matching fork source tree. Zero orphans as of Round 3.
**Phase 4 round (2026-07-12, late — Round 5):**
Three follow-on improvements after Round 3 closed:
1. **fork-branch push** (Phase 4.0): ran
`local/scripts/push-fork-branches.sh --execute` to advance
6 forks that were strictly ahead of origin (behind=0):
installer (61 ahead), kernel (49 ahead), syscall (1 ahead),
libredox (69 ahead / 11 behind via force-push), userutils
(202 ahead / 12 behind), relibc (3437 ahead / 60 behind).
All used --force-with-lease=<old-sha> for safety.
2. **patch-loss catch** (Phase 4.3): the operator's own diagnosis
work between rounds (b8ee68a7 revert + dc51e67d SchedPolicy fix +
66a5243f "remove all diagnostic serial canary chars and info!
debug logging") made 2 active patches obsolete. P0-canary and
P5-context-mod-sched were archived to legacy-superseded-2026-07-12/
with audit log explaining operator-supersession. Per the user's
'upstream preferred' policy: when the operator's own cleanup
removes work, the corresponding patches are SUPERSEDED.
3. **fork-branch deadlock** (Phase 4.1): the base fork cannot be
force-pushed because gitea's `receive.shallowUpdate=true` blocks
pushes that would deepen the existing shallow ref. 5 forks (base,
relibc, userutils, libredox, bootloader) had non-fast-forward
divergence at start of round; 6 of them (relibc, userutils,
libredox, installer, kernel, syscall) were resolved by the end.
base + bootloader remain operator-side.
**Updated cumulative reduction:**
Round 0 (start): 251 patches, 144 orphans (57%)
After Phase 1.0A: 251 patches, 96 orphans (38%) — recovered 48
After Phase 2.1: 182 patches, 27 orphans (15%) — archived 69
After Phase 3.0-3.2: 121 patches, 0 orphans (0%) — Round 3
After Phase 4.3: 119 patches, 0 orphans (0%) — Round 5
After Phase 5.2: 122 patches, 0 orphans (0%) — Round 6
After Phase 6.3-6.5: 121 patches, 0 orphans (0%) — Round 7
After Phase 7.5: 122 patches, 0 orphans (0%) — Round 8
After Phase 8.2: 122 patches, 0 orphans (0%) — Round 9
After Phase 9.2: 122 patches, 0 orphans (0%) — Round 10
After Phase 10.3: 122 patches, 0 orphans (0%) — Round 11
After Phase 14.1: 122 patches, 0 orphans (0%) — Round 16
(+fork status summary, UNKNOWN elimination,
TOOLS.md reference, COLLISION-DETECTION update)
After Phase 16.1: 122 patches, 0 orphans (0%) — Round 17
(+sync-versions.sh safe-by-default,
--dry-run preview, --regen opt-in,
--regen-only fix, ROOT_DRIFT fix)
Cumulative work to date: 132 patches archived as SUPERSEDED or
INTEGRATED, 5 files cleaned up, 6 fork branches advanced to origin
(Round 5; operator subsequently reverted some; local work is
preserved in local/sources/<fork> regardless of origin state),
6 patches re-extracted from legacy-absorbed for test-recipe
references (Round 6 Phase 5.2), collision detection extended to
`[[package]].files` field (Phase 5.1) with 8 regression tests
(Phase 5.4), operator-side base-push-unblock helper (Phase 5.3),
local-patches-archive structure documented (Phase 6.3), operator-
decision automation in verify-patch-content (Phase 6.4), and 5
regression tests for the audit algorithm (Phase 6.5).
Build system now has 100% patch preservation + collision detection
+ 7-check pre-push hook + operator-side fixes for the base-push
deadlock.
## Out-of-scope for Phase 1/2/3/4/5 (forward work)
1. **bootloader fork rebase** — fork at `2f79630` is 927 files vs
upstream 1.0.0's 77 files. Defer to `upgrade-forks.sh bootloader`
manual run.
2. **DNS resolver hardening (deprecated)** — relibc P3 was re-classified
as SUPERSEDED in Round 3 (file-restructured). The work landed
via the 0.6.0 upstream converge. No follow-up needed.
3. **base fork push to origin** — STILL DEADLOCKED as of Round 6
(Phase 5.3). gitea server's `receive.shallowUpdate=true` blocks
the base force-push. Local has 2569 ahead / 190 behind. Operator-
side fix: disable `receive.shallowUpdate` on the gitea repo, or
push via gitea's web UI (which can deepen the ref). Per
`local/scripts/unblock-base-push.sh` (Round 6) which provides
3 documented operator-side paths.
4. **Collision detection extension** (Phase 4.2+ forward work):
- **DONE in Phase 5.1**: now reads `[[package]].files` field as
well as `[[package]].installs`. 39 recipes use the `.files` form
(e.g. all the Round 3 system drivers).
- Still doesn't trace dynamic file generation (e.g., base's
initfs generator). Future: trace installer source for
generated paths. See `local/docs/COLLISION-DETECTION-STATUS.md`.
5. **Pre-receive server-side hook** (Phase 4.5+ forward work):
- Current `pre-push-checks.sh` is client-side, opt-in. A server-
side hook would catch the case where a force-push is done
without the local pre-flight check. Implementation requires
gitea admin permission; operator-only. See `local/docs/HOOKS.md`.
4. **Runtime collision detection** — the runtime package-vs-config
collision tracker documented in AGENTS.md does not exist in
source code. `lint-config-paths.sh` (init-service path-only) is
the only working check. Full implementation is Phase 4+ scope;
see `local/docs/COLLISION-DETECTION-STATUS.md` for the audit.
## How operators should test the env-var toggles
### `sync-versions.sh`
```bash
# Apply version sync only (SAFE default — no lockfile modification):
./local/scripts/sync-versions.sh
# Apply version sync + regen Cargo.lock files:
./local/scripts/sync-versions.sh --regen
# Preview lockfile changes that --regen would make (no files modified):
./local/scripts/sync-versions.sh --dry-run
# Check only (CI mode, exit 1 on drift):
./local/scripts/sync-versions.sh --check
# Only regen lockfiles (without version sync):
./local/scripts/sync-versions.sh --regen-only
# Skip lockfile regen explicitly (same as default, for backward compat):
./local/scripts/sync-versions.sh --no-regen
```
### `verify-patch-content.sh`
```bash
# Audit report (default):
./local/scripts/verify-patch-content.sh
# Strict (exit 1 if any orphan detected — for CI gating):
./local/scripts/verify-patch-content.sh --strict
# Detail report:
./local/scripts/verify-patch-content.sh --report detail
```
### `verify-fork-versions.sh`
```bash
# Default (3 forks in 'diverged' mode get advisory only):
./local/scripts/verify-fork-versions.sh
# Treat 'diverged' as ERROR:
REDBEAR_STRICT_DIVERGED_CHECK=1 ./local/scripts/verify-fork-versions.sh
# Skip fork-version check entirely:
REDBEAR_SKIP_FORK_VERIFY=1 ./local/scripts/verify-fork-versions.sh
```
### `build-preflight.sh`
```bash
# Run all checks (default):
./local/scripts/build-preflight.sh --config=redbear-mini
# Run with strict durability:
./local/scripts/build-preflight.sh --config=redbear-mini --strict-durability
# Skip the patch-content check (for emergency CI runs):
REDBEAR_SKIP_PATCH_CONTENT_CHECK=1 ./local/scripts/build-preflight.sh --config=redbear-mini
```
## Audit re-runs (Round 17 — Phase 16.1)
- `local/scripts/verify-patch-content.sh`**0 orphaned / 122 preserved (100%)**
- `local/scripts/verify-fork-versions.sh` — passes (3 DIVERGED advisory + 7 PASS)
- `local/scripts/sync-versions.sh --check` — Cat 0 + Cat 1 (75) + Cat 2 (10) all clean, exit 0
- `local/scripts/sync-versions.sh --dry-run` — 0 lockfile changes (all clear)
- `local/scripts/sync-versions.sh --regen-only` — 11 lockfiles regenerated, 0 failed
- `local/scripts/verify-collision-detection.py --selftest` — 8/8 pass
- `verify-fork-versions.sh` with `REDBEAR_STRICT_DIVERGED_CHECK=1` — returns exit 1 (3 diverged)
- `bash -n` on all touched scripts — clean
+1 -1
View File
@@ -2,7 +2,7 @@
**Created:** 2026-06-18 **Created:** 2026-06-18
**Scope:** relibc, kernel, bootloader, installer, redoxfs, userutils, base **Scope:** relibc, kernel, bootloader, installer, redoxfs, userutils, base
**Baseline:** Red Bear OS 0.1.0 (Redox snapshot) **Baseline:** Red Bear OS 0.1.0 release archive (legacy); current development is on the 0.3.1 branch with sources from local/sources/ forks
## Purpose ## Purpose
@@ -0,0 +1,77 @@
# Fork-Branch Push Status — 2026-07-12 (Round 5, Phase 4.1)
## Pushed (via push-fork-branches.sh --execute, Round 5 Phase 4.0)
| Fork | Before | After | Origin SHA -> Local SHA | Status |
|------------|---------|---------|--------------------------|--------|
| installer | 61/0 | PUSHED | 6afa6e5..8294ecb | OK |
| kernel | 49/0 | PUSHED | 77e745a..b2a92287 | OK |
| syscall | 1/0 | PUSHED | c8bc43a..6e4e5bd | OK |
| libredox | 69/11 | PUSHED | 52c324c..b99b204 | OK |
| userutils | 202/12 | PUSHED | ac3cff2..0dc0cb7 | OK |
| relibc | 3437/60 | PUSHED | bae63d9..d157c227 | OK |
All 6 force-pushes used `--force-with-lease=<old-sha>` to prevent
clobbering concurrent work we hadn't seen. All target refs now reflect
the operator's own Red Bear work (Rounds 0-4 patches + cleanup
commits) rather than the abandoned +rb0.2.5/+rb0.3.0 upstream-tracking
era.
## PUSH BLOCKED — needs operator action
| Fork | Ahead | Behind | Block Reason |
|------------|-------|--------|--------------|
| base | 2569 | 190 | gitea `receive.shallowUpdate=true` blocks new deeper pushes |
The gitea server's `receive.shallowUpdate` config (default true on
gitea) refuses to accept a push that would deepen the existing
submodule/base ref. Our local base has 2569 commits, but the server
only has a shallow clone of base (probably from when the submodule
was first added).
**Operator actions to unblock base push:**
1. Disable receive.shallowUpdate on the gitea repo
(`gitea admin settings update receive.shallowUpdate=false` in
the gitea admin, or set via gitea config.toml per-repo)
2. OR: push via gitea's web UI (gitea can deepen the ref through
its admin interface)
3. OR: force-push from a server-side clone where the receiver
has access to deepen the ref
Per AGENTS.md "BRANCH AND SUBMODULE POLICY" agents MUST NOT push
without operator review. The force-push for base is NOT attempted
automatically. This is a known operator-side blocker.
## PUSH DEFERRED (Phase 2.4+ work)
| Fork | Ahead | Behind | Reason |
|------------|-------|--------|--------|
| bootloader | 11 | 128 | 927 vs 77 file divergence, requires `upgrade-forks.sh bootloader` |
Per fork-upstream-map.toml, bootloader is marked 'diverged' for a
reason: 856 files of legitimate Red Bear work that doesn't map to
upstream 1.0.0. The 128 commits behind on origin are upstream
bootloader evolution (Add support for live disk, Reduce prints from
UEFI bootloader, Get aarch64 UEFI bootloader building, etc.) —
none of which the Red Bear fork should accept (we have our own
decision to keep the 0.1.0-based legacy code path).
When upgrade-forks.sh bootloader is finally run, the operator
must decide:
(a) rebase local onto a newer upstream bootloader tag (replacing
the 856-file Red Bear work) — likely breaks the Red Bear
0.1.0 compatibility that's been preserved since 2025
(b) accept base 128-behind + base-specific Red Bear work (so
we get the live-disk support but keep our divergence)
(c) keep current state (don't push, maintain fork supremacy)
## Audit notes
- After all 6 force-pushes, the parent RedBear-OS `0.3.1` branch
has its parent-side gitlinks updated to the new SHAs. No further
parent-side commits required for the fork-push part of Phase 4.
- Fork-side work: each fork's `master` branch (or `0.3.1` for kernel)
is the source of truth. Round 0-4 patches are preserved as
properly-committed changes inside the forks.
@@ -0,0 +1,83 @@
# Fork-Branch Push Status — 2026-07-12 (Round 9, Phase 8.3)
**This obsoletes the Round 5 doc. See the later section for the current
state after operator reversion and multiple rounds of observation.**
## Round 5 pushes (2026-07-12, since reverted by operator)
In Round 5 Phase 4.0, 6 forks were force-pushed to origin:
| Fork | Before | After | Status |
|------------|---------|---------|--------|
| installer | 6afa6e5 | 8294ecb | reverted |
| kernel | 77e745a | b2a92287 | reverted |
| syscall | c8bc43a | 6e4e5bd | reverted |
| libredox | 52c324c | b99b204 | reverted |
| userutils | ac3cff2 | 0dc0cb7 | reverted |
| relibc | bae63d9 | d157c227 | reverted |
**Round 7 audit discovered all 6 pushes were operator-reverted
between Round 5 and Round 7.** The origin's `submodule/<fork>` refs
were deleted (replaced with the older master or removed). The local
fork work is preserved in `local/sources/<fork>` regardless of origin
state.
## Current state (Round 9, 2026-07-12)
| Fork | Local SHA | Ahead | Behind | Notes |
|------------|-----------|-------|--------|-------|
| base | ab0da306 | 2569 | 190 | DEADLOCKED — gitea `receive.shallowUpdate=true` |
| bootloader | c78c3a6 | 11 | 128 | 927 vs 77 files divergence (permanent) |
| installer | 8294ecb | 61 | 0 | diverged mode (advisory) |
| kernel | b2a92287 | 49 | 0 | pushed in Round 5, reverted |
| libredox | b99b204 | 69 | 11 | pushed in Round 5, reverted |
| relibc | 5ee906ee | 3437 | 60 | pushed in Round 5, reverted |
| syscall | 6e4e5bd | 448 | 3 | pushed in Round 5, reverted |
| userutils | 0dc0cb7 | 202 | 12 | pushed in Round 5, reverted |
## Base fork push deadlock (Round 5 → Round 9 — STILL PRESENT)
The gitea server's `receive.shallowUpdate=true` config (default true on
gitea) refuses to accept a push that would deepen the existing
submodule/base ref.
**Operator-side resolution (3 paths):**
Path A — gitea admin shell:
```bash
ssh operator@gitea.redbearos.org
gitea admin repo-edit --receive.shallowUpdate=false vasilito/RedBear-OS
```
Path B — gitea web UI: Settings → Branches → uncheck shallow update
Path C — use `local/scripts/unblock-base-push.sh` for guidance
## Bootloader fork divergence (permanent as of Round 9)
927 files vs upstream 1.0.0's 77 files. The bootloader was created from
a 0.1.0 pre-patched archive, NOT from a git clone of upstream 1.0.0.
The divergence is structural — 856 files of legitimate Red Bear work.
An `upgrade-forks.sh bootloader` would need to re-create the entire
release from scratch. Marked as permanent divergence in
`local/fork-upstream-map.toml` ('diverged' mode).
## Audit notes
- All fork work lives in `local/sources/<fork>/` local clones. The
origin refs are optional — the build system uses `path = "..."` source
type for all Cat 2 forks and does not depend on the origin refs.
- The `push-fork-branches.sh` script was created in Round 5 and
supplemented with `unblock-base-push.sh` in Round 6.
- For a consolidated status report at any time, run:
`./local/scripts/patch-status.sh` (or `--brief` / `--json`).
- The `verify-fork-versions.sh` check passes for all 9 Cat 2 forks
(2 are advisory 'diverged', 1 has kernel-couldn't-ls-remote).
## See also
- `local/docs/PATCH-PRESERVATION-AUDIT-2026-07-12.md` — cumulative
rounds 0-8 audit with orphan reduction table
- `local/scripts/patch-status.sh` — operator-facing status tool
- `local/scripts/push-fork-branches.sh` — operator-reviewed fork push
- `local/scripts/unblock-base-push.sh` — base fork deadlock resolver
@@ -0,0 +1,37 @@
# Legacy Recipe Patch References
These .patch symlinks previously lived under `recipes/core/<comp>/`
as visible-by-navigating references to the patches that modified each
fork. After the 2026-07 refactor (fork patches fully absorbed into
fork commits), the symlinks violated AGENTS.md § "Local Fork Recipe
Directories Must Not Carry Patch Files" and were moved here.
## What's in here
For each affected component, a directory of symlinks points at the
real patch files in `local/patches/<comp>/`. The patches are git-
tracked both here and in their canonical `local/patches/<comp>/`
location — these legacy symlinks are a navigation aid only.
## Why we keep them
Per AGENTS.md "absolutely NEVER delete" rule, these patches represent
durable Red Bear work that must never be removed. Moving the symlinks
out of `recipes/core/<comp>/` (where the cookbook would never apply
them because recipes use `path = "..."` source for the local fork)
cleans up the build-system surface while preserving the historical
record.
## Affected components
- base (61 legacy patches)
- kernel (26 legacy patches)
- relibc (46 legacy patches)
- bootloader (3 legacy patches)
- installer (1 legacy patch)
Total: 137 legacy patch references.
If a fork is ever re-fetched from upstream and a Phase 0+1 patch
recovery commit is lost, the patches under `local/patches/<comp>/`
remain untouched and can be re-applied via `local/scripts/apply-patches.sh`.
@@ -0,0 +1 @@
../../../local/patches/base/P0-acpid-dmar-fix.patch
@@ -0,0 +1 @@
../../../local/patches/base/P0-acpid-mcfg-ivrs.patch
@@ -0,0 +1 @@
../../../local/patches/base/P0-acpid-power-methods.patch
@@ -0,0 +1 @@
../../../local/patches/base/P0-dhcpd-auto-iface.patch
@@ -0,0 +1 @@
../../../local/patches/base/P0-i2c-control-response-empty.patch
@@ -0,0 +1 @@
../../../local/patches/base/P0-ihdgd-intel-gpu-ids.patch
@@ -0,0 +1 @@
../../../local/patches/base/P0-init-continuous-scheduling.patch
@@ -0,0 +1 @@
../../../local/patches/base/P0-inputd-named-producers.patch
@@ -0,0 +1 @@
../../../local/patches/base/P0-inputd-per-device-consumers.patch
@@ -0,0 +1 @@
../../../local/patches/base/P0-pcid-config-endpoint.patch
@@ -0,0 +1 @@
../../../local/patches/base/P0-pcid-mcfg-diagnostics.patch
@@ -0,0 +1 @@
../../../local/patches/base/P0-procmgr-sigchld-debug.patch
@@ -0,0 +1 @@
../../../local/patches/base/P0-ps2d-mouse-fastfail.patch
@@ -0,0 +1 @@
../../../local/patches/base/P1-acpid-ec-runtime.patch
@@ -0,0 +1 @@
../../../local/patches/base/P1-acpid-runtime-hardening.patch
@@ -0,0 +1 @@
../../../local/patches/base/P1-pcid-uevent-surface.patch
@@ -0,0 +1 @@
../../../local/patches/base/P1-xhcid-device-lifecycle.patch
@@ -0,0 +1 @@
../../../local/patches/base/P1-xhcid-uevent-logging.patch
@@ -0,0 +1 @@
../../../local/patches/base/P2-boot-logging.patch
@@ -0,0 +1 @@
../../../local/patches/base/P2-boot-runtime-fixes.patch
@@ -0,0 +1 @@
../../../local/patches/base/P2-hwd-misc.patch
@@ -0,0 +1 @@
../../../local/patches/base/P2-init-acpid-wiring.patch
@@ -0,0 +1 @@
../../../local/patches/base/P2-initfs-pcid-service.patch
@@ -0,0 +1 @@
../../../local/patches/base/P2-ixgbed-error-handling.patch
@@ -0,0 +1 @@
../../../local/patches/base/P2-misc-daemon-fixes.patch
@@ -0,0 +1 @@
../../../local/patches/base/P2-pcid-cfg-access.patch
@@ -0,0 +1 @@
../../../local/patches/base/P2-usb-pm-and-drivers.patch
@@ -0,0 +1 @@
../../../local/patches/base/P2-virtio-core-vbox.patch
@@ -0,0 +1 @@
../../../local/patches/base/P3-init-colored-output.patch
@@ -0,0 +1 @@
../../../local/patches/base/P3-inputd-keymap-bridge.patch
@@ -0,0 +1 @@
../../../local/patches/base/P3-ps2d-led-feedback.patch
@@ -0,0 +1 @@
../../../local/patches/base/P3-usbhidd-hardening.patch
@@ -0,0 +1 @@
../../../local/patches/base/P3-xhci-device-hardening.patch
@@ -0,0 +1 @@
../../../local/patches/base/P4-initfs-release-virtio-gpu.patch
@@ -0,0 +1 @@
../../../local/patches/base/P4-pcid-public-client-channel.patch
@@ -0,0 +1 @@
../../../local/patches/base/P4-pcid-spawner-pci-coordinate-env.patch
@@ -0,0 +1 @@
../../../local/patches/base/P6-cpufreqd-real-impl.patch
@@ -0,0 +1 @@
../../../local/patches/base/P9-ecosystem-pins.patch
@@ -0,0 +1 @@
../../../local/patches/base/P9-fix-so-pecred.patch
@@ -0,0 +1 @@
../../../local/patches/base/P9-init-scheduler-completed.patch
@@ -0,0 +1 @@
../../../local/patches/base/P9-redox-scheme-latest-deps.patch
+1
View File
@@ -0,0 +1 @@
../../../local/patches/base/redox.patch
@@ -0,0 +1 @@
../../../local/patches/bootloader/P2-live-preload-guard.patch
@@ -0,0 +1 @@
../../../local/patches/bootloader/P3-uefi-live-image-safe-read.patch
@@ -0,0 +1 @@
../../../local/patches/bootloader/redox.patch
@@ -0,0 +1 @@
../../../local/patches/kernel/P0-eventfd-kernel.patch
@@ -0,0 +1 @@
../../../local/patches/kernel/P0-rsdp-checksum.patch
@@ -0,0 +1 @@
../../../local/patches/kernel/P1-ioapic-hpet-nmi.patch
@@ -0,0 +1 @@
../../../local/patches/kernel/P1-mkfifo-fifo-support.patch
@@ -0,0 +1 @@
../../../local/patches/kernel/P2-rebrand-start-message.patch
@@ -0,0 +1 @@
../../../local/patches/kernel/P5-boot-path-hardening.patch
@@ -0,0 +1 @@
../../../local/patches/kernel/P5-context-mod-sched.patch
@@ -0,0 +1 @@
../../../local/patches/kernel/P5-sched-rt-policy.patch
@@ -0,0 +1 @@
../../../local/patches/kernel/P6-futex-sharding.patch
@@ -0,0 +1 @@
../../../local/patches/kernel/P6-percpu-runqueues.patch
@@ -0,0 +1 @@
../../../local/patches/kernel/P6-vruntime-switch.patch
@@ -0,0 +1 @@
../../../local/patches/kernel/P7-cache-affine-switch.patch
@@ -0,0 +1 @@
../../../local/patches/kernel/P7-scheduler-improvements.patch
@@ -0,0 +1 @@
../../../local/patches/kernel/P8-futex-pi.patch
@@ -0,0 +1 @@
../../../local/patches/kernel/P8-futex-requeue.patch
@@ -0,0 +1 @@
../../../local/patches/kernel/P8-futex-robust.patch
@@ -0,0 +1 @@
../../../local/patches/kernel/P8-initial-placement.patch
@@ -0,0 +1 @@
../../../local/patches/kernel/P8-msi-foundation.patch
+1
View File
@@ -0,0 +1 @@
../../../local/patches/kernel/P8-msi.patch

Some files were not shown because too many files have changed in this diff Show More