Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[msbuild] Use our own Unzip task instead of Ditto when extracting compressed plugins. #18015

Merged
merged 4 commits into from Apr 13, 2023
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
30 changes: 13 additions & 17 deletions dotnet/targets/Xamarin.Shared.Sdk.targets
Expand Up @@ -1623,15 +1623,20 @@
Outputs="@(_CompressedPlugIns -> '$(_IntermediateDecompressionDir)%(Filename)%(Extension).stamp')"
>

<Ditto
<ItemGroup>
<_CompressedPlugIns Update="@(_CompressedPlugIns)">
<ExtractionPath>$([MSBuild]::EnsureTrailingSlash('$(_IntermediateDecompressionDir)%(_CompressedPlugIns.Filename)%(_CompressedPlugIns.Extension)'))</ExtractionPath>
</_CompressedPlugIns>
</ItemGroup>

<Unzip
SessionId="$(BuildSessionId)"
Condition="'$(IsMacEnabled)' == 'true'"
AdditionalArguments="-x -k"
CopyFromWindows="true"
Source="%(_CompressedPlugIns.Identity)"
Destination="$(_IntermediateDecompressionDir)%(Filename)%(Extension)"
ZipFilePath="%(_CompressedPlugIns.Identity)"
ExtractionPath="%(_CompressedPlugIns.ExtractionPath)"
>
</Ditto>
<Output TaskParameter="TouchedFiles" ItemName="FileWrites" />
</Unzip>
</Target>

<Target Name="_CollectDecompressedPlugIns"
Expand All @@ -1640,24 +1645,15 @@

<ItemGroup>
<!-- Set TargetDirectory and SourceDirectory for all directories we have to publish -->
<_DecompressedPlugIns Include="@(_CompressedPlugIns -> '$(_IntermediateDecompressionDir)%(Filename)%(Extension)')" />
<_DecompressedPlugIns Include="@(_CompressedPlugIns -> '%(ExtractionPath)')" PublishFolderType="PlugIns" />
</ItemGroup>
<ItemGroup>
<_DecompressedPlugIns Update="@(_DecompressedPlugIns)">
<TargetDirectory>$(_RelativePublishDir)$(_RelativeAppBundlePath)$(_AppPlugInsRelativePath)</TargetDirectory>
<SourceDirectory>$(_IntermediateDecompressionDir)%(Filename)%(Extension)</SourceDirectory>
<SourceDirectory>%(ExtractionPath)</SourceDirectory>
</_DecompressedPlugIns>
</ItemGroup>

<Touch
SessionId="$(BuildSessionId)"
Condition="'$(IsMacEnabled)' == 'true'"
AlwaysCreate="true"
Files="@(_CompressedPlugIns -> '$(_IntermediateDecompressionDir)%(Filename)%(Extension).stamp')"
>
<Output TaskParameter="TouchedFiles" ItemName="FileWrites" />
</Touch>

<ItemGroup>
<_DirectoriesToPublish Include="@(_DecompressedPlugIns)" />
</ItemGroup>
Expand Down
69 changes: 69 additions & 0 deletions msbuild/Xamarin.MacDev.Tasks/Tasks/Unzip.cs
@@ -0,0 +1,69 @@
using System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.IO;
using System.IO.Compression;
using System.Linq;
using System.Reflection;

using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;

using Xamarin.Bundler;
using Xamarin.Localization.MSBuild;
using Xamarin.MacDev;
using Xamarin.Messaging.Build.Client;

#nullable enable

