modules/tv/git: sanity-check repos on activation

This commit is contained in:
tv 2015-06-15 00:34:42 +02:00
parent dcdf12fd0b
commit 61f60acc33

View File

@ -201,11 +201,28 @@ in
findutils findutils
gawk gawk
git git
gnugrep
gnused
])} ])}
dataDir=${escapeShellArg cfg.dataDir} dataDir=${escapeShellArg cfg.dataDir}
mkdir -p "$dataDir" mkdir -p "$dataDir"
# Notice how the presence of hooks symlinks determine whether
# we manage a repositry or not.
# Make sure that no existing repository has hooks. We can delete
# symlinks because we assume we created them.
find "$dataDir" -mindepth 2 -maxdepth 2 -name hooks -type l -delete
bad_hooks=$(find "$dataDir" -mindepth 2 -maxdepth 2 -name hooks)
if echo "$bad_hooks" | grep -q .; then
printf "$(printf 'error: unknown hooks:\n%s' \
"$(echo "$bad_hooks" | sed 's/^/ /')")" \
>&2
exit -1
fi
# Initialize repositories.
${concatMapStringsSep "\n" (repo: ${concatMapStringsSep "\n" (repo:
let let
hooks = scriptFarm "git-ssh-hooks" (makeHooks repo); hooks = scriptFarm "git-ssh-hooks" (makeHooks repo);
@ -218,9 +235,19 @@ in
git init --bare --template=/var/empty "$repodir" git init --bare --template=/var/empty "$repodir"
chown -R git: "$repodir" chown -R git: "$repodir"
fi fi
ln -snf ${hooks} "$repodir/hooks" ln -s ${hooks} "$repodir/hooks"
'' ''
) (attrValues cfg.repos)} ) (attrValues cfg.repos)}
# Warn about repositories that exist but aren't mentioned in the
# current configuration (and thus didn't receive a hooks symlink).
unknown_repos=$(find "$dataDir" -mindepth 1 -maxdepth 1 \
-type d \! -exec test -e '{}/hooks' \; -print)
if echo "$unknown_repos" | grep -q .; then
printf 'warning: stale repositories:\n%s\n' \
"$(echo "$unknown_repos" | sed 's/^/ /')" \
>&2
fi
''; '';
makeHooks = repo: removeAttrs repo.hooks [ "pre-receive" ] // { makeHooks = repo: removeAttrs repo.hooks [ "pre-receive" ] // {