Skip to content

Commit

Permalink
Merge pull request #291 from unoplatform/dev/ds/appxmanifest-copy
Browse files Browse the repository at this point in the history
Ensure that we can overwrite existing files.
  • Loading branch information
dansiegel authored Jun 10, 2024
2 parents c498458 + a81ea88 commit f66b9b8
Show file tree
Hide file tree
Showing 5 changed files with 172 additions and 12 deletions.
6 changes: 6 additions & 0 deletions src/Resizetizer/src/FileHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,12 @@ public static void WriteFileIfChanged(string fileName, TaskLoggingHelper log, Ac
if (!File.Exists(fileName)
|| !File.ReadAllText(fileName).Equals(File.ReadAllText(tempFile)))
{
if (File.Exists(fileName))
{
log.LogMessage(MessageImportance.Low, $"Updating file: {fileName}");
File.Delete(fileName);
}

File.Move(tempFile, fileName);
}
else
Expand Down
17 changes: 16 additions & 1 deletion src/Resizetizer/src/GeneratePackageAppxManifest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -516,13 +516,28 @@ private static void SetDependencyTargetDeviceFamily(XDocument appx, string targe

private static void SetVersion(XElement target, XName attributeName, string version)
{
var attr = target.Attribute(attributeName);
var attr = target.Attributes().FirstOrDefault(x => IsVersionAttribute(x, attributeName));
if (attr is null || string.IsNullOrEmpty(attr.Value) || attr.Value == PackageVersionPlaceholder)
{
target.SetAttributeValue(attributeName, version);
}
}

static bool IsVersionAttribute(XAttribute attribute, XName attributeName)
{
var currentAttributeName = attribute.Name.LocalName;
var expectedAttributeName = attributeName.LocalName;

var currentAttributeNamespace = attribute.Name.Namespace.NamespaceName;
var expectedAttributeNamespace = attributeName.NamespaceName;

// The Version may not have a current Namespace and should use the default namespace
if (string.IsNullOrEmpty(currentAttributeNamespace))
return currentAttributeName == expectedAttributeName;

return currentAttributeName == expectedAttributeName && currentAttributeNamespace == expectedAttributeNamespace;
}

public static bool TryMergeVersionNumbers(string? displayVersion, string? version, out string? finalVersion)
{
displayVersion = displayVersion?.Trim();
Expand Down
90 changes: 79 additions & 11 deletions src/Resizetizer/test/UnitTests/GeneratePackageAppxManifestTests.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
#nullable enable
#nullable enable
using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;
using System;
Expand All @@ -20,6 +20,7 @@ protected GeneratePackageAppxManifest_v0 GetNewTask(
string? version = null,
string? displayName = null,
string? description = null,
string? applicationPublisher = null,
ITaskItem? appIcon = null,
ITaskItem? splashScreen = null)
{
Expand All @@ -35,6 +36,7 @@ protected GeneratePackageAppxManifest_v0 GetNewTask(
ApplicationTitle = displayName,
AssemblyName = GetType().Assembly.FullName,
Description = description,
ApplicationPublisher = applicationPublisher,
AppIcon = appIcon == null ? null : new[] { appIcon },
SplashScreen = splashScreen == null ? null : new[] { splashScreen },
TargetFramework = "windows"
Expand All @@ -49,8 +51,11 @@ protected GeneratePackageAppxManifest_v0 GetNewTask(
string? version = null,
string? displayName = null,
string? description = null,
string? applicationPublisher = null,
ITaskItem? appIcon = null,
ITaskItem? splashScreen = null)
ITaskItem? splashScreen = null,
string? targetPlatformVersion = null,
string? targetPlatformMinVersion = null)
{
return new()
{
Expand All @@ -61,12 +66,15 @@ protected GeneratePackageAppxManifest_v0 GetNewTask(
ApplicationId = applicationId,
ApplicationDisplayVersion = displayVersion,
ApplicationVersion = version,
ApplicationTitle = displayName,
Description = description,
AssemblyName = GetType().Assembly.FullName,
AppIcon = appIcon == null ? null : new[] { appIcon },
ApplicationTitle = displayName,
Description = description,
ApplicationPublisher = applicationPublisher,
AssemblyName = GetType().Assembly.GetName().Name,
AppIcon = appIcon == null ? null : new[] { appIcon },
SplashScreen = splashScreen == null ? null : new[] { splashScreen },
TargetFramework = "windows"
TargetFramework = "windows",
TargetPlatformVersion = targetPlatformVersion,
TargetPlatformMinVersion = targetPlatformMinVersion
};
}

Expand Down Expand Up @@ -95,8 +103,8 @@ public void ManifestTakesPriority()
splashScreen.SetMetadata("Color", "#FFFFFF");

var inputFilename = $"testdata/appxmanifest/typical.appxmanifest";
var task = GetNewTask(inputFilename,
applicationId: "com.contoso.myapp",
var task = GetNewTask(inputFilename,
applicationId: "com.contoso.myapp",
displayVersion: "2.5",
version: "3",
displayName: "Fishy Things",
Expand Down Expand Up @@ -133,8 +141,8 @@ public void CorrectGenerationWhenUserSpecifyBackgroundColor()
appIcon.SetMetadata("Color", "#FFFFFF");

var inputFilename = $"testdata/appxmanifest/{input}.appxmanifest";
var task = GetNewTask(inputFilename,
applicationId: "com.contoso.myapp",
var task = GetNewTask(inputFilename,
applicationId: "com.contoso.myapp",
displayVersion: "1.0.0",
version: "1",
displayName: "Sample App",
Expand Down Expand Up @@ -229,5 +237,65 @@ public void TaskShouldFileAWarningIfMoreThanOneManifestIsProvided()
// Assert
Assert.True(LogWarningEvents.Count > 0, "Warnings should be greater than zero");
}

[Fact]
public void TaskShouldNotDuplicateTargetVersions()
{
// Arrange
var taskItem = new TaskItem("testdata/appxmanifest/duplicate-versions.input.appxmanifest");
var task = GetNewTask(
appxManifests: [taskItem],
targetPlatformVersion: "10.0.19041.0",
targetPlatformMinVersion: "10.0.17763.0");

// Act
task.Execute();

// Assert
AssertExpectedManifest(task.GeneratedAppxManifest.ItemSpec, taskItem.ItemSpec);
}

[Fact]
public void TaskShouldBeAbleToOverwriteAppxManifest()
{
// Arrange
var taskItem = new TaskItem("testdata/appxmanifest/empty.appxmanifest");
var task = GetNewTask(
appxManifests: [taskItem],
displayVersion: "1.0.0",
version: "1",
targetPlatformVersion: "10.0.19041.0",
targetPlatformMinVersion: "10.0.17763.0");

// Act
task.Execute();

// Assert
var generatedPath = task.GeneratedAppxManifest.ItemSpec;
var initial = XDocument.Load(generatedPath).ToString();
Assert.True(File.Exists(generatedPath));

// Act
for (var i = 2; i < 5; i++)
{
task.ApplicationVersion = $"{i}";
task.Execute();

// Assert
Assert.Equal(generatedPath, task.GeneratedAppxManifest.ItemSpec);
Assert.True(File.Exists(task.GeneratedAppxManifest.ItemSpec));
var updated = XDocument.Load(generatedPath).ToString();

Assert.NotEqual(initial, updated);
}
}

static void AssertExpectedManifest(string generatedManifestPath, string inputManifestPath)
{
var generated = XDocument.Load(generatedManifestPath).ToString();
var expected = XDocument.Load(inputManifestPath.Replace(".input.", ".expected.")).ToString();

Assert.Equal(expected, generated);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
<?xml version="1.0" encoding="utf-8"?>
<Package xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10" xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10" xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities" IgnorableNamespaces="uap rescap">
<Identity Name="Uno.Themes.WinUI.Samples" Publisher="O=Uno.Themes.WinUI.Samples" Version="1.0.0.0" />
<Properties>
<DisplayName>Uno.Themes.WinUI.Samples</DisplayName>
<PublisherDisplayName>Uno.Themes.WinUI.Samples</PublisherDisplayName>
</Properties>
<Dependencies>
<TargetDeviceFamily Name="Windows.Universal" MinVersion="10.0.17763.0" MaxVersionTested="10.0.19041.0" />
<TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.17763.0" MaxVersionTested="10.0.19041.0" />
</Dependencies>
<Resources>
<Resource Language="x-generate" />
</Resources>
<Applications>
<Application Id="App" Executable="$targetnametoken$.exe" EntryPoint="$targetentrypoint$">
<uap:VisualElements DisplayName="Uno.Themes.WinUI.Samples" Description="Uno.Themes.WinUI.Samples">
<uap:SplashScreen />
<uap:DefaultTile ShortName="Uno.Resizetizer.UnitTests">
<uap:ShowNameOnTiles />
</uap:DefaultTile>
</uap:VisualElements>
</Application>
</Applications>
<Capabilities>
<rescap:Capability Name="runFullTrust" />
</Capabilities>
</Package>
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
<?xml version="1.0" encoding="utf-8"?>

<Package
xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10"
xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
IgnorableNamespaces="uap rescap">

<Identity
Name="Uno.Themes.WinUI.Samples"
Publisher="O=Uno.Themes.WinUI.Samples"
Version="1.0.0.0" />

<Properties>
<DisplayName>Uno.Themes.WinUI.Samples</DisplayName>
<PublisherDisplayName>Uno.Themes.WinUI.Samples</PublisherDisplayName>
</Properties>

<Dependencies>
<TargetDeviceFamily Name="Windows.Universal" MinVersion="10.0.17763.0" MaxVersionTested="10.0.19041.0" />
<TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.17763.0" MaxVersionTested="10.0.19041.0" />
</Dependencies>

<Resources>
<Resource Language="x-generate"/>
</Resources>

<Applications>
<Application Id="App"
Executable="$targetnametoken$.exe"
EntryPoint="$targetentrypoint$">
<uap:VisualElements
DisplayName="Uno.Themes.WinUI.Samples"
Description="Uno.Themes.WinUI.Samples">
<uap:SplashScreen />
</uap:VisualElements>
</Application>
</Applications>

<Capabilities>
<rescap:Capability Name="runFullTrust" />
</Capabilities>
</Package>

0 comments on commit f66b9b8

Please sign in to comment.