stagit

Personal fork of stagit, a static git page generator. It generates static HTML pages for a git repository.

This fork uses md4c to convert the README markdown into HTML and then shows it in an about page for each repository, this adds a new dependency. On top of that, the assets have been changed, creating a personal theme. The scripts have also been changed to fit my needs.

Usage

Make files per repository:

$ mkdir -p htmlroot/htmlrepo1 && cd htmlroot/htmlrepo1
$ stagit path/to/gitrepo1
repeat for other repositories
$ ...

Make index file for repositories:

$ cd htmlroot
$ stagit-index path/to/gitrepo1 \
               path/to/gitrepo2 \
               path/to/gitrepo3 > index.html

Build and install

$ make
# make install

Dependencies

Documentation

See man pages: stagit(1) and stagit-index(1).

Building a static binary

It may be useful to build static binaries, for example to run in a chroot.

It can be done like this at the time of writing (v0.24):

cd libgit2-src

# change the options in the CMake file: CMakeLists.txt
BUILD_SHARED_LIBS to OFF (static)
CURL to OFF              (not needed)
USE_SSH OFF              (not needed)
THREADSAFE OFF           (not needed)
USE_OPENSSL OFF          (not needed, use builtin)

mkdir -p build && cd build
cmake ../
make
make install

Extract owner field from git config

A way to extract the gitweb owner for example in the format:

[gitweb]
    owner = Name here

Script:

#!/bin/sh
awk '/^[ 	]*owner[ 	]=/ {
    sub(/^[^=]*=[ 	]*/, "");
    print $0;
}'

Set clone URL for a directory of repos

#!/bin/sh
cd "$dir"
for i in *; do
    test -d "$i" && echo "git://git.codemadness.org/$i" > "$i/url"
done

Update files on git push

Using a post-receive hook the static files can be automatically updated. Keep in mind git push -f can change the history and the commits may need to be recreated. This is because stagit checks if a commit file already exists. It also has a cache (-c) option which can conflict with the new history. See stagit(1).

git post-receive hook (repo/.git/hooks/post-receive):

#!/bin/sh
# detect git push -f
force=0
while read -r old new ref; do
    hasrevs=$(git rev-list "$old" "^$new" | sed 1q)
    if test -n "$hasrevs"; then
        force=1
        break
    fi
done

# remove commits and .cache on git push -f
#if test "$force" = "1"; then
# ...
#fi

# see example_create.sh for normal creation of the files.

Create .tar.gz archives by tag

#!/bin/sh
name="stagit"
mkdir -p archives
git tag -l | while read -r t; do
    f="archives/${name}-$(echo "${t}" | tr '/' '_').tar.gz"
    test -f "${f}" && continue
    git archive \
        --format tar.gz \
        --prefix "${t}/" \
        -o "${f}" \
        -- \
        "${t}"
done

Features

Cons