2022-05-25 18:17:42 +02:00
|
|
|
# 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" ];
|
2022-06-03 14:38:02 +02:00
|
|
|
phase = "release";
|
2022-05-25 18:17:42 +02:00
|
|
|
|
|
|
|
command = pkgs.writeShellScript "${sanitizeDerivationName filter}-push" ''
|
|
|
|
set -e
|
2024-04-18 15:15:46 +02:00
|
|
|
export PATH="${makeBinPath [ pkgs.git pkgs.josh ]}:$PATH"
|
2022-05-25 18:17:42 +02:00
|
|
|
|
2023-03-30 16:30:22 +02:00
|
|
|
echo 'Filtering depot through ${filter}'
|
|
|
|
josh-filter '${filter}'
|
2022-05-25 18:17:42 +02:00
|
|
|
|
|
|
|
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}'
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
}
|