diff options
author | Sandro <sandro.jaeckel@gmail.com> | 2023-05-12 16:04:20 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-05-12 16:04:20 +0200 |
commit | 1f4ba7987762d1248fa80a6be6b74ca6915bb14f (patch) | |
tree | 08a78bd3738ead0cbae87bc31764fa958f84b16f | |
parent | 9eff6f4469faca0e6114435ea134d7bc4be88eca (diff) | |
parent | d347b0400c3ee88747e104f098d1960ece55117a (diff) |
Merge pull request #229851 from raphaelr/mknugetsource-without-nuget
-rw-r--r-- | pkgs/build-support/dotnet/make-nuget-source/default.nix | 18 | ||||
-rw-r--r-- | pkgs/build-support/dotnet/make-nuget-source/extract-licenses-from-nupkgs.py | 30 |
2 files changed, 39 insertions, 9 deletions
diff --git a/pkgs/build-support/dotnet/make-nuget-source/default.nix b/pkgs/build-support/dotnet/make-nuget-source/default.nix index ea1c5328082d5..6bda65f18d58b 100644 --- a/pkgs/build-support/dotnet/make-nuget-source/default.nix +++ b/pkgs/build-support/dotnet/make-nuget-source/default.nix @@ -1,4 +1,4 @@ -{ dotnetPackages, lib, xml2, stdenvNoCC }: +{ lib, python3, stdenvNoCC }: { name , description ? "" @@ -10,21 +10,21 @@ let inherit name; meta.description = description; - nativeBuildInputs = [ dotnetPackages.Nuget xml2 ]; + nativeBuildInputs = [ python3 ]; buildCommand = '' - export HOME=$(mktemp -d) mkdir -p $out/{lib,share} - ${lib.concatMapStringsSep "\n" (dep: '' - nuget init "${dep}" "$out/lib" - '') deps} + ( + shopt -s nullglob + for nupkg in ${lib.concatMapStringsSep " " (dep: "\"${dep}\"/*.nupkg") deps}; do + cp --no-clobber "$nupkg" $out/lib + done + ) # Generates a list of all licenses' spdx ids, if available. # Note that this currently ignores any license provided in plain text (e.g. "LICENSE.txt") - find "$out/lib" -name "*.nuspec" -exec sh -c \ - "NUSPEC=\$(xml2 < {}) && echo "\$NUSPEC" | grep license/@type=expression | tr -s \ '\n' | grep "license=" | cut -d'=' -f2" \ - \; | sort -u > $out/share/licenses + python ${./extract-licenses-from-nupkgs.py} $out/lib > $out/share/licenses ''; } // { # We need data from `$out` for `meta`, so we have to use overrides as to not hit infinite recursion. meta.licence = let diff --git a/pkgs/build-support/dotnet/make-nuget-source/extract-licenses-from-nupkgs.py b/pkgs/build-support/dotnet/make-nuget-source/extract-licenses-from-nupkgs.py new file mode 100644 index 0000000000000..22564b0bb2bc8 --- /dev/null +++ b/pkgs/build-support/dotnet/make-nuget-source/extract-licenses-from-nupkgs.py @@ -0,0 +1,30 @@ +#!/usr/bin/env python3 +""" +Opens each .nupkg file in a directory, and extracts the SPDX license identifiers +from them if they exist. The SPDX license identifier is stored in the +'<license type="expression">...</license>' tag in the .nuspec file. +All found license identifiers will be printed to stdout. +""" + +from glob import glob +from pathlib import Path +import sys +import xml.etree.ElementTree as ET +import zipfile + +all_licenses = set() + +if len(sys.argv) < 2: + print(f"Usage: {sys.argv[0]} DIRECTORY") + sys.exit(1) + +nupkg_dir = Path(sys.argv[1]) +for nupkg_name in glob("*.nupkg", root_dir=nupkg_dir): + with zipfile.ZipFile(nupkg_dir / nupkg_name) as nupkg: + for nuspec_name in [name for name in nupkg.namelist() if name.endswith(".nuspec")]: + with nupkg.open(nuspec_name) as nuspec_stream: + nuspec = ET.parse(nuspec_stream) + licenses = nuspec.findall(".//{*}license[@type='expression']") + all_licenses.update([license.text for license in licenses]) + +print("\n".join(sorted(all_licenses))) |