Update a few deps 💬 by Caio a month ago (log)
Not too much code to review


caio's code asylum

caca - web front end for git repositories


It all started with me trying to understand how git log -- somefile was picking commits and still feeling confused after reading the docs (search for "A more detailed explanation follows", it's well written). So I picked up gix to hack my own file history walker and, well, here we are...


caca [-c /path/to/config] /path/to/gitroot

The (optional) configuration maps a gitconfig/ini file to a GlobalConfig instance. See's live config as an example.

You can use the RUST_LOG environment variable to configure logging. The cmdline I tend to use when hacking is something like:

RUST_LOG=debug cargo watch --ignore '*.html' -x "run ."




the code

There are 2 crates:

When caca starts, it builds an in-memory snapshot of every repository it finds by traversing a base directory (optionally filtering for git-daemon-export-ok) and uses this information to answer most simple requests (listing, main repository pages and feeds)

There's a single admin (caca::admin) actor that manages the snapshots and whenever a change happens within a repository the actor regenerates the snapshot and submits it to the client (caca::client)

The client is responsible for matching requests (is the repository name correct? branch name valid?) and routing accordingly. It makes use of the "business logic" within caca::repo to craft the responses

Repository changes are detected by relying on git's post-update hook being called: git update-server-info outputs a file that caca can watch for changes ($GIT_DIR/info/refs). Alternatively, there's a rudimentary admin web "api" that can be used to trigger manual updates via http


If this model is not to your liking: there are really good CGI-based (cgit, cgit-pink, gitweb) and static files (stagit) alternatives; And if you'd like a server, just not this one, I'm aware of gitiles: I never operated it, but it looks great and the goals are quite similar to this one


This software is licensed under the European Union Public License (EUPL) v. 1.2 only