Skip to content
This repository has been archived by the owner on Jul 12, 2022. It is now read-only.

Commit

Permalink
Multipackage wordings (#479)
Browse files Browse the repository at this point in the history
* multipackage commit wording

* Multipackage updates can't all have the same branch name!

* Tests pass

* Introduce md5 hash

* Tests on branch namer

* Another test - same input data, same hash
  • Loading branch information
AnthonySteele authored Oct 22, 2018
1 parent 4e50668 commit f86530d
Show file tree
Hide file tree
Showing 7 changed files with 218 additions and 6 deletions.
116 changes: 116 additions & 0 deletions NuKeeper.Tests/Engine/BranchNamerTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
using System.Collections.Generic;
using NuKeeper.Engine;
using NuKeeper.Inspection.RepositoryInspection;
using NUnit.Framework;

namespace NuKeeper.Tests.Engine
{
[TestFixture]
public class BranchNamerTests
{
[Test]
public void TestWithSinglePackage()
{
var packages = PackageUpdates.MakeUpdateSet("SomePackage")
.InList();

var branchName = BranchNamer.MakeName(packages);

Assert.That(branchName, Is.EqualTo("nukeeper-update-SomePackage-to-1.2.3"));
}

[Test]
public void TestWithTwoPackages()
{
var packages = new List<PackageUpdateSet>
{
PackageUpdates.MakeUpdateSet("SomePackage"),
PackageUpdates.MakeUpdateSet("OtherPackage")
};

var branchName = BranchNamer.MakeName(packages);

Assert.That(branchName, Is.EqualTo("nukeeper-update-2-packages-AA9F9828431C8BFB7A18D3D8F0CF229D"));
}

[Test]
public void TestWithThreePackages()
{
var packages = new List<PackageUpdateSet>
{
PackageUpdates.MakeUpdateSet("SomePackage"),
PackageUpdates.MakeUpdateSet("OtherPackage"),
PackageUpdates.MakeUpdateSet("SomethingElse"),
};

var branchName = BranchNamer.MakeName(packages);

Assert.That(branchName, Is.EqualTo("nukeeper-update-3-packages-BBBB3BF2315D6111CFCBF6A4A7A29DD8"));
}

[Test]
public void EquivalentInputs_HaveSameHash()
{
var packages1 = new List<PackageUpdateSet>
{
PackageUpdates.MakeUpdateSet("SomePackage", "2.3.4"),
PackageUpdates.MakeUpdateSet("OtherPackage", "2.3.4")
};

var packages2 = new List<PackageUpdateSet>
{
PackageUpdates.MakeUpdateSet("SomePackage", "2.3.4"),
PackageUpdates.MakeUpdateSet("OtherPackage", "2.3.4")
};

var branchName1 = BranchNamer.MakeName(packages1);
var branchName2 = BranchNamer.MakeName(packages2);

Assert.That(branchName1, Is.EqualTo(branchName2));
}


[Test]
public void VersionChange_ChangesHash()
{
var packages1 = new List<PackageUpdateSet>
{
PackageUpdates.MakeUpdateSet("SomePackage", "2.3.4"),
PackageUpdates.MakeUpdateSet("OtherPackage", "2.3.4")
};

var packages2 = new List<PackageUpdateSet>
{
PackageUpdates.MakeUpdateSet("SomePackage", "2.3.4"),
PackageUpdates.MakeUpdateSet("OtherPackage", "2.3.5")
};

var branchName1 = BranchNamer.MakeName(packages1);
var branchName2 = BranchNamer.MakeName(packages2);

Assert.That(branchName1, Is.Not.EqualTo(branchName2));
}

[Test]
public void NameChange_ChangesHash()
{
var packages1 = new List<PackageUpdateSet>
{
PackageUpdates.MakeUpdateSet("SomePackage", "2.3.4"),
PackageUpdates.MakeUpdateSet("OtherPackage", "2.3.4")
};

var packages2 = new List<PackageUpdateSet>
{
PackageUpdates.MakeUpdateSet("ZomePackage", "2.3.4"),
PackageUpdates.MakeUpdateSet("OtherPackage", "2.3.4")
};

var branchName1 = BranchNamer.MakeName(packages1);
var branchName2 = BranchNamer.MakeName(packages2);

Assert.That(branchName1, Is.Not.EqualTo(branchName2));
}

}
}
7 changes: 6 additions & 1 deletion NuKeeper.Tests/Engine/CommitWordingTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -298,7 +298,12 @@ public void TwoUpdateSets()

var report = CommitWording.MakeCommitDetails(updates);

Assert.That(report, Does.StartWith("2 packages were updated: `foo.bar`, `packageTwo`"));
Assert.That(report, Does.StartWith("2 packages were updated in 1 project:"));
Assert.That(report, Does.Contain("`foo.bar`, `packageTwo`"));
Assert.That(report, Does.Contain("<details>"));
Assert.That(report, Does.Contain("</details>"));
Assert.That(report, Does.Contain("<summary>"));
Assert.That(report, Does.Contain("</summary>"));
Assert.That(report, Does.Contain("NuKeeper has generated a major update of `foo.bar` to `2.1.1` from `1.1.0`"));
Assert.That(report, Does.Contain("NuKeeper has generated a major update of `packageTwo` to `3.4.5` from `1.1.0`"));
}
Expand Down
17 changes: 17 additions & 0 deletions NuKeeper.Tests/Engine/HasherTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
using NUnit.Framework;
using NuKeeper.Engine;

