about summary refs log tree commit diff
path: root/tools/releases/default.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" ];
    postBuild = true;

    command = pkgs.writeShellScript "${sanitizeDerivationName filter}-push" ''
      set -e
      export PATH="${makeBinPath [ pkgs.git depot.third_party.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}'
    '';
  };
}