Mirror/.github/ModPreprocessorDefine.csx

138 lines
4.8 KiB
Plaintext
Raw Normal View History

2023-11-09 11:12:27 +00:00
#r "System.IO"
#r "System.Text.RegularExpressions"
2023-11-09 10:58:20 +00:00
2023-11-09 11:16:40 +00:00
using System;
using System.IO;
using System.Text.RegularExpressions;
2023-11-09 12:25:02 +00:00
using System.Diagnostics;
2023-11-09 11:16:40 +00:00
2023-11-09 10:58:20 +00:00
void Main()
{
2023-11-09 12:25:02 +00:00
Debug.WriteLine("Debug ModPreprocessorDefine Started");
2023-11-09 11:53:12 +00:00
Console.WriteLine("ModPreprocessorDefine Started");
2023-11-09 12:22:00 +00:00
Console.Out.Flush();
2023-11-09 10:58:20 +00:00
2023-11-09 11:50:35 +00:00
// Redirect console output to a file
var originalConsoleOut = Console.Out;
2023-11-09 10:58:20 +00:00
2023-11-09 12:07:00 +00:00
// Modify the path to use an absolute path
string outputPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), "console_output.txt");
// Redirect console output to the absolute file path
using (var writer = new StreamWriter(outputPath))
2023-11-09 11:50:35 +00:00
{
Console.SetOut(writer);
2023-11-09 12:07:00 +00:00
// Print some debug information
Console.WriteLine($"Working Directory: {Environment.CurrentDirectory}");
Console.WriteLine($"Output File Path: {outputPath}");
2023-11-09 12:22:00 +00:00
Console.Out.Flush();
2023-11-09 12:07:00 +00:00
2023-11-09 11:50:35 +00:00
// Define the path to the PreprocessorDefine.cs file
string filePath = "Assets/Mirror/CompilerSymbols/PreprocessorDefine.cs";
// Read the contents of the file
string fileContents = File.ReadAllText(filePath);
2023-11-09 11:53:12 +00:00
Console.WriteLine("ModPreprocessorDefine File read");
2023-11-09 12:22:00 +00:00
Console.Out.Flush();
2023-11-09 11:50:35 +00:00
// Find and remove the first entry ending with "_OR_NEWER"
fileContents = RemoveFirstOrNewerEntry(fileContents);
2023-11-09 11:53:12 +00:00
Console.WriteLine("ModPreprocessorDefine Old entry removed");
2023-11-09 12:22:00 +00:00
Console.Out.Flush();
2023-11-09 10:58:20 +00:00
2023-11-09 11:50:35 +00:00
// Find the last entry and capture the version number
string versionNumber = GetLastVersionNumber(fileContents);
2023-11-09 11:53:12 +00:00
Console.WriteLine($"ModPreprocessorDefine current version {versionNumber}");
2023-11-09 12:22:00 +00:00
Console.Out.Flush();
2023-11-09 11:50:35 +00:00
// Append a new entry with the correct indentation and next version number
fileContents = AppendNewEntry(fileContents, versionNumber);
2023-11-09 11:53:12 +00:00
Console.WriteLine("ModPreprocessorDefine New entry appended");
2023-11-09 12:22:00 +00:00
Console.Out.Flush();
2023-11-09 11:50:35 +00:00
// Write the modified contents back to the file
File.WriteAllText(filePath, fileContents);
Console.SetOut(originalConsoleOut);
}
2023-11-09 10:58:20 +00:00
2023-11-09 11:53:12 +00:00
Console.WriteLine("ModPreprocessorDefine Finished");
2023-11-09 10:58:20 +00:00
2023-11-09 11:50:35 +00:00
// Print the contents of the redirected file
Console.WriteLine("Console Output:");
Console.WriteLine(File.ReadAllText("console_output.txt"));
2023-11-09 12:22:00 +00:00
Console.Out.Flush();
2023-11-09 10:58:20 +00:00
}
string RemoveFirstOrNewerEntry(string input)
{
// Regex pattern to match the first entry ending with "_OR_NEWER"
string pattern = @"^\s*""[^""]*_OR_NEWER""\s*,\s*$";
// Find the first match
Match match = Regex.Match(input, pattern, RegexOptions.Multiline);
// If a match is found, remove the entire line
if (match.Success)
{
input = input.Remove(match.Index, match.Length);
}
return input;
}
string GetLastVersionNumber(string input)
{
// Regex pattern to match the last entry and capture the version number
string pattern = @"^\s*""([^""]*)_OR_NEWER""\s*,\s*$";
// Find all matches
MatchCollection matches = Regex.Matches(input, pattern, RegexOptions.Multiline);
// Capture the version number from the last match
string versionNumber = matches.Count > 0 ? matches[matches.Count - 1].Groups[1].Value : "";
return versionNumber;
}
string AppendNewEntry(string input, string versionNumber)
{
// Calculate the next version number (increment by 1)
int nextVersion = int.TryParse(versionNumber, out int currentVersion) ? currentVersion + 1 : 1;
// Get the indentation of the "HashSet<string> defines = new HashSet<string>" line
string indentation = GetHashSetIndentation(input);
// Create the new entry with the correct indentation and next version number
string newEntry = indentation + $" \"MIRROR_{nextVersion}_OR_NEWER\"";
2023-11-09 11:35:23 +00:00
Console.WriteLine($"New entry: {newEntry}");
2023-11-09 10:58:20 +00:00
// Find the position of the "defines" HashSet and insert the new entry into it
int definesStartIndex = input.IndexOf("HashSet<string> defines = new HashSet<string>");
int definesEndIndex = input.IndexOf("};", definesStartIndex) + 1;
// Insert the comma and new entry into the "defines" HashSet
input = input.Remove(definesEndIndex - 2, 2); // Remove the trailing "};"
2023-11-09 11:18:52 +00:00
input = input.Insert(definesEndIndex - 2, $",\n{newEntry}\n{indentation}}};");
2023-11-09 10:58:20 +00:00
2023-11-09 11:35:23 +00:00
Console.WriteLine(input);
2023-11-09 10:58:20 +00:00
return input;
}
string GetHashSetIndentation(string input)
{
// Regex pattern to match the indentation of "HashSet<string> defines = new HashSet<string>"
string pattern = @"^\s*HashSet<string> defines = new HashSet<string>";
// Find the first match
Match match = Regex.Match(input, pattern, RegexOptions.Multiline);
// If a match is found, capture the indentation and add 4 spaces
string indentation = match.Success ? Regex.Match(match.Value, @"^\s*").Value : "";
return indentation;
}