diff --git a/.changeset/fix-multiple-dependents.md b/.changeset/fix-multiple-dependents.md new file mode 100644 index 0000000..32803c5 --- /dev/null +++ b/.changeset/fix-multiple-dependents.md @@ -0,0 +1,5 @@ +--- +"SolarWinds.Changesets": Patch +--- + +Fix `version` only bumping one dependent when a project is referenced by multiple projects. diff --git a/src/SolarWinds.Changesets/Commands/Version/Helpers/ChangelogGenerator.cs b/src/SolarWinds.Changesets/Commands/Version/Helpers/ChangelogGenerator.cs index f759077..313db3b 100644 --- a/src/SolarWinds.Changesets/Commands/Version/Helpers/ChangelogGenerator.cs +++ b/src/SolarWinds.Changesets/Commands/Version/Helpers/ChangelogGenerator.cs @@ -80,16 +80,17 @@ private static ImmutableDictionary GetProjectsDependentsNam { foreach (string projectReferenceName in csProject.ReferencedProjectNames) { - if (csProjectNameToDependentProjects.TryGetValue(projectReferenceName, out HashSet? value)) + if (!csProjectNameToDependentProjects.TryGetValue(projectReferenceName, out HashSet? value)) { - value.Add(csProject); + value = []; + csProjectNameToDependentProjects[projectReferenceName] = value; } - csProjectNameToDependentProjects[projectReferenceName] = [csProject]; + value.Add(csProject); } } - return csProjectNameToDependentProjects.ToImmutableDictionary(pair => pair.Key, pair => pair.Value.ToArray()); + return csProjectNameToDependentProjects.ToImmutableDictionary(pair => pair.Key, pair => pair.Value.OrderBy(p => p.Name).ToArray()); } /// diff --git a/tests/SolarWinds.Changesets.Tests/Version/ChangelogGeneratorTests.cs b/tests/SolarWinds.Changesets.Tests/Version/ChangelogGeneratorTests.cs index 3061ffa..ad6f6b6 100644 --- a/tests/SolarWinds.Changesets.Tests/Version/ChangelogGeneratorTests.cs +++ b/tests/SolarWinds.Changesets.Tests/Version/ChangelogGeneratorTests.cs @@ -88,6 +88,36 @@ public void GetProcessedChangelogs_OneChangelogThreeProjectsOneProjectReference_ secondModule.GetNewVersion().Should().BeEquivalentTo(new Semver(1, 1, 2)); } + [Test] + public void GetProcessedChangelogs_ProjectWithTwoDependents_BumpsBothDependents() + { + ChangelogGenerator changelogGenerator = new(); + + ChangesetFile[] changesetFile = [ + new( + ["project1"], + BumpType.Minor, + "Changelog for shared project") + ]; + + // project2 and project3 both reference project1 + IEnumerable csProjects = [ + new("project1", new Semver(1, 0, 0), [], @"c:\temp"), + new("project2", new Semver(1, 0, 0), ["project1"], @"c:\temp"), + new("project3", new Semver(1, 0, 0), ["project1"], @"c:\temp") + ]; + + List processedChangelogs = changelogGenerator.GetProcessedChangelogs(changesetFile, csProjects).ToList(); + + processedChangelogs.Select(x => x.ModuleName).Should().BeEquivalentTo(["project1", "project2", "project3"]); + + ModuleChangelog project2 = processedChangelogs.First(x => x.ModuleName == "project2"); + ModuleChangelog project3 = processedChangelogs.First(x => x.ModuleName == "project3"); + + project2.GetNewVersion().Should().BeEquivalentTo(new Semver(1, 0, 1)); + project3.GetNewVersion().Should().BeEquivalentTo(new Semver(1, 0, 1)); + } + [Test] public void GetProcessedChangelogs_OneProject_ReturnsOneChangelog() {