summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--modules/tv/git.nix29
1 files changed, 28 insertions, 1 deletions
diff --git a/modules/tv/git.nix b/modules/tv/git.nix
index 052c04998..b7c8b56ae 100644
--- a/modules/tv/git.nix
+++ b/modules/tv/git.nix
@@ -201,11 +201,28 @@ in
findutils
gawk
git
+ gnugrep
+ gnused
])}
dataDir=${escapeShellArg cfg.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:
let
hooks = scriptFarm "git-ssh-hooks" (makeHooks repo);
@@ -218,9 +235,19 @@ in
git init --bare --template=/var/empty "$repodir"
chown -R git: "$repodir"
fi
- ln -snf ${hooks} "$repodir/hooks"
+ ln -s ${hooks} "$repodir/hooks"
''
) (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" ] // {