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!
