about summary refs log tree commit diff
path: root/pkgs/servers/mastodon/update.sh
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/servers/mastodon/update.sh')
-rwxr-xr-xpkgs/servers/mastodon/update.sh121
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