Skip to content

Commit f3793b0

Browse files
CopilotAArnott
andauthored
Add Central Package Management (CPM) support to nbgv install command (#1208)
* Initial plan for issue * Implement Central Package Management support in nbgv install command Co-authored-by: AArnott <[email protected]> * Simply the CPM check --------- Co-authored-by: copilot-swe-agent[bot] <[email protected]> Co-authored-by: AArnott <[email protected]> Co-authored-by: Andrew Arnott <[email protected]>
1 parent ad46011 commit f3793b0

File tree

1 file changed

+95
-7
lines changed

1 file changed

+95
-7
lines changed

src/nbgv/Program.cs

Lines changed: 95 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -382,23 +382,61 @@ private static async Task<int> OnInstallCommand(string path, string version, str
382382
const string PrivateAssetsMetadataName = "PrivateAssets";
383383
const string VersionMetadataName = "Version";
384384

385+
// Check if Central Package Management is enabled
386+
bool isCpmEnabled = IsCentralPackageManagementEnabled(path);
387+
388+
if (isCpmEnabled)
389+
{
390+
// Update Directory.Packages.props with PackageVersion
391+
UpdateDirectoryPackagesProps(path, PackageId, packageVersion);
392+
string directoryPackagesPropsPath = Path.Combine(path, "Directory.Packages.props");
393+
context.Stage(directoryPackagesPropsPath);
394+
}
395+
385396
ProjectItemElement item = propsFile.Items.FirstOrDefault(i => i.ItemType == PackageReferenceItemType && i.Include == PackageId);
386397

387398
if (item is null)
388399
{
400+
var metadata = new Dictionary<string, string>
401+
{
402+
{ PrivateAssetsMetadataName, "all" },
403+
};
404+
405+
// Only add Version if CPM is not enabled
406+
if (!isCpmEnabled)
407+
{
408+
metadata[VersionMetadataName] = packageVersion;
409+
}
410+
389411
item = propsFile.AddItem(
390412
PackageReferenceItemType,
391413
PackageId,
392-
new Dictionary<string, string>
393-
{
394-
{ PrivateAssetsMetadataName, "all" },
395-
{ VersionMetadataName, packageVersion },
396-
});
414+
metadata);
397415
}
398416
else
399417
{
400-
ProjectMetadataElement versionMetadata = item.Metadata.Single(m => m.Name == VersionMetadataName);
401-
versionMetadata.Value = packageVersion;
418+
if (isCpmEnabled)
419+
{
420+
// Remove Version metadata if CPM is enabled
421+
ProjectMetadataElement versionMetadata = item.Metadata.FirstOrDefault(m => m.Name == VersionMetadataName);
422+
if (versionMetadata is not null)
423+
{
424+
item.RemoveChild(versionMetadata);
425+
}
426+
}
427+
else
428+
{
429+
// Update Version metadata if CPM is not enabled
430+
ProjectMetadataElement versionMetadata = item.Metadata.FirstOrDefault(m => m.Name == VersionMetadataName);
431+
if (versionMetadata is not null)
432+
{
433+
versionMetadata.Value = packageVersion;
434+
}
435+
else
436+
{
437+
item.AddMetadata(VersionMetadataName, packageVersion);
438+
}
439+
}
402440
}
403441

404442
item.Condition = "!Exists('packages.config')";
@@ -866,6 +904,56 @@ private static async Task<string> GetLatestPackageVersionAsync(string packageId,
866904
return pkg.LatestVersion?.ToNormalizedString();
867905
}
868906

907+
private static bool IsCentralPackageManagementEnabled(string path)
908+
{
909+
string directoryPackagesPropsPath = Path.Combine(path, "Directory.Packages.props");
910+
if (!File.Exists(directoryPackagesPropsPath))
911+
{
912+
return false;
913+
}
914+
915+
return true;
916+
}
917+
918+
private static void UpdateDirectoryPackagesProps(string path, string packageId, string packageVersion)
919+
{
920+
string directoryPackagesPropsPath = Path.Combine(path, "Directory.Packages.props");
921+
ProjectRootElement propsFile = File.Exists(directoryPackagesPropsPath)
922+
? ProjectRootElement.Open(directoryPackagesPropsPath)
923+
: ProjectRootElement.Create(directoryPackagesPropsPath);
924+
925+
const string PackageVersionItemType = "PackageVersion";
926+
const string VersionMetadataName = "Version";
927+
928+
ProjectItemElement item = propsFile.Items.FirstOrDefault(i =>
929+
i.ItemType == PackageVersionItemType && i.Include == packageId);
930+
931+
if (item is null)
932+
{
933+
item = propsFile.AddItem(
934+
PackageVersionItemType,
935+
packageId,
936+
new Dictionary<string, string>
937+
{
938+
{ VersionMetadataName, packageVersion },
939+
});
940+
}
941+
else
942+
{
943+
ProjectMetadataElement versionMetadata = item.Metadata.FirstOrDefault(m => m.Name == VersionMetadataName);
944+
if (versionMetadata is not null)
945+
{
946+
versionMetadata.Value = packageVersion;
947+
}
948+
else
949+
{
950+
item.AddMetadata(VersionMetadataName, packageVersion);
951+
}
952+
}
953+
954+
propsFile.Save(directoryPackagesPropsPath);
955+
}
956+
869957
private static string GetSpecifiedOrCurrentDirectoryPath(string versionJsonRoot)
870958
{
871959
return ShouldHaveTrailingDirectorySeparator(Path.GetFullPath(string.IsNullOrEmpty(versionJsonRoot) ? "." : versionJsonRoot));

0 commit comments

Comments
 (0)