From d8447056cff5b969313c174e1db674853f9d3645 Mon Sep 17 00:00:00 2001 From: Jonathan Peppers Date: Thu, 23 Jul 2026 08:30:34 -0500 Subject: [PATCH 1/2] Fix interactive 7-Zip extraction hang Pass the documented -y switch so archive extraction cannot block waiting for overwrite confirmation, add regression coverage, and bump Xamarin.Build.Download to 0.11.5. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 1d70ed1d-13b0-4ed9-b242-49fec179fa0f --- .../Xamarin.Build.Download.Tests/Test.cs | 20 +++++++++++++++++++ .../Xamarin.Build.Download.csproj | 2 +- .../XamarinDownloadArchives.cs | 3 +++ 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/util/Xamarin.Build.Download/source/Xamarin.Build.Download.Tests/Test.cs b/util/Xamarin.Build.Download/source/Xamarin.Build.Download.Tests/Test.cs index b144c56ef..7b6fb00bf 100644 --- a/util/Xamarin.Build.Download/source/Xamarin.Build.Download.Tests/Test.cs +++ b/util/Xamarin.Build.Download/source/Xamarin.Build.Download.Tests/Test.cs @@ -5,6 +5,7 @@ using System.IO; using System.IO.Compression; using System.Linq; +using System.Reflection; using System.Xml; using System.Xml.Linq; using Microsoft.Build.Construction; @@ -157,6 +158,25 @@ public void TestTgzDownload () Assert.True (File.Exists (Path.Combine (unpackDir, "GoogleSymbolUtilities-1.0.3", "Libraries", "libGSDK_Overload.a"))); } + [Fact] + public void Test7ZipExtractionIsNonInteractive () + { + var method = typeof (Xamarin.Build.Download.XamarinDownloadArchives).GetMethod ( + "Build7ZipExtractionArgs", + BindingFlags.NonPublic | BindingFlags.Static); + var sevenZipPath = Path.GetTempFileName (); + + var args = method.Invoke (null, new object [] { + "archive.tgz", + TempDir, + sevenZipPath, + false, + null, + }); + + Assert.Contains ("-y", args.ToString ()); + } + [Fact] public void TestUncompressedNamedDownload () { diff --git a/util/Xamarin.Build.Download/source/Xamarin.Build.Download/Xamarin.Build.Download.csproj b/util/Xamarin.Build.Download/source/Xamarin.Build.Download/Xamarin.Build.Download.csproj index 5b959c40c..30d91c6e2 100644 --- a/util/Xamarin.Build.Download/source/Xamarin.Build.Download/Xamarin.Build.Download.csproj +++ b/util/Xamarin.Build.Download/source/Xamarin.Build.Download/Xamarin.Build.Download.csproj @@ -9,7 +9,7 @@ Xamarin.Build.Download Xamarin Build-time Download Support - 0.11.4 + 0.11.5 Microsoft Microsoft https://go.microsoft.com/fwlink/?linkid=865061 diff --git a/util/Xamarin.Build.Download/source/Xamarin.Build.Download/XamarinDownloadArchives.cs b/util/Xamarin.Build.Download/source/Xamarin.Build.Download/XamarinDownloadArchives.cs index 9a00a0b51..5ff2b8dc7 100644 --- a/util/Xamarin.Build.Download/source/Xamarin.Build.Download/XamarinDownloadArchives.cs +++ b/util/Xamarin.Build.Download/source/Xamarin.Build.Download/XamarinDownloadArchives.cs @@ -319,6 +319,9 @@ static ProcessArgumentBuilder Build7ZipExtractionArgs (string file, string conte if (ignoreTarSymLinks) args.Add ("-snl-"); + // Never let 7-Zip wait for input from a non-interactive MSBuild task. + // https://7-zip.opensource.jp/chm/cmdline/switches/yes.htm + args.Add ("-y"); args.AddQuoted ("-o" + contentDir); args.AddQuoted (file); return args; From 37a2f1ea75f5dd62e852c4dd6d8d18bb38b62ff2 Mon Sep 17 00:00:00 2001 From: Jonathan Peppers Date: Thu, 23 Jul 2026 08:45:32 -0500 Subject: [PATCH 2/2] Improve 7-Zip argument test diagnostics Keep the dummy executable in the per-test temporary directory and report a clear failure if the reflected helper cannot be found. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 1d70ed1d-13b0-4ed9-b242-49fec179fa0f --- .../source/Xamarin.Build.Download.Tests/Test.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/util/Xamarin.Build.Download/source/Xamarin.Build.Download.Tests/Test.cs b/util/Xamarin.Build.Download/source/Xamarin.Build.Download.Tests/Test.cs index 7b6fb00bf..a5a9caa91 100644 --- a/util/Xamarin.Build.Download/source/Xamarin.Build.Download.Tests/Test.cs +++ b/util/Xamarin.Build.Download/source/Xamarin.Build.Download.Tests/Test.cs @@ -164,7 +164,9 @@ public void Test7ZipExtractionIsNonInteractive () var method = typeof (Xamarin.Build.Download.XamarinDownloadArchives).GetMethod ( "Build7ZipExtractionArgs", BindingFlags.NonPublic | BindingFlags.Static); - var sevenZipPath = Path.GetTempFileName (); + Assert.True (method != null, "Could not find XamarinDownloadArchives.Build7ZipExtractionArgs via reflection."); + var sevenZipPath = Path.Combine (TempDir, "7z.exe"); + File.WriteAllText (sevenZipPath, string.Empty); var args = method.Invoke (null, new object [] { "archive.tgz",