namespace Xamarin.MacDev.Tasks {
/// <summary>
/// This task will extract the specified zip file into the specified extraction path.
/// This task works on Windows too, but if the task encounters a symlink while extracting, an error will be shown.
/// </summary>
public class Unzip : XamarinTask, ITaskCallback {
[Required]
public string ZipFilePath { get; set; } = string.Empty;
rolfbjarne marked this conversation as resolved.
Show resolved Hide resolved

[Required]
public string ExtractionPath { get; set; } = string.Empty;

// The file or directory to extract from the zip file.
// If not specified, the entire zip file is extracted.
public string Resource { get; set; } = string.Empty;

[Output]
public ITaskItem [] TouchedFiles { get; set; } = Array.Empty<ITaskItem> ();

public override bool Execute ()
{
if (ShouldExecuteRemotely ())
return new TaskRunner (SessionId, BuildEngine4).RunAsync (this).Result;

return ExecuteLocally ();
}

public void Cancel ()
{
if (ShouldExecuteRemotely ())
BuildConnection.CancelAsync (BuildEngine4).Wait ();
}

public bool ShouldCopyToBuildServer (ITaskItem item) => true;

public bool ShouldCreateOutputFile (ITaskItem item) => true;

public IEnumerable<ITaskItem> GetAdditionalItemsToBeCopied () => Enumerable.Empty<ITaskItem> ();

bool ExecuteLocally ()
{
var createdFiles = new List<string> ();
if (!CompressionHelper.TryDecompress (Log, ZipFilePath, Resource, ExtractionPath, createdFiles, out var _))
return false;

TouchedFiles = createdFiles.Select (v => new TaskItem (v)).ToArray ();

return !Log.HasLoggedErrors;
}
}
}
1 change: 1 addition & 0 deletions msbuild/Xamarin.Shared/Xamarin.Shared.targets
Expand Up @@ -111,6 +111,7 @@ Copyright (C) 2018 Microsoft. All rights reserved.
<UsingTask TaskName="Xamarin.MacDev.Tasks.SymbolStrip" AssemblyFile="$(_TaskAssemblyName)" />
<UsingTask TaskName="Xamarin.MacDev.Tasks.TextureAtlas" AssemblyFile="$(_TaskAssemblyName)" />
<UsingTask TaskName="Xamarin.MacDev.Tasks.UnpackLibraryResources" AssemblyFile="$(_TaskAssemblyName)" />
<UsingTask TaskName="Xamarin.MacDev.Tasks.Unzip" AssemblyFile="$(_TaskAssemblyName)" />
<UsingTask TaskName="Xamarin.MacDev.Tasks.WriteAppManifest" AssemblyFile="$(_TaskAssemblyName)" />
<UsingTask TaskName="Xamarin.MacDev.Tasks.WriteItemsToFile" AssemblyFile="$(_TaskAssemblyName)" />
<UsingTask TaskName="Xamarin.MacDev.Tasks.Zip" AssemblyFile="$(_TaskAssemblyName)" />
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

9 changes: 0 additions & 9 deletions msbuild/Xamarin.iOS.Tasks.Windows/Properties/Resources.resx
Expand Up @@ -12,15 +12,6 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="Unzip_Error" xml:space="preserve">
<value>There was an error unzipping the file {0}: {1}</value>
</data>
<data name="Unzip_Unzipped" xml:space="preserve">
<value>Successfully unzipped the file {0}</value>
</data>
<data name="Unzip_Unzipping" xml:space="preserve">
<value>Unzipping {0}...</value>
</data>
<data name="CollectDynamicFrameworks_InvalidFramework" xml:space="preserve">
<value>Skipping invalid framework {0}. Reason: {1}</value>
<comment>0: framework name; 1: why the framework was skipped</comment>
Expand Down
40 changes: 0 additions & 40 deletions msbuild/Xamarin.iOS.Tasks.Windows/Tasks/Unzip.cs

This file was deleted.

Expand Up @@ -12,13 +12,13 @@ Copyright (C) 2011-2013 Xamarin. All rights reserved.
***********************************************************************************************
-->
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<UsingTask TaskName="Xamarin.MacDev.Tasks.Unzip" AssemblyFile="$(CoreiOSSdkDirectory)Xamarin.iOS.Tasks.dll" />
<UsingTask TaskName="Xamarin.MacDev.Tasks.WriteItemsToFile" AssemblyFile="$(CoreiOSSdkDirectory)Xamarin.iOS.Tasks.dll" />
<UsingTask TaskName="Xamarin.MacDev.Tasks.Zip" AssemblyFile="$(CoreiOSSdkDirectory)Xamarin.iOS.Tasks.dll" />
<UsingTask TaskName="Xamarin.iOS.Tasks.CopyArchiveFiles" AssemblyFile="$(CoreiOSSdkDirectory)Xamarin.iOS.Tasks.dll" />
<UsingTask TaskName="Xamarin.iOS.Tasks.ILLink" AssemblyFile="$(CoreiOSSdkDirectory)Xamarin.iOS.Tasks.dll" />
<UsingTask TaskName="Xamarin.iOS.Tasks.Windows.CreateArchiveDirectory" AssemblyFile="Xamarin.iOS.Tasks.Windows.dll" />
<UsingTask TaskName="Xamarin.iOS.Tasks.Windows.ResolveUniversalTypeIdentifiers" AssemblyFile="Xamarin.iOS.Tasks.Windows.dll" />
<UsingTask TaskName="Xamarin.iOS.Tasks.Windows.Unzip" AssemblyFile="Xamarin.iOS.Tasks.Windows.dll" />

<Import Project="$(MSBuildThisFileDirectory)Xamarin.Messaging.Build.targets" Condition="Exists('$(MSBuildThisFileDirectory)Xamarin.Messaging.Build.targets') And '$(MessagingBuildTargetsImported)' != 'true'" />
<Import Project="$(MSBuildThisFileDirectory)Xamarin.iOS.Windows.After.targets" Condition="Exists('$(MSBuildThisFileDirectory)Xamarin.iOS.Windows.After.targets')" />
Expand Down