From 27124ed8e5bc902adf1d373035797babe3c28c9d Mon Sep 17 00:00:00 2001
From: RedworkDE <10944644+RedworkDE@users.noreply.github.com>
Date: Fri, 24 Feb 2023 20:52:38 +0100
Subject: [PATCH] C#: Discontinue `GodotNuGetFallbackFolder`
---
.../GodotTools/Build/BuildManager.cs | 10 -
.../GodotTools/Build/MSBuildPanel.cs | 20 --
.../GodotTools/GodotTools/Build/NuGetUtils.cs | 253 ------------------
.../GodotTools/GodotTools/GodotSharpEditor.cs | 28 --
4 files changed, 311 deletions(-)
delete mode 100644 modules/mono/editor/GodotTools/GodotTools/Build/NuGetUtils.cs
diff --git a/modules/mono/editor/GodotTools/GodotTools/Build/BuildManager.cs b/modules/mono/editor/GodotTools/GodotTools/Build/BuildManager.cs
index 6c5c61acb91..b7e5b058c6e 100644
--- a/modules/mono/editor/GodotTools/GodotTools/Build/BuildManager.cs
+++ b/modules/mono/editor/GodotTools/GodotTools/Build/BuildManager.cs
@@ -317,16 +317,6 @@ namespace GodotTools.Build
if (!File.Exists(GodotSharpDirs.ProjectSlnPath))
return true; // No solution to build
- try
- {
- // Make sure our packages are added to the fallback folder
- NuGetUtils.AddBundledPackagesToFallbackFolder(NuGetUtils.GodotFallbackFolderPath);
- }
- catch (Exception e)
- {
- GD.PushError("Failed to setup Godot NuGet Offline Packages: " + e.Message);
- }
-
if (GodotSharpEditor.Instance.SkipBuildBeforePlaying)
return true; // Requested play from an external editor/IDE which already built the project
diff --git a/modules/mono/editor/GodotTools/GodotTools/Build/MSBuildPanel.cs b/modules/mono/editor/GodotTools/GodotTools/Build/MSBuildPanel.cs
index cf1b84e37ff..8fe7d3c2d7a 100644
--- a/modules/mono/editor/GodotTools/GodotTools/Build/MSBuildPanel.cs
+++ b/modules/mono/editor/GodotTools/GodotTools/Build/MSBuildPanel.cs
@@ -34,16 +34,6 @@ namespace GodotTools.Build
if (!File.Exists(GodotSharpDirs.ProjectSlnPath))
return; // No solution to build
- try
- {
- // Make sure our packages are added to the fallback folder
- NuGetUtils.AddBundledPackagesToFallbackFolder(NuGetUtils.GodotFallbackFolderPath);
- }
- catch (Exception e)
- {
- GD.PushError("Failed to setup Godot NuGet Offline Packages: " + e.Message);
- }
-
if (!BuildManager.BuildProjectBlocking("Debug"))
return; // Build failed
@@ -62,16 +52,6 @@ namespace GodotTools.Build
if (!File.Exists(GodotSharpDirs.ProjectSlnPath))
return; // No solution to build
- try
- {
- // Make sure our packages are added to the fallback folder
- NuGetUtils.AddBundledPackagesToFallbackFolder(NuGetUtils.GodotFallbackFolderPath);
- }
- catch (Exception e)
- {
- GD.PushError("Failed to setup Godot NuGet Offline Packages: " + e.Message);
- }
-
if (!BuildManager.BuildProjectBlocking("Debug", rebuild: true))
return; // Build failed
diff --git a/modules/mono/editor/GodotTools/GodotTools/Build/NuGetUtils.cs b/modules/mono/editor/GodotTools/GodotTools/Build/NuGetUtils.cs
deleted file mode 100644
index fe309b81026..00000000000
--- a/modules/mono/editor/GodotTools/GodotTools/Build/NuGetUtils.cs
+++ /dev/null
@@ -1,253 +0,0 @@
-using System;
-using System.Globalization;
-using System.IO;
-using System.IO.Compression;
-using System.Linq;
-using System.Security.Cryptography;
-using System.Text;
-using System.Xml;
-using Godot;
-using GodotTools.Internals;
-using GodotTools.Shared;
-using Directory = GodotTools.Utils.Directory;
-using Environment = System.Environment;
-using File = GodotTools.Utils.File;
-
-namespace GodotTools.Build
-{
- public static class NuGetUtils
- {
- public const string GodotFallbackFolderName = "Godot Offline Packages";
-
- public static string GodotFallbackFolderPath
- => Path.Combine(GodotSharpDirs.MonoUserDir, "GodotNuGetFallbackFolder");
-
- ///
- /// Returns all the paths where the Godot.Offline.Config files can be found.
- /// Does not determine whether the returned files exist or not.
- ///
- private static string[] GetAllGodotNuGetConfigFilePaths()
- {
- // Where to find 'NuGet/config/Godot.Offline.Config':
- //
- // - Mono/.NETFramework (standalone NuGet):
- // Uses Environment.SpecialFolder.ApplicationData
- // - Windows: '%APPDATA%'
- // - Linux/macOS: '$HOME/.config'
- // - CoreCLR (dotnet CLI NuGet):
- // - Windows: '%APPDATA%'
- // - Linux/macOS: '$DOTNET_CLI_HOME/.nuget' otherwise '$HOME/.nuget'
-
- string applicationData = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
-
- const string configFileName = "Godot.Offline.Config";
-
- if (Utils.OS.IsWindows)
- {
- // %APPDATA% for both
- return new[] { Path.Combine(applicationData, "NuGet", "config", configFileName) };
- }
-
- var paths = new string[2];
-
- // CoreCLR (dotnet CLI NuGet)
-
- string dotnetCliHome = Environment.GetEnvironmentVariable("DOTNET_CLI_HOME");
- if (!string.IsNullOrEmpty(dotnetCliHome))
- {
- paths[0] = Path.Combine(dotnetCliHome, ".nuget", "NuGet", "config", configFileName);
- }
- else
- {
- string home = Environment.GetEnvironmentVariable("HOME");
- if (string.IsNullOrEmpty(home))
- throw new InvalidOperationException("Required environment variable 'HOME' is not set.");
- paths[0] = Path.Combine(home, ".nuget", "NuGet", "config", configFileName);
- }
-
- // Mono/.NETFramework (standalone NuGet)
-
- // ApplicationData is $HOME/.config on Linux/macOS
- paths[1] = Path.Combine(applicationData, "NuGet", "config", configFileName);
-
- return paths;
- }
-
- // nupkg extraction
- //
- // Exclude: (NuGet.Client -> NuGet.Packaging.PackageHelper.ExcludePaths)
- // package/
- // _rels/
- // [Content_Types].xml
- //
- // Don't ignore files that begin with a dot (.)
- //
- // The nuspec is not lower case inside the nupkg but must be made lower case when extracted.
-
- ///
- /// Adds the specified fallback folder to the Godot.Offline.Config files,
- /// for both standalone NuGet (Mono/.NETFramework) and dotnet CLI NuGet.
- ///
- public static void AddFallbackFolderToGodotNuGetConfigs(string name, string path)
- {
- // Make sure the fallback folder exists to avoid error:
- // MSB4018: The "ResolvePackageAssets" task failed unexpectedly.
- System.IO.Directory.CreateDirectory(path);
-
- foreach (string nuGetConfigPath in GetAllGodotNuGetConfigFilePaths())
- {
- string defaultConfig = @$"
-
-
-
-
-
-";
- System.IO.Directory.CreateDirectory(Path.GetDirectoryName(nuGetConfigPath));
- System.IO.File.WriteAllText(nuGetConfigPath, defaultConfig, Encoding.UTF8); // UTF-8 with BOM
- }
- }
-
- private static void AddPackageToFallbackFolder(string fallbackFolder,
- string nupkgPath, string packageId, string packageVersion)
- {
- // dotnet CLI provides no command for this, but we can do it manually.
- //
- // - The expected structure is as follows:
- // fallback_folder/
- // //
- // ..nupkg
- // ..nupkg.sha512
- // .nuspec
- // ... extracted nupkg files (check code for excluded files) ...
- //
- // - and must be in lower case.
- // - The sha512 of the nupkg is base64 encoded.
- // - We can get the nuspec from the nupkg which is a Zip file.
-
- string packageIdLower = packageId.ToLowerInvariant();
- string packageVersionLower = packageVersion.ToLowerInvariant();
-
- string destDir = Path.Combine(fallbackFolder, packageIdLower, packageVersionLower);
- string nupkgDestPath = Path.Combine(destDir, $"{packageIdLower}.{packageVersionLower}.nupkg");
- string nupkgSha512DestPath = Path.Combine(destDir, $"{packageIdLower}.{packageVersionLower}.nupkg.sha512");
- string nupkgMetadataDestPath = Path.Combine(destDir, ".nupkg.metadata");
-
- if (File.Exists(nupkgDestPath) && File.Exists(nupkgSha512DestPath))
- return; // Already added (for speed we don't check if every file is properly extracted)
-
- Directory.CreateDirectory(destDir);
-
- // Generate .nupkg.sha512 file
-
- byte[] hash = SHA512.HashData(File.ReadAllBytes(nupkgPath));
- string base64Hash = Convert.ToBase64String(hash);
- File.WriteAllText(nupkgSha512DestPath, base64Hash);
-
- // Generate .nupkg.metadata file
- // Spec: https://github.com/NuGet/Home/wiki/Nupkg-Metadata-File
-
- File.WriteAllText(nupkgMetadataDestPath, @$"{{
- ""version"": 2,
- ""contentHash"": ""{base64Hash}"",
- ""source"": null
-}}");
-
- // Extract nupkg
- ExtractNupkg(destDir, nupkgPath, packageId, packageVersion);
-
- // Copy .nupkg
- File.Copy(nupkgPath, nupkgDestPath);
- }
-
- private static readonly string[] NupkgExcludePaths =
- {
- "_rels/",
- "package/",
- "[Content_Types].xml"
- };
-
- private static void ExtractNupkg(string destDir, string nupkgPath, string packageId, string packageVersion)
- {
- // NOTE: Must use SimplifyGodotPath to make sure we don't extract files outside the destination directory.
-
- using (var archive = ZipFile.OpenRead(nupkgPath))
- {
- // Extract .nuspec manually as it needs to be in lower case
-
- var nuspecEntry = archive.GetEntry(packageId + ".nuspec");
-
- if (nuspecEntry == null)
- throw new InvalidOperationException(
- $"Failed to extract package {packageId}.{packageVersion}. Could not find the nuspec file.");
-
- nuspecEntry.ExtractToFile(Path.Combine(destDir, nuspecEntry.Name
- .ToLowerInvariant().SimplifyGodotPath()));
-
- // Extract the other package files
-
- foreach (var entry in archive.Entries)
- {
- // NOTE: SimplifyGodotPath() removes trailing slash and backslash,
- // so we can't use the result to check if the entry is a directory.
-
- string entryFullName = entry.FullName.Replace('\\', '/');
-
- // Check if the file must be ignored
- if ( // Excluded files.
- NupkgExcludePaths.Any(e => entryFullName.StartsWith(e, StringComparison.OrdinalIgnoreCase)) ||
- // Nupkg hash files and nupkg metadata files on all directory.
- entryFullName.EndsWith(".nupkg.sha512", StringComparison.OrdinalIgnoreCase) ||
- entryFullName.EndsWith(".nupkg.metadata", StringComparison.OrdinalIgnoreCase) ||
- // Nuspec at root level. We already extracted it previously but in lower case.
- !entryFullName.Contains('/') && entryFullName.EndsWith(".nuspec"))
- {
- continue;
- }
-
- string entryFullNameSimplified = entryFullName.SimplifyGodotPath();
- string destFilePath = Path.Combine(destDir, entryFullNameSimplified);
- bool isDir = entryFullName.EndsWith("/");
-
- if (isDir)
- {
- Directory.CreateDirectory(destFilePath);
- }
- else
- {
- Directory.CreateDirectory(Path.GetDirectoryName(destFilePath));
- entry.ExtractToFile(destFilePath, overwrite: true);
- }
- }
- }
- }
-
- ///
- /// Copies and extracts all the Godot bundled packages to the Godot NuGet fallback folder.
- /// Does nothing if the packages were already copied.
- ///
- public static void AddBundledPackagesToFallbackFolder(string fallbackFolder)
- {
- GD.Print("Copying Godot Offline Packages...");
-
- string nupkgsLocation = Path.Combine(GodotSharpDirs.DataEditorToolsDir, "nupkgs");
-
- void AddPackage(string packageId, string packageVersion)
- {
- string nupkgPath = Path.Combine(nupkgsLocation, $"{packageId}.{packageVersion}.nupkg");
- AddPackageToFallbackFolder(fallbackFolder, nupkgPath, packageId, packageVersion);
- }
-
- foreach (var (packageId, packageVersion) in PackagesToAdd)
- AddPackage(packageId, packageVersion);
- }
-
- private static readonly (string packageId, string packageVersion)[] PackagesToAdd =
- {
- ("Godot.NET.Sdk", GeneratedGodotNupkgsVersions.GodotNETSdk),
- ("Godot.SourceGenerators", GeneratedGodotNupkgsVersions.GodotSourceGenerators),
- ("GodotSharp", GeneratedGodotNupkgsVersions.GodotSharp),
- ("GodotSharpEditor", GeneratedGodotNupkgsVersions.GodotSharp),
- };
- }
-}
diff --git a/modules/mono/editor/GodotTools/GodotTools/GodotSharpEditor.cs b/modules/mono/editor/GodotTools/GodotTools/GodotSharpEditor.cs
index f50803af959..9eefa3c386c 100644
--- a/modules/mono/editor/GodotTools/GodotTools/GodotSharpEditor.cs
+++ b/modules/mono/editor/GodotTools/GodotTools/GodotSharpEditor.cs
@@ -133,22 +133,6 @@ namespace GodotTools
}
break;
}
- case MenuOptions.SetupGodotNugetFallbackFolder:
- {
- try
- {
- string fallbackFolder = NuGetUtils.GodotFallbackFolderPath;
- NuGetUtils.AddFallbackFolderToGodotNuGetConfigs(NuGetUtils.GodotFallbackFolderName,
- fallbackFolder);
- NuGetUtils.AddBundledPackagesToFallbackFolder(fallbackFolder);
- }
- catch (Exception e)
- {
- ShowErrorDialog("Failed to setup Godot NuGet Offline Packages: " + e.Message);
- }
-
- break;
- }
default:
throw new ArgumentOutOfRangeException(nameof(id), id, "Invalid menu option");
}
@@ -168,7 +152,6 @@ namespace GodotTools
private enum MenuOptions
{
CreateSln,
- SetupGodotNugetFallbackFolder,
}
public void ShowErrorDialog(string message, string title = "Error")
@@ -533,17 +516,6 @@ namespace GodotTools
exportPlugin.RegisterExportSettings();
_exportPluginWeak = WeakRef(exportPlugin);
- try
- {
- // At startup we make sure NuGet.Config files have our Godot NuGet fallback folder included
- NuGetUtils.AddFallbackFolderToGodotNuGetConfigs(NuGetUtils.GodotFallbackFolderName,
- NuGetUtils.GodotFallbackFolderPath);
- }
- catch (Exception e)
- {
- GD.PushError("Failed to add Godot NuGet Offline Packages to NuGet.Config: " + e.Message);
- }
-
BuildManager.Initialize();
RiderPathManager.Initialize();