Unverified Commit b1ae52d1 authored by Ivan Mincik's avatar Ivan Mincik Committed by GitHub
Browse files

repath-studio: init at 0.4.12 (#483031)

parents aa425853 ea1be532
Loading
Loading
Loading
Loading
+14 −0
Original line number Diff line number Diff line
diff --git a/deps.edn b/deps.edn
index 195de4e..6ebe31b 100644
--- a/deps.edn
+++ b/deps.edn
@@ -1,8 +1,7 @@
 {:paths ["src"]
  :deps {binaryage/devtools {:mvn/version "1.0.7"}
         camel-snake-kebab/camel-snake-kebab {:mvn/version "0.4.3"}
-        clj-kdtree/clj-kdtree {:git/url "https://github.com/abscondment/clj-kdtree.git"
-                               :sha "5ec321c5e8006db00fa8b45a8ed9eb0b8f3dd56d"
+        clj-kdtree/clj-kdtree {:local/root "@clj-kdtree_src@"
                                :deps/manifest :deps}
         com.taoensso/tempura {:mvn/version "1.5.4"}
         day8.re-frame/test {:mvn/version "0.1.7"}
+205 −0
Original line number Diff line number Diff line
{
  lib,
  stdenv,

  buildNpmPackage,
  fetchFromGitHub,
  pkg-config,
  electron,
  chromium,
  clojure,
  vips,

  writeShellScriptBin,
  copyDesktopItems,
  makeDesktopItem,
  makeWrapper,
  replaceVars,

  vulkan-loader,
}:
buildNpmPackage (finalAttrs: {
  pname = "repath-studio";
  version = "0.4.12";

  src = fetchFromGitHub {
    owner = "repath-studio";
    repo = "repath-studio";
    tag = "v${finalAttrs.version}";
    hash = "sha256-sdM3owUYI0P12+R4YyYtF/20Zl0EpJY6t4Z1q/K5EqM=";
  };

  patches = [
    (replaceVars ./hardcode-git-paths.patch {
      clj-kdtree_src = fetchFromGitHub {
        owner = "abscondment";
        repo = "clj-kdtree";
        rev = "5ec321c5e8006db00fa8b45a8ed9eb0b8f3dd56d";
        hash = "sha256-ZOv+9TxBsOnSSbfM7kJLP3cQH9FpgA15aETszg7YSes=";
      };
    })
    # outputHash of manvenDeps changes each time `clojure` is updated
    # https://github.com/ngi-nix/ngipkgs/pull/1727#discussion_r2470180998
    ./pin-clojure.patch
  ];

  makeCacheWritable = true;

  npmDepsHash = "sha256-Zihy5VYlkeQtmZUS25kgu3aYGPfQdUxjNSK33WHOEeQ=";

  nativeBuildInputs = [
    finalAttrs.passthru.clojureWithCache
    makeWrapper
    copyDesktopItems
    pkg-config # sharp
  ];

  # For 'sharp' dependency, otherwise it will try to build it
  buildInputs = [ vips ];

  env = {
    ELECTRON_SKIP_BINARY_DOWNLOAD = true;
    PUPPETEER_SKIP_DOWNLOAD = true;
  };

  postPatch = ''
    substituteInPlace shadow-cljs.edn \
      --replace-fail ":shadow-git-inject/version" '"v${finalAttrs.version}"'
  '';

  passthru = {
    # this was taken and adapted from "logseq" package's nixpkgs derivation
    mavenRepo = stdenv.mkDerivation {
      name = "repath-studio-${finalAttrs.version}-maven-deps";
      inherit (finalAttrs) src patches;

      nativeBuildInputs = [ clojure ];

      buildPhase = ''
        runHook preBuild

        export HOME="$(mktemp -d)"
        mkdir -p "$out"

        # -P       -> resolve all normal deps
        # -M:alias -> resolve extra-deps of the listed aliases
        clj -Sdeps "{:mvn/local-repo \"$out\"}" -P -M:dev:cljs

        runHook postBuild
      '';

      # copied from buildMavenPackage
      # keep only *.{pom,jar,sha1,nbm} and delete all ephemeral files with lastModified timestamps inside
      installPhase = ''
        runHook preInstall

        find $out -type f \( \
          -name \*.lastUpdated \
          -o -name resolver-status.properties \
          -o -name _remote.repositories \) \
          -delete

        runHook postInstall
      '';

      dontFixup = true;

      outputHash = "sha256-ytS7JiQUC7U0vxuQddxQfDnm0Pt4stkRBfiIlbOpeTk=";
      outputHashMode = "recursive";
      outputHashAlgo = "sha256";
    };

    clojureWithCache = writeShellScriptBin "clojure" ''
      exec ${lib.getExe' clojure "clojure"} -Sdeps '{:mvn/local-repo "${finalAttrs.passthru.mavenRepo}"}' "$@"
    '';
  };

  buildPhase = ''
    runHook preBuild

    # electronDist needs to be modifiable
    cp -r ${electron.dist} electron-dist
    chmod -R u+w electron-dist
  ''
  # Electron builder complains about symlink in electron-dist
  + lib.optionalString stdenv.hostPlatform.isLinux ''
    rm electron-dist/libvulkan.so.1
    cp ${lib.getLib vulkan-loader}/lib/libvulkan.so.1 electron-dist
  ''
  + ''
    npm run build
    npm exec electron-builder -- --dir \
      -c.electronDist=electron-dist \
      -c.electronVersion=${electron.version}

    runHook postBuild
  '';

  installPhase = ''
    runHook preInstall

    ${
      if stdenv.hostPlatform.isDarwin then
        # bash
        ''
          mkdir -p $out/Applications
          cp -r "dist/mac"*"/Repath Studio.app" "$out/Applications"
          makeWrapper "$out/Applications/Repath Studio.app/Contents/MacOS/Repath Studio" "$out/bin/repath-studio"
        ''
      else
        # bash
        ''
          mkdir -p $out/share/{repath-studio,icons/hicolor/scalable/apps}
          cp -r dist/*-unpacked/resources/app.asar $out/share/repath-studio
          cp resources/public/img/icon.svg $out/share/icons/hicolor/scalable/apps/repath-studio.svg

          makeWrapper '${lib.getExe electron}' "$out/bin/repath-studio" \
            --add-flags "$out/share/repath-studio/app.asar" \
            --add-flags "\''${NIXOS_OZONE_WL:+\''${WAYLAND_DISPLAY:+--ozone-platform-hint=auto --enable-features=WaylandWindowDecorations}}" \
            --set-default ELECTRON_FORCE_IS_PACKAGED 1 \
            --inherit-argv0
        ''
    }

    runHook postInstall
  '';

  # chromium package not available for darwin
  doCheck = stdenv.hostPlatform.isLinux;
  checkPhase = ''
    runHook preCheck
    export ELECTRON_OVERRIDE_DIST_PATH=electron-dist/
    export PUPPETEER_EXECUTABLE_PATH=${chromium}/bin/chromium
    export CHROME_BIN=${chromium}/bin/chromium
    npm run test
    unset ELECTRON_OVERRIDE_DIST_PATH
    runHook postCheck
  '';

  desktopItems = [
    (makeDesktopItem {
      name = "Repath Studio";
      desktopName = "Repath Studio";
      exec = "repath-studio %U";
      type = "Application";
      terminal = false;
      icon = "repath-studio";
      comment = "Vector graphics editor, that combines procedural tooling with traditional design workflows";
      categories = [ "Graphics" ];
    })
  ];

  passthru.updateScript = ./update.sh;

  meta = {
    changelog = "https://github.com/repath-studio/repath-studio/blob/v${finalAttrs.src.rev}/CHANGELOG.md";
    description = "Cross-platform vector graphics editor, that combines procedural tooling with traditional design workflows";
    homepage = "https://repath.studio";
    downloadPage = "https://github.com/repath-studio/repath-studio";
    license = lib.licenses.agpl3Only;
    mainProgram = "repath-studio";
    maintainers = with lib.maintainers; [ phanirithvij ];
    teams = with lib.teams; [ ngi ];
    platforms = electron.meta.platforms;
  };
})
+12 −0
Original line number Diff line number Diff line
diff --git a/deps.edn b/deps.edn
index 195de4e..02098e5 100644
--- a/deps.edn
+++ b/deps.edn
@@ -1,5 +1,6 @@
 {:paths ["src"]
- :deps {binaryage/devtools {:mvn/version "1.0.7"}
+ :deps {org.clojure/clojure {:mvn/version "1.12.4"}
+        binaryage/devtools {:mvn/version "1.0.7"}
         camel-snake-kebab/camel-snake-kebab {:mvn/version "0.4.3"}
         clj-kdtree/clj-kdtree {:git/url "https://github.com/abscondment/clj-kdtree.git"
                                :sha "5ec321c5e8006db00fa8b45a8ed9eb0b8f3dd56d"
+112 −0
Original line number Diff line number Diff line
#!/usr/bin/env nix-shell
#!nix-shell -i bash -p curl jq nix-update gitMinimal diffutils gnused

set -x
set -eou pipefail

# check for updates
token_args=""
if [[ -n "${GITHUB_TOKEN:-}" ]]; then
  token_args="-H \"Authorization: Bearer $GITHUB_TOKEN\""
fi

latest_tag=$(curl ${token_args} -sL "https://api.github.com/repos/repath-studio/repath-studio/releases/latest" | jq -r '.tag_name')
version="${latest_tag#v}"

set +ue
if [[ "${UPDATE_NIX_OLD_VERSION:-}" == "$version" ]]; then
  echo "Already up-to-date, version: $version"
  exit 0
fi
set -ue

NIXPKGS_PATH="$(git rev-parse --show-toplevel)"
PACKAGE_DIR="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )"

PACKAGE_FILE="$PACKAGE_DIR/package.nix"
PATCH_GIT_FILE="$PACKAGE_DIR/hardcode-git-paths.patch"
PATCH_CLJ_FILE="$PACKAGE_DIR/pin-clojure.patch"

pushd $NIXPKGS_PATH
nix-update --version="$version" repath-studio
popd

TMPDIR="$(mktemp -d)"
trap 'rm -rf "$TMPDIR"' EXIT
pushd "$TMPDIR"

src="$(nix-build --no-link "$NIXPKGS_PATH" -A repath-studio.src)"
cp "$src/deps.edn" deps.edn

# pin clojure from the upstream's pinned version
workflow_file="$src/.github/workflows/desktop-app.yml"
clj_version="$(
  grep -A 10 "uses:.*setup-clojure" "$workflow_file" |
    grep "cli:" |
    head -n1 |
    sed -E 's/.*cli:\s+([0-9]+\.[0-9]+\.[0-9]+).*/\1/'
)"

if [[ -z "$clj_version" ]]; then
  echo "Error: Could not parse clojure version from $workflow_file" >&2
  exit 1
fi

mkdir -p a b
cp deps.edn a/deps.edn
cp deps.edn b/deps.edn

# insert clojure dep at start of :deps map
sed -i "0,/:deps {/s|:deps {|:deps {org.clojure/clojure {:mvn/version \"$clj_version\"}\n        |" b/deps.edn
git diff --no-index --no-prefix a/deps.edn b/deps.edn >"$PATCH_CLJ_FILE" || true

rm -rf a b

# patches a dependency to be prefetched by nix
# clojure otherwise tries to fetch it at buildtime

# extract sha from clean deps.edn
clj_sha=$(grep -A 2 "clj-kdtree/clj-kdtree" deps.edn | grep -oP ':sha "\K[^"]+')

if [[ -z "$clj_sha" ]]; then
  echo "Error: Could not extract clj-kdtree SHA from deps.edn" >&2
  exit 1
fi

clj_hash=$(nix-prefetch-url --unpack "https://github.com/abscondment/clj-kdtree/archive/$clj_sha.tar.gz" --type sha256)
clj_hash=$(nix hash convert --hash-algo sha256 --from nix32 "$clj_hash")

sed -i "/owner = \"abscondment\"/,/hash =/ s/rev = \".*\"/rev = \"$clj_sha\"/" "$PACKAGE_FILE"
sed -i "/owner = \"abscondment\"/,/hash =/ s|hash = \".*\"|hash = \"$clj_hash\"|" "$PACKAGE_FILE"

mkdir -p a b
cp deps.edn a/deps.edn
cp deps.edn b/deps.edn

sed -i '/clj-kdtree\/clj-kdtree/,/:sha/c\        clj-kdtree/clj-kdtree {:local/root "@clj-kdtree_src@"' b/deps.edn
git diff --no-index --no-prefix a/deps.edn b/deps.edn >"$PATCH_GIT_FILE" || true

rm -rf a b
popd

# maven deps

dummy_hash="sha256-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="
sed -i "s|outputHash = \".*\";|outputHash = \"$dummy_hash\";|" "$PACKAGE_FILE"

# expect failure to get new hash
set +e
new_mvn_hash="$(
  nix-build --no-link -A repath-studio.passthru.mavenRepo "$NIXPKGS_PATH" 2>&1 >/dev/null |
    grep "got:" | cut -d':' -f2 | sed 's| ||g'
)"
set -e

if [[ -z "$new_mvn_hash" ]]; then
  echo "Failed to get new maven hash." >&2
  exit 1
fi

sed -i "s|\"$dummy_hash\"|\"$new_mvn_hash\"|g" "$PACKAGE_FILE"

echo "Update to $version complete."