Skip to content

[pull] main from freeCodeCamp:main - #275

Merged
pull[bot] merged 37 commits into
homebase-garage:mainfrom
freeCodeCamp:main
Aug 15, 2026
Merged

[pull] main from freeCodeCamp:main#275
pull[bot] merged 37 commits into
homebase-garage:mainfrom
freeCodeCamp:main

Conversation

@pull

@pull pull Bot commented Aug 15, 2026

Copy link
Copy Markdown

See Commits and Changes for more details.


Created by pull[bot] (v2.0.0-alpha.4)

Can you help keep this open source service alive? 💖 Please sponsor : )

thedanbob and others added 30 commits June 18, 2026 09:56
…ockfile

Update dependency image_optim to v0.32.0
Symlink into ~/.config/fish to use:

    ln -s $PWD/fish/functions/*.fish ~/.config/fish/functions/
    ln -s $PWD/fish/completions/*.fish ~/.config/fish/completions/
Run the thor tasks in the current directory instead of looking up the
checkout root.
Alias for the maintainer workflow, mirroring `npm outdated` and
`bundle outdated`. Also completed by the fish function.
Scraping rewrites every page file, so the default size and mod-time
comparison re-uploads all files of a documentation even when only a few
pages changed.
A documentation consists of thousands of small files, whose upload is
bound by request round-trips: rclone defaults to 4 parallel transfers,
the AWS CLI to 10 concurrent requests.
Add pytest documentation (9.1.1)
The entries filter kept a process-wide list of entry names and returned no
entries for any page whose name had been seen before. Since a page without
entries is not stored at all, this silently dropped whole documents rather
than just index entries.

Unrelated pages legitimately share a name: every container's erase_if page
is titled "std::erase_if (std::<container>)", which normalises to plain
"std::erase_if", so only the first one crawled survived. Same for std::move
in <algorithm> vs <utility>, and std::optional::operator bool.

The deduplication exists because cppreference serves the same wiki page
under several URLs and the scraper stores pages under the requested URL
rather than the effective one. Key it on the canonical page name from the
"Retrieved from" footer instead, which identifies the underlying wiki page
exactly.

Fixes #2175
Fixes #2190
Fixes #2223
UrlScraper now stores every response it fetches in tmp/cache/<slug> and
serves subsequent runs from there, which makes iterating on a scraper's
filters a lot faster. Only successful responses are stored, so transient
failures aren't pinned forever.

Cached responses are collected by the Requester and handed over
iteratively rather than from within Hydra#add, because delivering them
right away would nest one request's callbacks inside the previous one's
and overflow the stack on large documentations.

thor docs:clean deletes the caches. It recognizes them by a marker file
so that it leaves the assets cache alone.
The cache files were Marshal dumps, which are opaque when you open one to
find out what a scraper actually got back. They're now JSON, in the entry
schema of the HTTP Archive format:
http://www.softwareishard.com/blog/har-12-spec/

An archive is a log of many entries; keeping one entry per file instead
means the cache stays incremental, at the cost of the files not being
valid archives on their own. Bodies that aren't valid UTF-8 fall back to
the spec's base64 encoding, and are handed back to the scrapers as binary
either way, so a warm run sees exactly what a cold one does.

Cache files gained a .json extension, so the entries written by the
previous format are ignored; run thor docs:clean to drop them.
Cache scraper responses in tmp/cache
@pull pull Bot locked and limited conversation to collaborators Aug 15, 2026
@pull pull Bot added the ⤵️ pull label Aug 15, 2026
@pull
pull Bot merged commit 1ea5323 into homebase-garage:main Aug 15, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants