From 74c422d0a0ff9040ae68629c9657f77330ae8727 Mon Sep 17 00:00:00 2001 From: Vincent Ambo Date: Wed, 25 May 2022 18:17:42 +0200 Subject: feat(tools/releases): Add release helper for mirroring to Github This adds an extra step definition which can push the result of running a josh filter on the repository to Github. Change-Id: I1f93ae78e1bf452fbd1b21ce943a60acc85c944f Reviewed-on: https://cl.tvl.fyi/c/depot/+/5666 Tested-by: BuildkiteCI Reviewed-by: sterni Reviewed-by: grfn --- tools/releases/default.nix | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 tools/releases/default.nix (limited to 'tools/releases/default.nix') diff --git a/tools/releases/default.nix b/tools/releases/default.nix new file mode 100644 index 000000000000..2d00a2b01fb0 --- /dev/null +++ b/tools/releases/default.nix @@ -0,0 +1,37 @@ +# 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}' + ''; + }; +} -- cgit 1.4.1