- Stage 2 published whatever metadata upstream served, so an upstream caught mid-update or serving a broken tree could publish a repomd.xml naming files it lacks, and clients failed with 404s.
- Before stage 2, list upstream repodata/ with the stage 2 filters applied and download each repomd.xml; skip stage 2 and fail the sync if any names a missing file or has a newest <timestamp> older than the published copy.
- When the check passes, set the mtime of any published repomd.xml whose content differs from upstream, and its signature, to 0 so rsync replaces it even when size and mtime match.
- After stage 2, verify every published repomd.xml against the files on disk and fail the sync, without running post_successful_sync_hook, if the tree is still torn.
- Add <module>_repodata_check, on by default for rpm modules with options_stage2 and rejected without it, and <module>_repodata_check_prune (default "Packages drpms isos images") to skip package directories in the walk.
- post_failed_sync now takes an optional reason that is printed and included in the failure email; the scratch directory is removed on SIGINT/SIGTERM.
mirror-sync:
- Add a repo-sync sync method for rpm/deb/arch/apk repositories, with
installer, prune setting, an optional type filter, and trace fields passed
through to it.
- Count what each sync changed and publish SYNC_FILES_* / SYNC_CHANGED to
the post successful sync hook, so a hook can stay idle on a no-op run.
- Make trace saving configurable with save_trace (global and per module)
and publish traces from every method, not just rsync. Exclude the local
trace from deletes, and stop hierarchy entries stacking up per run.
- Add parse_bool so boolean settings reject values that would otherwise be
read as their opposite; keep an explicit bare=false from being
auto-detected away, and require hide_remote on the clone path too.
- MIRROR_SYNC_CONF names an alternate configuration file.
- Fix docroot joining when repo has a trailing slash, unparsable
last-modified headers skipping every sync, s3cmd --host taking a full
URL, and the average rate line for methods with no byte count.
- Exit non-zero when help is printed because of a mistake.
mirror-file-generator:
- Match du summary paths exactly instead of by substring, so sibling repos
sharing a prefix no longer return several sizes.
- Fall back to the default icon when no image is found, and stop the
fallback recursing into itself.
- Validate sections against SECTIONS, count repos written to decide whether
to publish the index, and create the log directory if missing.
- MIRROR_SYNC_CONF support, and exit non-zero on an unknown mirror.
Docs: rewrite README around quick start and sync methods, and move the
file generator reference to docs/mirror-file-generator.md.
Runs a configurable hook at the very end of every sync method, after all
cleanup has finished and the sync is confirmed successful. Unlike the
rsync/qfm post_hook, it is available for all sync methods and runs after
trace files, log cleanup, and mirror reporting.
Bare mirrors served over dumb HTTP need info/refs and objects/info/packs
kept current, so run git update-server-info after every successful bare
sync and clone. The post-update hook cannot be used since it only fires
on push, not on the fetch a mirror performs.
Add a hide_remote option (requires bare + source) that keeps the upstream
URL out of the served files: it removes the stored remote from config,
deletes FETCH_HEAD after each fetch, and fetches directly from source with
a +refs/*:refs/* mirror refspec on every run.
Introduces logo_dark and repo_icon_dark config options that serve alternate
images to dark-OS browsers via HTML <picture> elements, and adds a CSS
prefers-color-scheme dark block to the default header template.
- mirror-sync.sh: fix upstream_check/time_file_check to handle missing
timestamp file and empty Last-Modified header; fix rebuild_dusum_totals
variable shadowing; propagate return codes from install helpers; refactor
git_sync out of subshell; scope LOGFILE_STAGE2 to stage-2 block; clean up
mirror_update_file and QFM in-progress files on failure; fix total_time
initialization and wget_sync exit propagation
- mirror-file-generator.sh: add icons_local_repo/icons_repo_url/icons_repo_refresh
for offline icon serving; move PIDFILE to /tmp; enhance image_copy to
refresh stale cached files; fix temp index file cleanup on empty output;
safer ${var:?} → [[ -n $var ]] guards throughout
- README.md: fix typos, heading levels, variable names, and document new
icon repo config options
- Bump VERSION to 20260602 in both scripts