Georg Lukas, 2009-11-23 21:47
cgit, a gitweb replacement?
Recently I was made aware of the existence of cgit, a git web frontend written in C. It looked promising, so I tried it out.
It seems to perform better than gitweb, which I kind of expected from the fact that it is a native binary, as opposed to a perl script forking git for the actual work. Also, there is a comparison performed by the author of cgit.
However, I was convinced by the clean, short, nice looking URLs provided by cgit, which allow to checkout files from your default HEAD without nasty hash tags:
/cgit/libmpq.git/tree/Makefile.am
versus the rather ugly gitweb URL:
/git?p=libmpq.git;a=blob;f=Makefile.am;
h=1f70fdb06cc13ae0338c380139c352383aea7700;hb=HEAD
I think in the good old new days of Web 0.2, this is called
RESTful
behaviour, which also coincidentally contains the substring "STFU".
Syntax highlighting with cgit
Anyway, once I was at playing with cgit, I wanted to add some syntax
highlighting, too. To enable it, cgit already comes with a filter
script (you
see the elegant URL syntax at work again?). This script uses the
highlight
command, but it does not support all
the file formats of highlight
, and might be missing some elegance.
I made an attempt at supporting all the files I have in the different git repositories, which you can find here:
#!/bin/sh
# store filename and extension in local vars
BASENAME="$1"
EXTENSION="${BASENAME##*.}"
# map Makefile and Makefile.* to .mk
[ "${BASENAME%%.*}" == "Makefile" ] && EXTENSION=mk
exec highlight --force -f -I -X -S "$EXTENSION" 2>/dev/null
This variant extracts the file extension of the file to be displayed,
contains detection of Makefile.*
files and spares one fork by running
exec highlight
. If the syntax is not known, --force
makes the
command just pass through the input.
Do not forget to add the CSS required by highlight
, as documented in the
original syntax-highlight.sh
.
What is still missing?
Cgit comes with cache support to further reduce the CPU load. However, I yet have to figure out how to make the caching time long enough to make a difference on this low-traffic server without taking forever to update the cache content whenever I push changes.
A cosmetic issue remains with directories in the tree view. They should get a more decent mark-up for people to notice them. Update: this is easy with a small css tweak (example).
And, last but not least, I am missing a feature to limit the blob-size for generating HTML. This is especially important for binary objects which are served as a hex-dump, generating gazillions of bytes for something you are not going to read anyway. Update: If you want something done, send a patch upstream! (example) :-)
Update 3: All three patches have found their way into the cgit master repository, thanks very much, Lars!