#!/bin/sh # this is probably the *fastest* git-daemon update possible. # ---------------------------------------------------------------------- # skip if arg-1 is POST_CREATE and no arg-3 (user name) exists; this means # it's been triggered by a *normal* (not "wild") repo creation, which in turn # means a POST_COMPILE should be following so there's no need to waste time # running this once for each new repo [ "$1" = "POST_CREATE" ] && [ -z "$3" ] && exit 0; EO=git-daemon-export-ok RB=`gitolite query-rc GL_REPO_BASE` export EO RB gitolite list-phy-repos | gitolite access % daemon R any | perl -lane ' unlink "$ENV{RB}/$F[0].git/$ENV{EO}" if /DENIED/; print $F[0] unless /DENIED/ ' | while read r do > $RB/$r.git/$EO done # A bit of explanation may be in order. The gitolite output looks somewhat # like this: # bar^Idaemon^IR any bar daemon DENIED by fallthru$ # foo^Idaemon^Irefs/.*$ # fubar^Idaemon^Irefs/.*$ # gitolite-admin^Idaemon^IR any gitolite-admin daemon DENIED by fallthru$ # testing^Idaemon^Irefs/.*$ # where I've type "^I" to denote a tab. # Shell has to fork 'rm' to delete a file but perl doesn't. So removing the # export-ok file from repos where needed is done in perl. # On the other hand, perls requires a bit more *code* to even create an empty # file. Shell can do it with just "> file", and it doesn't fork for this. So # that part is handled in shell. # You'll also see that the perl part is taking what it needs from the input # and passing the rest on, so the shell part doesn't have to do any grepping, # which would be a horrible slowdown. # $F and the rest is the magic of perl's flags (man perlrun).