From 34ce9c64c9c123afb16def28966858fe41b955c4 Mon Sep 17 00:00:00 2001 From: hacker1024 Date: Thu, 26 Oct 2023 00:34:58 +1100 Subject: [PATCH] pub2nix.readPubspecLock: Include entire source in package derivations This allows references to paths above the package being built, e.g. https://github.com/ExpidusOS/libtokyo/blob/bc5d988f32b67a9f91ff34248f69c45cfb4efcca/packages/libtokyo_flutter/pubspec.yaml#L42 --- .../instant-messengers/fluffychat/default.nix | 2 +- .../dart/pub2nix/package-config.nix | 67 +++++++++++-------- .../dart/pub2nix/pubspec-lock.nix | 37 ++++------ pkgs/build-support/flutter/default.nix | 2 +- .../desktops/expidus/file-manager/default.nix | 4 +- 5 files changed, 56 insertions(+), 56 deletions(-) diff --git a/pkgs/applications/networking/instant-messengers/fluffychat/default.nix b/pkgs/applications/networking/instant-messengers/fluffychat/default.nix index ef4c22bf905a..557691e86042 100644 --- a/pkgs/applications/networking/instant-messengers/fluffychat/default.nix +++ b/pkgs/applications/networking/instant-messengers/fluffychat/default.nix @@ -28,7 +28,7 @@ flutter.buildFlutterApplication rec { gitHashes = { keyboard_shortcuts = "sha256-U74kRujftHPvpMOIqVT0Ph+wi1ocnxNxIFA1krft4Os="; - wakelock_windows = "sha256-/zq8HFnYpBG61R1OTJ80WAaPjZqmHs+8Ww4Gv4rLXAM="; + wakelock_windows = "sha256-Dfwe3dSScD/6kvkP67notcbb+EgTQ3kEYcH7wpra2dI="; }; desktopItem = makeDesktopItem { diff --git a/pkgs/build-support/dart/pub2nix/package-config.nix b/pkgs/build-support/dart/pub2nix/package-config.nix index 29c6bac6b2cd..309e51ec84a1 100644 --- a/pkgs/build-support/dart/pub2nix/package-config.nix +++ b/pkgs/build-support/dart/pub2nix/package-config.nix @@ -14,7 +14,10 @@ }: let - packages = lib.getAttrs dependencies dependencySources; + packages = lib.genAttrs dependencies (dependency: rec { + src = dependencySources.${dependency}; + inherit (src) packageRoot; + }); in (runCommand "${lib.optionalString (pname != null) "${pname}-"}package-config.json" { inherit packages; @@ -23,35 +26,43 @@ in __structuredAttrs = true; }) '' - declare -A packages - while IFS='=' read -r name path; do - packages["$name"]="$path" - done < <(jq -r '.packages | to_entries | map("\(.key)=\(.value)") | .[]' "$NIX_ATTRS_JSON_FILE") + declare -A packageSources + declare -A packageRoots + while IFS=',' read -r name src packageRoot; do + packageSources["$name"]="$src" + packageRoots["$name"]="$packageRoot" + done < <(jq -r '.packages | to_entries | map("\(.key),\(.value.src),\(.value.packageRoot)") | .[]' "$NIX_ATTRS_JSON_FILE") - jq > "$out" --slurp '{ + for package in "''${!packageSources[@]}"; do + if [ ! -e "''${packageSources["$package"]}/''${packageRoots["$package"]}/pubspec.yaml" ]; then + echo >&2 "The package sources for $package are missing. Is the following path inside the source derivation?" + echo >&2 "Source path: ''${packageSources["$package"]}/''${packageRoots["$package"]}/pubspec.yaml" + exit 1 + fi + + languageConstraint="$(yq -r .environment.sdk "''${packageSources["$package"]}/''${packageRoots["$package"]}/pubspec.yaml")" + if [[ "$languageConstraint" =~ ^[[:space:]]*(\^|>=|>|)[[:space:]]*([[:digit:]]+\.[[:digit:]]+)\.[[:digit:]]+.*$ ]]; then + languageVersionJson="\"''${BASH_REMATCH[2]}\"" + elif [ "$languageConstraint" = 'any' ]; then + languageVersionJson='null' + else + # https://github.com/dart-lang/pub/blob/68dc2f547d0a264955c1fa551fa0a0e158046494/lib/src/language_version.dart#L106C35-L106C35 + languageVersionJson='"2.7"' + fi + + jq --null-input \ + --arg name "$package" \ + --arg path "''${packageSources["$package"]}/''${packageRoots["$package"]}" \ + --argjson languageVersion "$languageVersionJson" \ + '{ + name: $name, + rootUri: "file://\($path)", + packageUri: "lib/", + languageVersion: $languageVersion, + }' + done | jq > "$out" --slurp '{ configVersion: 2, generator: "nixpkgs", packages: ., - }' <(for package in "''${!packages[@]}"; do - languageConstraint="$(yq -r .environment.sdk "''${packages["$package"]}/pubspec.yaml")" - if [[ "$languageConstraint" =~ ^[[:space:]]*(\^|>=|>|)[[:space:]]*([[:digit:]]+\.[[:digit:]]+)\.[[:digit:]]+.*$ ]]; then - languageVersionJson="\"''${BASH_REMATCH[2]}\"" - elif [ "$languageConstraint" = 'any' ]; then - languageVersionJson='null' - else - # https://github.com/dart-lang/pub/blob/68dc2f547d0a264955c1fa551fa0a0e158046494/lib/src/language_version.dart#L106C35-L106C35 - languageVersionJson='"2.7"' - fi - - jq --null-input \ - --arg name "$package" \ - --arg path "''${packages["$package"]}" \ - --argjson languageVersion "$languageVersionJson" \ - '{ - name: $name, - rootUri: "file://\($path)", - packageUri: "lib/", - languageVersion: $languageVersion, - }' - done) + }' '' diff --git a/pkgs/build-support/dart/pub2nix/pubspec-lock.nix b/pkgs/build-support/dart/pub2nix/pubspec-lock.nix index 07ca54461f5b..78d35fd27134 100644 --- a/pkgs/build-support/dart/pub2nix/pubspec-lock.nix +++ b/pkgs/build-support/dart/pub2nix/pubspec-lock.nix @@ -47,40 +47,29 @@ let sha256 = details.description.sha256; }; in - runCommand "pub-${name}-${details.version}" - { } '' + runCommand "pub-${name}-${details.version}" { passthru.packageRoot = "."; } '' mkdir -p "$out" tar xf '${archive}' -C "$out" ''; - mkGitDependencySource = name: details: fetchgit { + mkGitDependencySource = name: details: (fetchgit { name = "pub-${name}-${details.version}"; url = details.description.url; rev = details.description.resolved-ref; - postFetch = '' - if [ "$(realpath "$out/${details.description.path}")" != "$(realpath "$out")" ]; then - (shopt -s dotglob; mv "$out"/* .) - rmdir "$out" - mv '${details.description.path}' "$out" - fi - ''; hash = gitHashes.${name} or (throw "A Git hash is required for ${name}! Set to an empty string to obtain it."); - }; + }).overrideAttrs ({ passthru ? { }, ... }: { + passthru = passthru // { + packageRoot = details.description.path; + }; + }); mkPathDependencySource = name: details: - if builtins.isPath src - then - # When src is a path, avoid copying it to the store entirely, and allow - # non-relative paths. - (builtins.path { - name = "pub-${name}-${details.version}"; - path = if details.description.relative then src + "/${packageRoot}" + "/${details.description.path}" else details.description.path; - }) - else - assert lib.assertMsg details.description.relative "Only relative paths are supported!"; - runCommand "pub-${name}-${details.version}" { } '' - cp -r '${src}/${packageRoot}/${details.description.path}' "$out" - ''; + assert lib.assertMsg details.description.relative "Only relative paths are supported - ${name} has an absolue path!"; + (if lib.isDerivation src then src else (runCommand "pub-${name}-${details.version}" { } ''cp -r '${src}' "$out"'')).overrideAttrs ({ passthru ? { }, ... }: { + passthru = passthru // { + packageRoot = "${packageRoot}/${details.description.path}"; + }; + }); mkSdkDependencySource = name: details: (sdkSourceBuilders.${details.description} or (throw "No SDK source builder has been given for ${details.description}!")) name; diff --git a/pkgs/build-support/flutter/default.nix b/pkgs/build-support/flutter/default.nix index dcf14438cb64..924491b65c77 100644 --- a/pkgs/build-support/flutter/default.nix +++ b/pkgs/build-support/flutter/default.nix @@ -53,7 +53,7 @@ sdkSourceBuilders = { # https://github.com/dart-lang/pub/blob/68dc2f547d0a264955c1fa551fa0a0e158046494/lib/src/sdk/flutter.dart#L81 - "flutter" = name: runCommand "flutter-sdk-${name}" { } '' + "flutter" = name: runCommand "flutter-sdk-${name}" { passthru.packageRoot = "."; } '' for path in '${flutter}/packages/${name}' '${flutter}/bin/cache/pkg/${name}'; do if [ -d "$path" ]; then ln -s "$path" "$out" diff --git a/pkgs/desktops/expidus/file-manager/default.nix b/pkgs/desktops/expidus/file-manager/default.nix index 8c71d66656b8..9e795acb7458 100644 --- a/pkgs/desktops/expidus/file-manager/default.nix +++ b/pkgs/desktops/expidus/file-manager/default.nix @@ -18,8 +18,8 @@ flutter.buildFlutterApplication rec { depsListFile = ./deps.json; gitHashes = { - libtokyo = "sha256-NC0EvLCLl0uMoLDlzoPwbJ0V3otkPWPFU1mgUBkOfsI="; - libtokyo_flutter = "sha256-ltpDYcKQx5ZKup4zJSrrYClgHxtMPkUNBszLsmgAI3g="; + libtokyo = "sha256-T0+vyfSfijLv7MvM+zt3bkVpb3aVrlDnse2xyNMp9GU="; + libtokyo_flutter = "sha256-T0+vyfSfijLv7MvM+zt3bkVpb3aVrlDnse2xyNMp9GU="; }; postInstall = ''