diff --git a/pkgs/by-name/gr/graphhopper/package.nix b/pkgs/by-name/gr/graphhopper/package.nix new file mode 100644 index 000000000000..95d3e7e3b4ff --- /dev/null +++ b/pkgs/by-name/gr/graphhopper/package.nix @@ -0,0 +1,152 @@ +{ + fetchFromGitHub, + fetchurl, + lib, + stdenv, + testers, + + jre, + makeWrapper, + maven, + ... +}: +let + version = builtins.fromTOML (builtins.readFile ./version.toml); + + src = fetchFromGitHub { + owner = "graphhopper"; + repo = "graphhopper"; + tag = version.patch; + hash = version.hash.src; + }; + + # Patch graphhopper to remove the npm download + patches = [ ./remove-npm-dependency.patch ]; + + # Graphhopper also relies on a maps bundle downloaded from npm + # By default it installs nodejs and npm during the build, + # But we patch that out so we much fetch it ourselves + mapsBundle = fetchurl { + name = "@graphhopper/graphhopper-maps-bundle-${version.mapsBundle}"; + url = "https://registry.npmjs.org/@graphhopper/graphhopper-maps-bundle/-/graphhopper-maps-bundle-${version.mapsBundle}.tgz"; + hash = version.hash.mapsBundle; + }; + + # We cannot use `buildMavenPackage` as we need to load in the + # mapsBundle before doing anything + mvnDeps = stdenv.mkDerivation { + name = "graphhopper-dependencies"; + + inherit src patches; + + buildInputs = [ maven ]; + + buildPhase = '' + # Fetching deps with mvn dependency:go-offline does not quite catch everything, so we use this plugin instead + mvn de.qaware.maven:go-offline-maven-plugin:resolve-dependencies \ + -Dmaven.repo.local=$out/.m2 \ + -Dmaven.wagon.rto=5000 + ''; + + installPhase = '' + # keep only *.{pom,jar,sha1,nbm} and delete all ephemeral files with lastModified timestamps inside + find $out -type f \( \ + -name \*.lastUpdated \ + -o -name resolver-status.properties \ + -o -name _remote.repositories \) \ + -delete + ''; + + outputHashMode = "recursive"; + outputHash = version.hash.mvnDeps; + }; +in +stdenv.mkDerivation (finalAttrs: { + pname = "graphhopper"; + + inherit src patches; + + version = version.patch; + + buildInputs = [ + makeWrapper + maven + ]; + + configurePhase = '' + runHook preConfigure + + mkdir -p ./web-bundle/target/ + ln -s ${mapsBundle} ./web-bundle/target/graphhopper-graphhopper-maps-bundle-${version.mapsBundle}.tgz + + runHook postConfigure + ''; + + # Build and skip tests because downloading of + # test deps seems to not work with the go-offline plugin + buildPhase = '' + runHook preBuild + + mvn package --offline \ + -Dmaven.repo.local=${mvnDeps}/.m2 \ + -DskipTests + + runHook postBuild + ''; + + installPhase = '' + runHook preInstall + + mkdir -p $out/bin + + ln -s ${mvnDeps}/.m2 $out/lib + + # Grapphopper versions are seemingly compiled under the major release name, + # not the patch name, which is the version we want for our package + cp ./web/target/graphhopper-web-${version.major}-SNAPSHOT.jar $out/bin/graphhopper-web-${version.major}-SNAPSHOT.jar + + makeWrapper ${jre}/bin/java $out/bin/graphhopper \ + --add-flags "-jar $out/bin/graphhopper-web-${version.major}-SNAPSHOT.jar" \ + --chdir $out + + runHook postInstall + ''; + + fixupPhase = '' + runHook preFixup + + # keep only *.{pom,jar,sha1,nbm} and delete all ephemeral files with lastModified timestamps inside + find $out -type f \( \ + -name \*.lastUpdated \ + -o -name resolver-status.properties \ + -o -name _remote.repositories \) \ + -delete + + runHook postFixup + ''; + + meta = { + description = "Fast and memory-efficient routing engine for OpenStreetMap"; + homepage = "https://www.graphhopper.com/"; + changelog = "https://github.com/graphhopper/graphhopper/releases/tag/${version.patch}"; + license = lib.licenses.asl20; + maintainers = with lib.maintainers; [ baileylu ]; + teams = [ lib.teams.geospatial ]; + platforms = lib.platforms.all; + mainProgram = "graphhopper"; + sourceProvenance = with lib.sourceTypes; [ + fromSource + binaryBytecode + ]; + }; + + passthru = { + updateScript = ./update.nu; + tests.version = testers.testVersion { + package = finalAttrs.finalPackage; + # `graphhopper --version` does not work as the source does not specify `Implementation-Version` + command = "graphhopper --help"; + version = "graphhopper-web-${version.major}-SNAPSHOT.jar"; + }; + }; +}) diff --git a/pkgs/by-name/gr/graphhopper/remove-npm-dependency.patch b/pkgs/by-name/gr/graphhopper/remove-npm-dependency.patch new file mode 100644 index 000000000000..5970af9db017 --- /dev/null +++ b/pkgs/by-name/gr/graphhopper/remove-npm-dependency.patch @@ -0,0 +1,55 @@ +From ad687709cfca51603264ff565f296cfb5dceb15a Mon Sep 17 00:00:00 2001 +From: Luke Bailey +Date: Wed, 19 Mar 2025 22:25:44 +0000 +Subject: [PATCH] Swap out frontend maven plugin which downloads npm + for fetching it through nix instead + +--- + web-bundle/pom.xml | 31 ------------------------------- + 1 file changed, 31 deletions(-) + +diff --git a/web-bundle/pom.xml b/web-bundle/pom.xml +index 9a4d83b62..1d995cbaf 100644 +--- a/web-bundle/pom.xml ++++ b/web-bundle/pom.xml +@@ -129,37 +129,6 @@ + + + +- +- com.github.eirslett +- frontend-maven-plugin +- 1.12.1 +- +- +- install node and npm +- +- install-node-and-npm +- +- +- v20.14.0 +- 10.7.0 +- +- +- +- download graphhopper maps +- generate-resources +- +- npm +- +- +- +- +- pack --pack-destination=${basedir}/target +- @graphhopper/graphhopper-maps-bundle@${graphhopper-maps.version} +- +- +- +- +- + + maven-antrun-plugin + +-- +2.48.1 + diff --git a/pkgs/by-name/gr/graphhopper/update.nu b/pkgs/by-name/gr/graphhopper/update.nu new file mode 100755 index 000000000000..80a27b5106ed --- /dev/null +++ b/pkgs/by-name/gr/graphhopper/update.nu @@ -0,0 +1,102 @@ +#!/usr/bin/env nix-shell +#! nix-shell -i nu -p nushell nix-prefetch-github common-updater-scripts + +use std/log + +let version_info = "./pkgs/by-name/gr/graphhopper/version.toml" + +let current_version = open $version_info + +let latest_tag = list-git-tags --url=https://github.com/graphhopper/graphhopper + | lines + | sort --natural + | where ($it =~ '^[\d.]+$') + | last + +if $current_version.patch == $latest_tag { + log debug "Current graphhopper version matched latest version of graphhopper, no update is needed, exiting..." + exit 0 +} + +let major = $latest_tag + | str replace -ar '(\d+)\.\d+' '$1.0' + +log debug $"Fetching source for graphhopper patch ($latest_tag) on version ($major)" +let source = nix-prefetch-github graphhopper graphhopper --rev $latest_tag + | from json + +log debug $"Reading maps bundle version for ($latest_tag)" +let web_bundle_pom = http get $"https://api.github.com/repos/graphhopper/graphhopper/contents/web-bundle/pom.xml?ref=($latest_tag)" + | $in.content + | base64 --decode + | into string + | from xml + +let maps_bundle_properties = $web_bundle_pom.content + | where ($it.tag =~ "properties") + | first + +let maps_bundle_version = $maps_bundle_properties.content + | where ($it.tag =~ "graphhopper-maps.version") + | first + | $in.content + | first + | $in.content + +log debug $"Fetching maps bundle ($maps_bundle_version)" +let maps_bundle_hash = nix-prefetch-url $"https://registry.npmjs.org/@graphhopper/graphhopper-maps-bundle/-/graphhopper-maps-bundle-($maps_bundle_version).tgz" + | nix-hash --type sha256 --to-base64 $in + | ["sha256-", $in] + | str join + +log debug $"Writing to ($version_info) without mvnDeps hash..." + +{ + major: $major, + patch: $latest_tag, + mapsBundle: $maps_bundle_version, + + hash: { + src: $source.hash + mapsBundle: $maps_bundle_hash + mvnDeps: "sha256-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" + } +} + | to toml + | save $version_info -f + +log debug "Calculating mvnDeps hash..." +let graphhopper_build_logs = nix-build -A graphhopper o+e>| cat + +let mvn_hash_lines = $graphhopper_build_logs + | lines + | find "got:" + +if ($mvn_hash_lines | length) == 0 { + log error $"Could not find any maven hash in the graphhopper build logs - maybe a different error occurred: \n$($graphhopper_build_logs)" + exit 1 +} + +log debug $"Found relevant hash lines: ($mvn_hash_lines)" +let mvn_hash = $mvn_hash_lines + | first + | ansi strip + | str replace 'got:' '' + | str trim + +log debug $"Writing to ($version_info) with mvnDeps hash ($mvn_hash).." +{ + major: $major, + patch: $latest_tag, + mapsBundle: $maps_bundle_version, + + hash: { + src: $source.hash + mapsBundle: $maps_bundle_hash + mvnDeps: $mvn_hash + } +} + | to toml + | save $version_info -f + +log debug $"Successfully updated graphhopper package!" diff --git a/pkgs/by-name/gr/graphhopper/version.toml b/pkgs/by-name/gr/graphhopper/version.toml new file mode 100644 index 000000000000..3bd74b1906c9 --- /dev/null +++ b/pkgs/by-name/gr/graphhopper/version.toml @@ -0,0 +1,8 @@ +major = "10.0" +patch = "10.2" +mapsBundle = "0.0.0-4718098d1db1798841a4d12f1727e8e8f7eab202" + +[hash] +src = "sha256-E6G9JR1lrXhNJ4YgMM0n0RsQcMZQM2QldGc74f5FALo=" +mapsBundle = "sha256-jZTNJfmMWJQHpJ8um3yTBx/KtIfdr0EwKJ9kSFalWJQ=" +mvnDeps = "sha256-KidbIBnW//IiKPFy3plFWOED8gP/ZCg4buwMgzttaY8="