|
| 1 | +name: bughunt nuget probe |
| 2 | +on: |
| 3 | + push: |
| 4 | + branches: ['bughunt/nuget/**'] |
| 5 | +permissions: |
| 6 | + contents: read |
| 7 | +jobs: |
| 8 | + probe: |
| 9 | + runs-on: ${{ matrix.os }} |
| 10 | + timeout-minutes: 45 |
| 11 | + strategy: |
| 12 | + fail-fast: false |
| 13 | + matrix: |
| 14 | + include: |
| 15 | + - {os: ubuntu-latest, dotnet: '6'} |
| 16 | + - {os: ubuntu-latest, dotnet: '7'} |
| 17 | + - {os: ubuntu-latest, dotnet: '8'} |
| 18 | + - {os: ubuntu-latest, dotnet: '9'} |
| 19 | + - {os: ubuntu-latest, dotnet: '10'} |
| 20 | + - {os: macos-latest, dotnet: '8'} |
| 21 | + - {os: macos-latest, dotnet: '9'} |
| 22 | + - {os: windows-latest, dotnet: '8'} |
| 23 | + - {os: windows-latest, dotnet: '9'} |
| 24 | + steps: |
| 25 | + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 |
| 26 | + with: |
| 27 | + persist-credentials: false |
| 28 | + - run: rustup show |
| 29 | + - uses: actions/setup-dotnet@a98b56852c35b8e3190ac28c8c2271da59106c68 # v6.0.0 |
| 30 | + with: |
| 31 | + dotnet-version: ${{ matrix.dotnet }}.0.x |
| 32 | + - run: cargo build --release -p socket-patch-cli |
| 33 | + - name: probe |
| 34 | + shell: bash |
| 35 | + env: |
| 36 | + M: ${{ matrix.dotnet }} |
| 37 | + DOTNET_CLI_TELEMETRY_OPTOUT: '1' |
| 38 | + DOTNET_NOLOGO: '1' |
| 39 | + SOCKET_OFFLINE: '1' |
| 40 | + run: | |
| 41 | + set -u |
| 42 | + SP="$GITHUB_WORKSPACE/target/release/socket-patch" |
| 43 | + W="$RUNNER_TEMP/bh"; rm -rf "$W"; mkdir -p "$W"; cd "$W" |
| 44 | + wp(){ if command -v cygpath >/dev/null; then cygpath -w "$1"; else echo "$1"; fi; } |
| 45 | + SDKV=$(dotnet --list-sdks | awk '{print $1}' | grep "^$M\." | sort -V | tail -1) |
| 46 | + echo "{\"sdk\":{\"version\":\"$SDKV\",\"rollForward\":\"latestFeature\"}}" > global.json |
| 47 | + dotnet --version |
| 48 | + blob(){ local l; l=$(wc -c < "$1" | tr -d ' '); { printf 'blob %s\0' "$l"; cat "$1"; } | sha256sum | cut -d' ' -f1; } |
| 49 | + stage(){ local o="$1" p="$2" u="$3" bh ah; bh=$(blob "$o"); ah=$(blob "$p") |
| 50 | + mkdir -p .socket/blobs; cp "$p" ".socket/blobs/$ah" |
| 51 | + printf '{"patches":{"pkg:nuget/Newtonsoft.Json@13.0.3":{"uuid":"%s","exportedAt":"2026-01-01T00:00:00Z","files":{"LICENSE.md":{"beforeHash":"%s","afterHash":"%s"}},"vulnerabilities":{},"description":"m","license":"MIT","tier":"free"}}}' "$u" "$bh" "$ah" > .socket/manifest.json; } |
| 52 | + mkproj(){ mkdir -p "$1"; printf '<Project Sdk="Microsoft.NET.Sdk"><PropertyGroup><OutputType>Exe</OutputType><TargetFramework>net%s.0</TargetFramework><RestorePackagesWithLockFile>%s</RestorePackagesWithLockFile><NuGetAudit>false</NuGetAudit></PropertyGroup><ItemGroup><PackageReference Include="Newtonsoft.Json" Version="13.0.3" /></ItemGroup></Project>' "$M" "$2" > "$1/app.csproj"; echo 'System.Console.WriteLine("ok");' > "$1/Program.cs"; } |
| 53 | + lic(){ echo "$1/newtonsoft.json/13.0.3/LICENSE.md"; } |
| 54 | + res(){ echo "RESULT[$M/$RUNNER_OS] $*"; } |
| 55 | + # ---- A: warm cache, no lockfile |
| 56 | + mkproj A false; cd A; export NUGET_PACKAGES="$(wp "$W/cacheA")" |
| 57 | + dotnet restore > r.log 2>&1 || { cat r.log; res "A setup restore failed"; } |
| 58 | + cp "$(lic "$W/cacheA")" pristine.md; cp pristine.md patched.md; printf '\nSOCKET-MARKER\n' >> patched.md |
| 59 | + stage pristine.md patched.md 11111111-1111-4111-8111-111111111111 |
| 60 | + "$SP" vendor --json --offline > v.json 2>&1; grep -E '"status"|errorCode' v.json |
| 61 | + rm -rf obj bin; dotnet restore --force > r2.log 2>&1; echo "restore rc=$?" |
| 62 | + grep -q SOCKET-MARKER "$(lic "$W/cacheA")" && res "A warm-nolock: PATCHED" || res "A warm-nolock: UNPATCHED (bug)" |
| 63 | + export NUGET_PACKAGES="$(wp "$W/coldA")"; rm -rf obj; dotnet restore > r3.log 2>&1 |
| 64 | + grep -q SOCKET-MARKER "$(lic "$W/coldA")" && res "A cold-nolock control: PATCHED" || { cat r3.log; res "A cold control: UNPATCHED"; } |
| 65 | + cd "$W" |
| 66 | + # ---- B: warm cache, lockfile, --locked-mode |
| 67 | + mkproj B true; cd B; export NUGET_PACKAGES="$(wp "$W/cacheB")" |
| 68 | + dotnet restore > r.log 2>&1 || cat r.log |
| 69 | + cp "$(lic "$W/cacheB")" pristine.md; cp pristine.md patched.md; printf '\nSOCKET-MARKER\n' >> patched.md |
| 70 | + stage pristine.md patched.md 22222222-2222-4222-8222-222222222222 |
| 71 | + "$SP" vendor --json --offline > v.json 2>&1; grep -E '"status"|errorCode' v.json |
| 72 | + rm -rf obj; dotnet restore --locked-mode > r2.log 2>&1; rc=$? |
| 73 | + grep -q NU1403 r2.log && res "B warm-locked: NU1403 (bug) rc=$rc" || res "B warm-locked: rc=$rc no NU1403" |
| 74 | + cd "$W" |
| 75 | + # ---- C: solution layout, lock in src/App |
| 76 | + mkdir C; mkproj C/src/App true; cd C; cp ../global.json .; export NUGET_PACKAGES="$(wp "$W/cacheC")" |
| 77 | + dotnet new sln -n App > /dev/null; SLN=$(ls App.sln* | head -1); dotnet sln "$SLN" add src/App/app.csproj > /dev/null; dotnet new nugetconfig > /dev/null |
| 78 | + dotnet restore > r.log 2>&1 || cat r.log |
| 79 | + cp "$(lic "$W/cacheC")" "$W/pC.md"; cp "$W/pC.md" "$W/qC.md"; printf '\nSOCKET-MARKER\n' >> "$W/qC.md" |
| 80 | + stage "$W/pC.md" "$W/qC.md" 33333333-3333-4333-8333-333333333333 |
| 81 | + cp src/App/packages.lock.json "$W/lockC.before" |
| 82 | + "$SP" vendor --json --offline > "$W/vC.json" 2>&1; grep -E '"status"|errorCode' "$W/vC.json" |
| 83 | + cmp -s "$W/lockC.before" src/App/packages.lock.json && res "C member lock UNCHANGED (bug)" || res "C member lock repinned" |
| 84 | + mkdir -p "$W/Cco/src/App"; cp -r "$SLN" nuget.config global.json .socket "$W/Cco/"; cp src/App/app.csproj src/App/Program.cs src/App/packages.lock.json "$W/Cco/src/App/" |
| 85 | + cd "$W/Cco"; export NUGET_PACKAGES="$(wp "$W/coldC")"; dotnet restore --locked-mode > r.log 2>&1; rc=$? |
| 86 | + grep -q NU1403 r.log && res "C fresh cold locked restore: NU1403 (bug) rc=$rc" || res "C fresh cold locked restore rc=$rc" |
| 87 | + echo "==== summary"; true |
0 commit comments