namespace NuKeeper.Tests.Engine
{
[TestFixture]
public class HasherTests
{
[Test]
public void CanHash()
{
var output = Hasher.Hash("test");

Assert.That(output, Is.EqualTo("098F6BCD4621D373CADE4E832627B4F6"));
}
}
}
25 changes: 22 additions & 3 deletions NuKeeper/Engine/BranchNamer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,33 @@ namespace NuKeeper.Engine
{
public static class BranchNamer
{
public static string MakeName(PackageUpdateSet updateSet)
public static string MakeName(IReadOnlyCollection<PackageUpdateSet> updates)
{
return updates.Count > 1 ?
MakeMultiPackageName(updates) :
MakeSinglePackageName(updates.First());
}

private static string MakeMultiPackageName(IReadOnlyCollection<PackageUpdateSet> updates)
{
var updatesHash = Hasher.Hash(PackageVersionStrings(updates));

return $"nukeeper-update-{updates.Count}-packages-{updatesHash}";
}

public static string MakeSinglePackageName(PackageUpdateSet updateSet)
{
return $"nukeeper-update-{updateSet.SelectedId}-to-{updateSet.SelectedVersion}";
}

public static string MakeName(IReadOnlyCollection<PackageUpdateSet> updates)
private static string PackageVersionStrings(IReadOnlyCollection<PackageUpdateSet> updates)
{
return string.Join(",", updates.Select(PackageVersionString));
}

private static string PackageVersionString(PackageUpdateSet updateSet)
{
return updates.Count > 1 ? "nukeeper-update-packages" : MakeName(updates.First());
return $"{updateSet.SelectedId}-v{updateSet.SelectedVersion}";
}
}
}
26 changes: 25 additions & 1 deletion NuKeeper/Engine/CommitWording.cs
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,11 @@ public static string MakeCommitDetails(IReadOnlyCollection<PackageUpdateSet> upd
builder.AppendLine(MakeCommitVersionDetails(update));
}

if (updates.Count > 1)
{
MultiPackageFooter(builder);
}

AddCommitFooter(builder);

return builder.ToString();
Expand All @@ -57,7 +62,26 @@ private static void MultiPackagePrefix(IReadOnlyCollection<PackageUpdateSet> upd
var packageNames = updates
.Select(p => CodeQuote(p.SelectedId))
.JoinWithCommas();
builder.AppendLine($"{updates.Count} packages were updated: {packageNames}");

var projects = updates.SelectMany(
u => u.CurrentPackages)
.Select(p => p.Path.FullName)
.Distinct()
.ToList();

var projectOptS = (projects.Count > 1) ? "s" : string.Empty;

builder.AppendLine($"{updates.Count} packages were updated in {projects.Count} project{projectOptS}:");
builder.AppendLine(packageNames);
builder.AppendLine("<details>");
builder.AppendLine("<summary>Details of updated packages</summary>");
builder.AppendLine("");
}

private static void MultiPackageFooter(StringBuilder builder)
{
builder.AppendLine("</details>");
builder.AppendLine("");
}

private static string MakeCommitVersionDetails(PackageUpdateSet updates)
Expand Down
31 changes: 31 additions & 0 deletions NuKeeper/Engine/Hasher.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
using System.Globalization;
using System.Security.Cryptography;
using System.Text;

namespace NuKeeper.Engine
{
public static class Hasher
{
#pragma warning disable CA5351
private static MD5 md5 = MD5.Create();

public static string Hash(string input)
{
var inputBytes = Encoding.ASCII.GetBytes(input);
var hash = md5.ComputeHash(inputBytes);
return BytesToString(hash);
}

private static string BytesToString(byte[] bytes)
{
var result = new StringBuilder();

foreach (var b in bytes)
{
result.Append(b.ToString("X2", CultureInfo.InvariantCulture));
}

return result.ToString();
}
}
}
2 changes: 1 addition & 1 deletion NuKeeper/Engine/Packages/ExistingBranchFilter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ public async Task<bool> CanMakeBranchFor(PackageUpdateSet packageUpdateSet,
{
try
{
var branchName = BranchNamer.MakeName(packageUpdateSet);
var branchName = BranchNamer.MakeSinglePackageName(packageUpdateSet);
var githubBranch = await _gitHub.GetRepositoryBranch(pushFork.Owner, pushFork.Name, branchName);
return (githubBranch == null);
}
Expand Down

0 comments on commit f86530d

Please sign in to comment.