#!/usr/bin/env nix-shell
#! nix-shell -i bash -p bundix coreutils diffutils nixfmt nix-prefetch-github gnused jq yarn-berry_4.yarn-berry-fetcher
set -e

OWNER=mastodon
REPO=mastodon

POSITIONAL=()
while [[ $# -gt 0 ]]; do
    key="$1"

    case $key in
        --owner)
            OWNER="$2"
            shift # past argument
            shift # past value
            ;;
        --repo)
            REPO="$2"
            shift # past argument
            shift # past value
            ;;
        --ver)
            VERSION="$2"
            shift # past argument
            shift # past value
            ;;
        --rev)
            REVISION="$2"
            shift # past argument
            shift # past value
            ;;
        --patches)
            PATCHES="$2"
            shift # past argument
            shift # past value
            ;;
        *)  # unknown option
            POSITIONAL+=("$1")
            shift # past argument
            ;;
    esac
done

if [[ -n "$POSITIONAL" ]]; then
    echo "Usage: update.sh [--owner OWNER] [--repo REPO] [--ver VERSION] [--rev REVISION] [--patches PATCHES]"
    echo "OWNER and REPO must be paths on github."
    echo "If REVISION is not provided, the latest tag from github.com/mastodon/mastodon is fetched and VERSION is calculated from it."
    echo "If OWNER and REPO are not provided, it defaults they default to mastodon and mastodon."
    echo "PATCHES, if provided, should be one or more Nix expressions separated by spaces."
    exit 1
fi

if [[ -z "$REVISION" ]]; then
    REVISION="$(curl ${GITHUB_TOKEN:+" -u \":$GITHUB_TOKEN\""} -s "https://api.github.com/repos/$OWNER/$REPO/releases" | jq -r  'map(select(.prerelease == false)) | .[0].tag_name')"
fi

VERSION="$(echo "$REVISION" | cut -c2-)"

rm -f gemset.nix source.nix
cd "$(dirname "${BASH_SOURCE[0]}")" || exit 1

WORK_DIR=$(mktemp -d)

# Check that working directory was created.
if [[ -z "$WORK_DIR" || ! -d "$WORK_DIR" ]]; then
    echo "Could not create temporary directory"
    exit 1
fi

# Delete the working directory on exit.
function cleanup {
    # Report errors, if any, from nix-prefetch-git
    grep "fatal" $WORK_DIR/nix-prefetch-git.out >/dev/stderr || true
    rm -rf "$WORK_DIR"
}
trap cleanup EXIT

echo "Fetching source code $REVISION"
JSON=$(nix-prefetch-github "$OWNER" "$REPO" --rev "$REVISION" 2> $WORK_DIR/nix-prefetch-git.out)
HASH=$(echo "$JSON" | jq -r .hash)

cat > source.nix << EOF
# This file was generated by pkgs.mastodon.updateScript.
{
  fetchFromGitHub,
  applyPatches,
  patches ? [ ],
}:
let
  version = "$VERSION";
in
applyPatches {
  src = fetchFromGitHub {
    owner = "$OWNER";
    repo = "$REPO";
    rev = "v\${version}";
    hash = "$HASH";
    passthru = {
      inherit version;
      yarnHash = "sha256-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=";
      yarnMissingHashes = ./missing-hashes.json;
    };
  };
  patches = patches ++ [ $PATCHES];
}
EOF
SOURCE_DIR="$(nix-build --no-out-link -E '(import <nixpkgs> {}).callPackage ./source.nix {}')"

echo "Creating gemset.nix"
bundix --lockfile="$SOURCE_DIR/Gemfile.lock" --gemfile="$SOURCE_DIR/Gemfile"
echo "" >> gemset.nix  # Create trailing newline to please EditorConfig checks

# Fix formatting
nixfmt gemset.nix

echo "Updating yarnHash"
yarn-berry-fetcher missing-hashes "$SOURCE_DIR/yarn.lock" > missing-hashes.json
YARN_HASH="$(yarn-berry-fetcher prefetch "$SOURCE_DIR/yarn.lock" ./missing-hashes.json 2>/dev/null)"
sed -i "s;sha256-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=;$YARN_HASH;g" source.nix

