summaryrefslogtreecommitdiffstats
path: root/pkgs/development/compilers/dotnet/nuget-package-hook.sh
blob: d409a49360ca03d2e7d08e19c64b806fef59011f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
# shellcheck shell=bash disable=SC2154

createNupkgMetadata() {
  # since sdk 11, contentHash is required to avoid:
  # NuGet.targets(198,5): error : Error parsing nupkg metadata file [...]/.nupkg.metadata : \
  # JSON deserialization for type 'NuGet.Packaging.NupkgMetadataFile' was missing required properties including: 'contentHash'.
  echo '{ "contentHash": "" }' > "$1"/.nupkg.metadata
}

unpackNupkg() {
    local -r nupkg="$1" unpacked="$2"
    local nuspec nuspec_l

    mkdir -p "$unpacked"
    @unzip@/bin/unzip -nqd "$unpacked" "$nupkg"
    cd "$unpacked"
    chmod -R +rw .
    nuspec=(*.nuspec)
    nuspec_l="${nuspec,,}"
    if [[ $nuspec != "$nuspec_l" ]]; then
        mv "$nuspec" "$nuspec".tmp
        mv "$nuspec".tmp "$nuspec_l"
    fi
    createNupkgMetadata .
    cd - >/dev/null
}

_unpackNugetPackagesInOutput() {
    local -r unpacked="$prefix"/share/nuget/packages/.unpacked
    local nuspec nuspec_l
    (
        shopt -s nullglob globstar
        for nupkg in "$prefix"/share/nuget/source/**/*.nupkg; do
            unpackNupkg "$nupkg" "$unpacked"
            @xmlstarlet@/bin/xmlstarlet \
                sel -t \
                -m /_:package/_:metadata \
                -v _:id -nl \
                -v _:version -nl \
                "$unpacked"/*.nuspec | (
                read id
                read version
                id=''${id,,}
                version=''${version,,}
                mkdir -p "$prefix"/share/nuget/packages/"$id"
                mv "$unpacked" "$prefix"/share/nuget/packages/"$id"/"$version"
            )
        done
        rm -rf "$prefix"/share/nuget/source
    )
}

unpackNugetPackages() {
    local output
    for output in $(getAllOutputNames); do
        prefix="${!output}" _unpackNugetPackagesInOutput
    done
}

if [[ -z ${dontUnpackNugetPackages-} ]]; then
    preFixupHooks+=(unpackNugetPackages)
fi

_createNugetSourceInOutput() {
    local package version id dir nupkg content
    local -a nuspec
    (
        shopt -s nullglob

        for package in "$prefix"/share/nuget/packages/*/*; do
            version=$(basename "$package")
            id=$(basename "$(dirname "$package")")
            dir="$prefix/share/nuget/source/$id/$version"
            nupkg=$dir/$id.$version.nupkg
            nuspec=("$package"/*.nuspec)

            if [[ -n ${createInstallableNugetSource-} ]]; then
                content=.
            else
                content=$(basename "${nuspec[0]}")
            fi

            mkdir -p "$dir"
            cp "${nuspec[0]}" "$dir/$id.nuspec"
            (cd "$package" && @zip@/bin/zip -rq0 "$nupkg" "$content")
            @stripNondeterminism@/bin/strip-nondeterminism --type zip "$nupkg"
            touch "$nupkg".sha512
        done
    )
}

createNugetSource() {
    local output
    for output in $(getAllOutputNames); do
        prefix="${!output}" _createNugetSourceInOutput
    done
}

if [[ -z ${dontCreateNugetSource-} ]]; then
    postFixupHooks+=(createNugetSource)
fi