diff options
Diffstat (limited to 'pkgs/servers/mastodon/update.sh')
-rwxr-xr-x | pkgs/servers/mastodon/update.sh | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/pkgs/servers/mastodon/update.sh b/pkgs/servers/mastodon/update.sh new file mode 100755 index 000000000000..be06f52207d0 --- /dev/null +++ b/pkgs/servers/mastodon/update.sh @@ -0,0 +1,121 @@ +#!/usr/bin/env bash +set -e + +URL=https://github.com/tootsuite/mastodon.git + +POSITIONAL=() +while [[ $# -gt 0 ]]; do + key="$1" + + case $key in + --url) + URL="$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 [[ -z "$VERSION" || -n "$POSITIONAL" ]]; then + echo "Usage: update.sh [--url URL] --ver VERSION [--rev REVISION] [--patches PATCHES]" + echo "URL may be any path acceptable to 'git clone' and VERSION the" + echo "semantic version number. If VERSION is not a revision acceptable to" + echo "'git checkout', you must provide one in REVISION. If URL is not" + echo "provided, it defaults to https://github.com/tootsuite/mastodon.git." + echo "PATCHES, if provided, should be one or more Nix expressions" + echo "separated by spaces." + exit 1 +fi + +if [[ -z "$REVISION" ]]; then + REVISION="$VERSION" +fi + +rm -f gemset.nix yarn.nix version.nix version.patch source.nix package.json +TARGET_DIR="$PWD" + + +WORK_DIR=$(mktemp -d) + +# Check that working directory was created. +if [[ ! "$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 from $URL" +JSON=$(nix-prefetch-git --url "$URL" --rev "$REVISION" 2> $WORK_DIR/nix-prefetch-git.out) +SHA=$(echo $JSON | jq -r .sha256) +FETCHED_SOURCE_DIR=$(grep '^path is' $WORK_DIR/nix-prefetch-git.out | sed 's/^path is //') + +echo "Creating version.nix" +echo \"$VERSION\" | sed 's/^"v/"/' > version.nix + +echo "Creating source.nix" +# yarn2nix and mkYarnPackage want the version to be present in +# package.json. Mastodon itself does not include the version in +# package.json but at least one fork (Soapbox) does. +if [ $(jq .version $FETCHED_SOURCE_DIR/package.json) == "null" ]; then + mkdir $WORK_DIR/a $WORK_DIR/b + cp $FETCHED_SOURCE_DIR/package.json $WORK_DIR/a + cd $WORK_DIR + jq "{version:$(cat $TARGET_DIR/version.nix)} + ." a/package.json > b/package.json + diff -Naur --label a/package.json --label b/package.json a b > $TARGET_DIR/version.patch || true + rm -rf a b tmp + cd $TARGET_DIR + PATCHES="$PATCHES ./version.patch " +fi + +cat > source.nix << EOF +# This file was generated by pkgs.mastodon.updateScript. +{ fetchgit, applyPatches }: let + src = fetchgit { + url = "$URL"; + rev = "$REVISION"; + sha256 = "$SHA"; + }; +in applyPatches { + inherit src; + 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 "" >> $TARGET_DIR/gemset.nix # Create trailing newline to please EditorConfig checks + +echo "Creating yarn.nix" +cp -r $SOURCE_DIR/* $WORK_DIR +chmod -R u+w $WORK_DIR +cd $WORK_DIR +yarn2nix > $TARGET_DIR/yarn.nix +sed "s/https___.*_//g" -i $TARGET_DIR/yarn.nix +cp $WORK_DIR/package.json $TARGET_DIR |