snix/tools/releases/default.nix
Ilan Joselevich 91d02d8c84 style: Switch to nixfmt from nixpkgs-fmt
Most of the ecosystem has moved to this formatter,
and many people configured their editors to autoformat it with this formatter.

Closes: https://git.snix.dev/snix/snix/issues/62
Change-Id: Icf39e7836c91fc2ae49fbe22a40a639105bfb0bd
Reviewed-on: https://cl.snix.dev/c/snix/+/30671
Reviewed-by: Florian Klink <flokli@flokli.de>
Tested-by: besadii
Autosubmit: Ilan Joselevich <personal@ilanjoselevich.com>
2025-08-10 13:40:23 +00:00

53 lines
1.2 KiB
Nix

# Definitions for simple release mechanisms from depot.
{
depot,
lib,
pkgs,
...
}:
let
inherit (lib.strings) makeBinPath sanitizeDerivationName;
in
{
# Use a josh filter to push a certain subset of canon to another git
# repository.
#
# This expects, of course, that the remote repository has granted
# push access to the CI SSH key.
filteredGitPush =
{
filter,
remote,
ref ? "refs/heads/canon",
}:
{
label = ":git: push '${filter}' to external git repository";
branches = [ "refs/heads/canon" ];
phase = "release";
command = pkgs.writeShellScript "${sanitizeDerivationName filter}-push" ''
set -e
export PATH="${
makeBinPath [
pkgs.git
pkgs.josh
]
}:$PATH"
echo 'Filtering depot through ${filter}'
josh-filter '${filter}'
echo 'Fetching remote to check if a push is needed'
git fetch '${remote}' '${ref}'
if git merge-base --is-ancestor FILTERED_HEAD FETCH_HEAD; then
echo 'Commit already present, nothing to push.'
exit 0
fi
echo 'Pushing filtered repository to ${remote}:${ref}'
git push '${remote}' 'FILTERED_HEAD:${ref}'
'';
};
}