From b90c4685335246ffb4fef6fd6caaf4e12dfd0e17 Mon Sep 17 00:00:00 2001 From: sefidel Date: Sun, 5 Feb 2023 02:23:01 +0900 Subject: feat(colmena/services): gitolite: regularly clean trashed repositories --- colmena/cobalt/services/gitolite.nix | 51 ++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/colmena/cobalt/services/gitolite.nix b/colmena/cobalt/services/gitolite.nix index 845c026..4461a30 100644 --- a/colmena/cobalt/services/gitolite.nix +++ b/colmena/cobalt/services/gitolite.nix @@ -1,3 +1,5 @@ +{ pkgs, ... }: + { services.gitolite = { enable = true; @@ -20,4 +22,53 @@ environment.persistence."/persist".directories = [ "/var/lib/gitolite" ]; + + + systemd.timers."gitolite-trash-cleanup" = { + wantedBy = [ "timers.target" ]; + timerConfig = { + OnCalendar = "*-*-* 00:00:00"; + Unit = "gitolite-trash-cleanup.service"; + }; + }; + + systemd.services."gitolite-trash-cleanup" = { + script = '' + set -euo pipefail + if [ ! -d "Trash" ] ; then + echo Trash directory is nonexistent! + echo No operations to perform. Exiting. + exit 0 + fi + + match=$(find Trash -type d -regextype posix-extended -regex ".*/[0-9]{4}-[0-9]{2}-[0-9]{2}_[0-9]{2}:[0-9]{2}:[0-9]{2}$") + processed_entry=0 + removed_entry=0 + + for dir in $match + do + system_timestamp=$(date +%s) + trash_timestamp=$(basename $dir | sed -e "s/_/ /g" | date -f - +%s) + age=$(( $system_timestamp - $trash_timestamp )) + # Wipe trashes older than 2w + if [[ age -gt 1209600 ]] ; then + target_dir=$(rev <<< $dir | cut -d'/' -f2- | rev) + echo "Removing '$target_dir' (age $age)" + rm -rf $target_dir + ((removed_entry+=1)) + fi + ((processed_entry+=1)) + done + + echo "Done! Removed $removed_entry/$processed_entry" + ''; + + path = with pkgs; [ bash util-linux coreutils ]; + + serviceConfig = { + Type = "oneshot"; + User = "git"; + WorkingDirectory = "/var/lib/gitolite/repositories"; + }; + }; } -- cgit 1.4.1