Skip to content

Commit f764cae

Browse files
authored
Ensure stable order of files in the nuget package (#6963)
1 parent 0b47284 commit f764cae

2 files changed

Lines changed: 30 additions & 27 deletions

File tree

src/NuGet.Core/NuGet.Packaging/PackageCreation/Authoring/PackageBuilder.cs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1052,7 +1052,7 @@ private SortedSet<string> WriteFiles(ZipArchive package, SortedSet<string> files
10521052
var warningMessage = new StringBuilder();
10531053

10541054
// Add files that might not come from expanding files on disk
1055-
foreach (IPackageFile file in new HashSet<IPackageFile>(Files))
1055+
foreach (IPackageFile file in new SortedSet<IPackageFile>(Files, new NormalizedPathComparer()))
10561056
{
10571057
using (Stream stream = file.GetStream())
10581058
{
@@ -1378,5 +1378,15 @@ private string GenerateRelationshipId(string path)
13781378
return "R" + hex.Substring(0, 16);
13791379
}
13801380
}
1381+
1382+
private class NormalizedPathComparer : IComparer<IPackageFile>
1383+
{
1384+
public int Compare(IPackageFile x, IPackageFile y)
1385+
{
1386+
string xPathNormalized = x.Path.Replace('\\', '/');
1387+
string yPathNormalized = y.Path.Replace('\\', '/');
1388+
return String.CompareOrdinal(xPathNormalized, yPathNormalized);
1389+
}
1390+
}
13811391
}
13821392
}

test/NuGet.Core.Tests/NuGet.Packaging.Test/PackageBuilderTest.cs

Lines changed: 19 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,6 @@ public void CreatePackageWithEmptyFoldersForV3Folders()
8181
var files = archive.Entries
8282
.Where(file => file.Name == "_._")
8383
.Select(file => file.FullName)
84-
.OrderBy(s => s)
8584
.ToArray();
8685

8786
// Assert
@@ -150,7 +149,6 @@ public void CreatePackageWithDifferentFileKinds()
150149
var files = archive.Entries
151150
.Where(file => file.Name.StartsWith("foo"))
152151
.Select(file => file.FullName)
153-
.OrderBy(s => s)
154152
.ToArray();
155153

156154
// Assert
@@ -2776,21 +2774,20 @@ public void PackageBuilderWorksWithFileNamesContainingSpecialCharacters()
27762774
using (var archive = new ZipArchive(stream, ZipArchiveMode.Read, leaveOpen: true))
27772775
{
27782776
// Get raw filenames without un-escaping.
2779-
var files = archive.Entries.Select(e => e.FullName).OrderBy(s => s).ToArray();
2777+
var files = archive.Entries.Select(e => e.FullName).ToArray();
27802778

2781-
// Linux sorts the first two in different order than Windows
2782-
Assert.Contains<string>(@"[Content_Types].xml", files);
2783-
Assert.Contains<string>(@"_rels/.rels", files);
2779+
Assert.Equal(@"_rels/.rels", files[0]);
2780+
Assert.Equal(@"test.nuspec", files[1]);
27842781
Assert.Equal(@"content/images/bread&butter.jpg", files[2]);
27852782
Assert.Equal(@"content/images/logo123?#78.png", files[3]);
27862783
Assert.Equal(@"lib/C#/test.dll", files[4]);
27872784
Assert.Equal(@"lib/name with spaces.dll", files[5]);
27882785
Assert.Equal(@"lib/regular.file.dll", files[6]);
27892786

2790-
Assert.StartsWith(@"package/services/metadata/core-properties/", files[7]);
2791-
Assert.EndsWith(@".psmdcp", files[7]);
2787+
Assert.Equal(@"[Content_Types].xml", files[7]);
2788+
Assert.StartsWith(@"package/services/metadata/core-properties/", files[8]);
2789+
Assert.EndsWith(@".psmdcp", files[8]);
27922790

2793-
Assert.Equal(@"test.nuspec", files[8]);
27942791
}
27952792
}
27962793
}
@@ -2818,17 +2815,14 @@ public void PackageBuilderWorksWithFileNameWithoutAnExtension()
28182815

28192816
using (var archive = new ZipArchive(stream, ZipArchiveMode.Read, leaveOpen: true))
28202817
{
2821-
var files = archive.GetFiles().OrderBy(s => s).ToArray();
2818+
var files = archive.GetFiles().ToArray();
28222819

2823-
// Linux sorts the first two in different order than Windows
2824-
Assert.Contains<string>(@"[Content_Types].xml", files);
2825-
Assert.Contains<string>(@"_rels/.rels", files);
2820+
Assert.Equal(@"_rels/.rels", files[0]);
2821+
Assert.Equal(@"test.nuspec", files[1]);
28262822
Assert.Equal(@"myfile", files[2]);
2827-
2828-
Assert.StartsWith(@"package/services/metadata/core-properties/", files[3]);
2829-
Assert.EndsWith(@".psmdcp", files[3]);
2830-
2831-
Assert.Equal(@"test.nuspec", files[4]);
2823+
Assert.Equal(@"[Content_Types].xml", files[3]);
2824+
Assert.StartsWith(@"package/services/metadata/core-properties/", files[4]);
2825+
Assert.EndsWith(@".psmdcp", files[4]);
28322826

28332827
using (var contentTypesReader = new StreamReader(archive.Entries.Single(file => file.FullName == @"[Content_Types].xml").Open()))
28342828
{
@@ -3028,14 +3022,13 @@ public void PackageBuilderWorksWithFilesHavingCurrentDirectoryAsTarget(string in
30283022

30293023
using (var archive = new ZipArchive(stream, ZipArchiveMode.Read, leaveOpen: true))
30303024
{
3031-
var files = archive.GetFiles().OrderBy(s => s).ToArray();
3032-
3033-
// Linux sorts the first two in different order than Windows
3034-
Assert.Contains<string>(@"[Content_Types].xml", files);
3035-
Assert.Contains<string>(@"_rels/.rels", files);
3036-
Assert.StartsWith(@"package/services/metadata/core-properties/", files[2]);
3037-
Assert.Equal(@"test.nuspec", files[3]);
3038-
Assert.Equal(outputFile, files[4]);
3025+
var files = archive.GetFiles().ToArray();
3026+
3027+
Assert.Equal(@"_rels/.rels", files[0]);
3028+
Assert.Equal(@"test.nuspec", files[1]);
3029+
Assert.Equal(outputFile, files[2]);
3030+
Assert.Equal(@"[Content_Types].xml", files[3]);
3031+
Assert.StartsWith(@"package/services/metadata/core-properties/", files[4]);
30393032
}
30403033
}
30413034
}

0 commit comments

Comments
 (0)