person-key-to-immich-import birthday json (Day-Helper-2024-05-18)

csharp_prefer_braces = true
This commit is contained in:
2025-09-06 11:16:55 -07:00
parent 8ec89953bc
commit 6102da7266
54 changed files with 2218 additions and 1721 deletions

View File

@ -28,7 +28,7 @@ csharp_new_line_before_members_in_anonymous_types = true
csharp_new_line_before_members_in_object_initializers = true
csharp_new_line_before_open_brace = none
csharp_new_line_between_query_expression_clauses = true
csharp_prefer_braces = false
csharp_prefer_braces = true
csharp_prefer_qualified_reference = true:error
csharp_prefer_simple_default_expression = true:warning
csharp_prefer_simple_using_statement = true:warning

View File

@ -1,6 +1,5 @@
using System.Globalization;
using Microsoft.Extensions.Logging;
using System.Globalization;
namespace File_Folder_Helper.ADO2025.PI5;
@ -17,18 +16,20 @@ internal static partial class Helper20250218 {
string[] directories = Directory.GetDirectories(sourceDirectory, "*", SearchOption.TopDirectoryOnly);
foreach (string directory in directories) {
checkDirectory = Path.Combine(directory, checkDirectoryName);
if (!Directory.Exists(checkDirectory))
if (!Directory.Exists(checkDirectory)) {
continue;
}
MoveToArchive(logger, searchPattern, searchMES, searchSequence, destinationRoot, checkDirectory);
}
}
private static void MoveToArchive(ILogger<Worker> logger, string searchPattern, string searchMES, string searchSequence, string destinationRoot, string checkDirectory) {
string[] files = Directory.GetFiles(checkDirectory, searchPattern, SearchOption.AllDirectories);
if (files.Length == 0)
if (files.Length == 0) {
logger.LogInformation("<{files}>(s)", files.Length);
else
} else {
MoveToArchive(logger, searchMES, searchSequence, destinationRoot, files);
}
}
private static void MoveToArchive(ILogger<Worker> logger, string searchMES, string searchSequence, string destinationRoot, string[] files) {
@ -46,15 +47,18 @@ internal static partial class Helper20250218 {
Calendar calendar = new CultureInfo("en-US").Calendar;
foreach (string file in files) {
fileInfo = new(file);
if (string.IsNullOrEmpty(fileInfo.DirectoryName))
if (string.IsNullOrEmpty(fileInfo.DirectoryName)) {
continue;
}
text = File.ReadAllText(file);
segments = text.Split(searchMES);
if (segments.Length < 2)
if (segments.Length < 2) {
continue;
}
segmentsB = text.Split(searchSequence);
if (segmentsB.Length < 2)
if (segmentsB.Length < 2) {
continue;
}
mes = segments[1].Split(';')[0];
sequence = segmentsB[1].Split(';')[0];
segmentsC = Path.GetFileName(fileInfo.DirectoryName).Split('-');

View File

@ -1,10 +1,9 @@
using Microsoft.Extensions.Logging;
using System.Collections.ObjectModel;
using System.Text;
using System.Text.Json;
using System.Text.Json.Serialization;
using Microsoft.Extensions.Logging;
namespace File_Folder_Helper.ADO2025.PI5;
internal static partial class Helper20250219 {
@ -42,10 +41,12 @@ internal static partial class Helper20250219 {
ReadOnlyCollection<int> columnIndices = args[10].Split(',').Select(int.Parse).ToArray().AsReadOnly();
foreach (string segment in segments) {
segmentsB = segment.Split('|');
if (segmentsB.Length != 2)
if (segmentsB.Length != 2) {
continue;
if (distinct.Contains(segmentsB[0]))
}
if (distinct.Contains(segmentsB[0])) {
continue;
}
distinct.Add(segmentsB[0]);
keyValuePairs.Add(segmentsB[0], segmentsB[1]);
}
@ -77,13 +78,15 @@ internal static partial class Helper20250219 {
directory = fileInfo.DirectoryName ?? throw new Exception();
directoryFiles = Directory.GetFiles(directory, searchPattern, SearchOption.TopDirectoryOnly);
matches = (from l in directoryFiles where l != fileInfo.FullName select l).ToArray();
if (matches.Length < 1)
if (matches.Length < 1) {
continue;
}
directorySegment = directory[sourceDirectoryLength..];
processDataStandardFormat = GetProcessDataStandardFormat(logger, fileInfo.LastWriteTime, pdsfMapping.NewColumnNames.Count, columnsLine, fileInfo.FullName, lines: null);
jsonElementsNew = GetArray(logger, pdsfMapping.NewColumnNames.Count, processDataStandardFormat, lookForNumbers: false);
if (jsonElementsNew is null)
if (jsonElementsNew is null) {
continue;
}
if (pdsfMapping.OldColumnNames.Count == pdsfMapping.ColumnIndices.Count) {
processDataStandardFormat = GetProcessDataStandardFormat(logger, pdsfMapping, jsonElementsNew, processDataStandardFormat);
Write(logger, fileInfo, processDataStandardFormat);
@ -132,13 +135,15 @@ internal static partial class Helper20250219 {
valueOld = jsonPropertyOld.Value.ToString();
if (processDataStandardFormatMapping.KeyValuePairs.TryGetValue(jsonPropertyOld.Name, out string? name) && !string.IsNullOrEmpty(name)) {
q = TryGetPropertyIndex(jsonPropertiesNew, name);
if (q is null && i == 0)
if (q is null && i == 0) {
unknownColumns.Add($"{jsonPropertyOld.Name}|{name}");
}
} else {
q = TryGetPropertyIndex(jsonPropertiesNew, jsonPropertyOld.Name);
if (q is null) {
if (i == 0)
if (i == 0) {
unknownColumns.Add(jsonPropertyOld.Name);
}
}
}
if (q is null) {
@ -153,8 +158,9 @@ internal static partial class Helper20250219 {
if (i == last) {
columns.Add("-1");
columnPairs.Add($"{jsonPropertyOld.Name}:");
if (!string.IsNullOrEmpty(valueOld))
if (!string.IsNullOrEmpty(valueOld)) {
logger.LogDebug("{p} )) {jsonPropertyOld.Name} ??", p, jsonPropertyOld.Name);
}
}
} else {
jsonPropertyNew = jsonPropertiesNew[q.Value];
@ -163,16 +169,19 @@ internal static partial class Helper20250219 {
columnPairs.Add($"{jsonPropertyOld.Name}:{jsonPropertyNew.Name}");
}
valueNew = jsonPropertyNew.Value.ToString();
if (i == last)
if (i == last) {
logger.LogDebug("{p} )) {jsonPropertyOld.Name} ~~ {q.Value} => {jsonPropertyNew.Name}", p, jsonPropertyOld.Name, q.Value, jsonPropertyNew.Name);
}
if (valueNew != valueOld && !differentColumns.Contains(jsonPropertyOld.Name)) {
if (valueNew.Length >= 2 && valueNew.Split(' ')[0] == valueOld)
if (valueNew.Length >= 2 && valueNew.Split(' ')[0] == valueOld) {
sameAfterSpaceSplitColumns.Add(jsonPropertyOld.Name);
else {
if (processDataStandardFormatMapping.BackfillColumns.Contains(jsonPropertyOld.Name) && i != last)
} else {
if (processDataStandardFormatMapping.BackfillColumns.Contains(jsonPropertyOld.Name) && i != last) {
continue;
if (processDataStandardFormatMapping.IndexOnlyColumns.Contains(jsonPropertyOld.Name) && int.TryParse(jsonPropertyOld.Name[^2..], out int index) && i != index - 1)
}
if (processDataStandardFormatMapping.IndexOnlyColumns.Contains(jsonPropertyOld.Name) && int.TryParse(jsonPropertyOld.Name[^2..], out int index) && i != index - 1) {
continue;
}
logger.LogWarning("For [{jsonProperty.Name}] <{directory}> doesn't match (valueNew:{valueNew} != valueOld:{valueOld})!", jsonPropertyOld.Name, directory, valueNew, valueOld);
differentColumns.Add(jsonPropertyOld.Name);
}
@ -191,19 +200,23 @@ internal static partial class Helper20250219 {
private static int? TryGetPropertyIndex(JsonProperty[] jsonProperties, string propertyName) {
int? result = null;
for (int i = 0; i < jsonProperties.Length; i++) {
if (jsonProperties[i].Name != propertyName)
if (jsonProperties[i].Name != propertyName) {
continue;
}
result = i;
break;
}
if (result is null) {
for (int i = 0; i < jsonProperties.Length; i++) {
if (jsonProperties[i].Name[0] != propertyName[0])
if (jsonProperties[i].Name[0] != propertyName[0]) {
continue;
if (jsonProperties[i].Name.Length != propertyName.Length)
}
if (jsonProperties[i].Name.Length != propertyName.Length) {
continue;
if (jsonProperties[i].Name != propertyName)
}
if (jsonProperties[i].Name != propertyName) {
continue;
}
result = i;
break;
}
@ -219,9 +232,9 @@ internal static partial class Helper20250219 {
List<string> logistics = [];
bool lookForLogistics = false;
lines ??= File.ReadAllLines(path);
if (lines.Length <= columnsLine)
if (lines.Length <= columnsLine) {
segments = [];
else {
} else {
segments = lines[columnsLine].Split('\t');
if (segments.Length != expectedColumns) {
logger.LogWarning("{segments} != {expectedColumns}", segments.Length, expectedColumns);
@ -230,24 +243,26 @@ internal static partial class Helper20250219 {
}
string[] columns = segments.Select(l => l.Trim('"')).ToArray();
for (int r = columnsLine + 1; r < lines.Length; r++) {
if (lines[r].StartsWith("NUM_DATA_ROWS"))
if (lines[r].StartsWith("NUM_DATA_ROWS")) {
lookForLogistics = true;
}
if (!lookForLogistics) {
body.Add(lines[r]);
continue;
}
if (lines[r].StartsWith("LOGISTICS_1")) {
for (int i = r; i < lines.Length; i++) {
if (lines[r].StartsWith("END_HEADER"))
if (lines[r].StartsWith("END_HEADER")) {
break;
}
logistics.Add(lines[i]);
}
break;
}
}
if (logistics.Count == 0)
if (logistics.Count == 0) {
sequence = lastWriteTime.Ticks;
else {
} else {
segments = logistics[0].Split("SEQUENCE=");
sequence = segments.Length < 2 || !long.TryParse(segments[1].Split(';')[0], out long s) ? lastWriteTime.Ticks : s;
}
@ -260,9 +275,9 @@ internal static partial class Helper20250219 {
private static JsonElement[]? GetArray(ILogger<Worker> logger, int expectedColumns, ProcessDataStandardFormat processDataStandardFormat, bool lookForNumbers) {
JsonElement[]? results;
if (processDataStandardFormat.Body.Count == 0 || !processDataStandardFormat.Body[0].Contains('\t'))
if (processDataStandardFormat.Body.Count == 0 || !processDataStandardFormat.Body[0].Contains('\t')) {
results = JsonSerializer.Deserialize("[]", JsonElementCollectionSourceGenerationContext.Default.JsonElementArray) ?? throw new Exception();
else {
} else {
string value;
string[] segments;
List<string> lines = [];
@ -283,12 +298,13 @@ internal static partial class Helper20250219 {
} else {
for (int c = 0; c < segments.Length; c++) {
value = segments[c].Replace("\\", "\\\\").Replace("\"", "\\\"");
if (string.IsNullOrEmpty(value))
if (string.IsNullOrEmpty(value)) {
_ = stringBuilder.Append('"').Append(processDataStandardFormat.Columns[c]).Append("\":").Append(value).Append("null,");
else if (value.All(char.IsDigit))
} else if (value.All(char.IsDigit)) {
_ = stringBuilder.Append('"').Append(processDataStandardFormat.Columns[c]).Append("\":").Append(value).Append(',');
else
} else {
_ = stringBuilder.Append('"').Append(processDataStandardFormat.Columns[c]).Append("\":\"").Append(value).Append("\",");
}
}
}
_ = stringBuilder.Remove(stringBuilder.Length - 1, 1);
@ -323,9 +339,9 @@ internal static partial class Helper20250219 {
}
for (int c = 0; c < processDataStandardFormatMapping.ColumnIndices.Count; c++) {
column = processDataStandardFormatMapping.ColumnIndices[c];
if (column == -1)
if (column == -1) {
value = processDataStandardFormatMapping.OldColumnNames[c];
else {
} else {
jsonProperty = jsonProperties[column];
value = jsonProperty.Value.ToString();
}
@ -342,8 +358,9 @@ internal static partial class Helper20250219 {
private static void Write(ILogger<Worker> logger, FileInfo fileInfo, ProcessDataStandardFormat processDataStandardFormat) {
List<string> results = [];
if (processDataStandardFormat.Sequence is null)
if (processDataStandardFormat.Sequence is null) {
throw new NullReferenceException(nameof(processDataStandardFormat.Sequence));
}
string endOffset = "E#######T";
string dataOffset = "D#######T";
string headerOffset = "H#######T";

View File

@ -1,8 +1,7 @@
using Microsoft.Extensions.Logging;
using System.Collections.ObjectModel;
using System.Text.Json;
using Microsoft.Extensions.Logging;
namespace File_Folder_Helper.ADO2025.PI5;
internal static partial class Helper20250228 {
@ -15,18 +14,20 @@ internal static partial class Helper20250228 {
string headerB = args[4].Replace('_', ' ');
string sourceDirectory = Path.GetFullPath(args[0]);
string[] files = Directory.GetFiles(sourceDirectory, searchPattern, SearchOption.AllDirectories);
if (files.Length != 1)
if (files.Length != 1) {
logger.LogWarning("<{files}>(s)", files.Length);
else
} else {
PostgresDumpToJson(logger, headerA, headerB, files[0]);
}
}
private static void PostgresDumpToJson(ILogger<Worker> logger, string headerA, string headerB, string file) {
ReadOnlyCollection<Record> records = GetRecords(headerA, headerB, file);
if (records.Count > 0)
if (records.Count > 0) {
WriteFile(file, records);
else
} else {
logger.LogWarning("<{records}>(s)", records.Count);
}
}
private static ReadOnlyCollection<Record> GetRecords(string headerA, string headerB, string file) {
@ -46,32 +47,38 @@ internal static partial class Helper20250228 {
line = lines[i];
if (tableName is null) {
segmentsA = line.Split(headerA);
if (segmentsA.Length != 2)
if (segmentsA.Length != 2) {
continue;
}
segmentsB = segmentsA[1].Split(headerB);
if (segmentsB.Length != 2)
if (segmentsB.Length != 2) {
continue;
}
segmentsC = segmentsB[0].Split('(');
if (segmentsC.Length != 2)
if (segmentsC.Length != 2) {
continue;
}
segmentsD = segmentsC[1].Split(')');
if (segmentsD.Length != 2)
if (segmentsD.Length != 2) {
continue;
}
columns = segmentsD[0].Split(',').Select(l => l.Trim(' ').Trim('"')).ToArray().AsReadOnly();
if (columns.Count == 0)
if (columns.Count == 0) {
continue;
}
segmentsE = segmentsB[0].Split(' ');
tableName = segmentsE[0];
} else if (columns is null)
} else if (columns is null) {
break;
else {
} else {
rows = [];
for (int j = i + 1; j < lines.Length; j++) {
i = j;
segmentsF = lines[j].Split('\t');
if (segmentsF.Length != columns.Count) {
if (rows.Count > 0)
if (rows.Count > 0) {
results.Add(new(TableName: tableName, Columns: columns, Rows: rows.AsReadOnly()));
}
break;
}
rows.Add(segmentsF);
@ -93,10 +100,11 @@ internal static partial class Helper20250228 {
foreach (string[] row in record.Rows) {
keyValuePairs.Clear();
for (int i = 0; i < row.Length; i++) {
if (row[i] == "\\N")
if (row[i] == "\\N") {
keyValuePairs.Add(record.Columns[i], null);
else
} else {
keyValuePairs.Add(record.Columns[i], row[i]);
}
}
#pragma warning disable IL3050, IL2026
json = JsonSerializer.Serialize(keyValuePairs);

View File

@ -1,6 +1,5 @@
using System.Collections.ObjectModel;
using Microsoft.Extensions.Logging;
using System.Collections.ObjectModel;
namespace File_Folder_Helper.ADO2025.PI5;
@ -14,23 +13,25 @@ internal static partial class Helper20250301 {
string sourceDirectory = Path.GetFullPath(args[0]);
string workingDirectory = Path.GetFullPath(args[4]);
string[] files = Directory.GetFiles(sourceDirectory, searchPattern, SearchOption.AllDirectories);
if (files.Length == 0)
if (files.Length == 0) {
logger.LogWarning("<{files}>(s)", files.Length);
else
} else {
PocketBaseImportWithDeno(logger, split, workingDirectory, scriptName, directory, files);
}
}
private static void PocketBaseImportWithDeno(ILogger<Worker> logger, char split, string workingDirectory, string scriptName, string directory, string[] files) {
string checkFile = Path.Combine(workingDirectory, scriptName);
if (!File.Exists(checkFile))
if (!File.Exists(checkFile)) {
logger.LogWarning("<{checkFile}> doesn't exist!", checkFile);
else {
} else {
ReadOnlyCollection<string> fileNames = CopyFiles(split, workingDirectory, directory, files);
if (fileNames.Count == 0)
if (fileNames.Count == 0) {
logger.LogWarning("<{fileNames}>(s)", fileNames.Count);
else {
foreach (string fileName in fileNames)
} else {
foreach (string fileName in fileNames) {
logger.LogInformation("deno run --unstable --allow-read --allow-env --allow-net {scriptName} --id=true --input={fileName}", scriptName, fileName);
}
}
}
}
@ -40,13 +41,15 @@ internal static partial class Helper20250301 {
string fileName;
string checkFile;
string checkDirectory = Path.Combine(workingDirectory, directory);
if (!Directory.Exists(checkDirectory))
if (!Directory.Exists(checkDirectory)) {
_ = Directory.CreateDirectory(checkDirectory);
}
foreach (string file in files) {
fileName = Path.GetFileName(file).Split(split)[^1];
checkFile = Path.Combine(checkDirectory, fileName);
if (File.Exists(checkFile))
if (File.Exists(checkFile)) {
File.Delete(checkFile);
}
File.Copy(file, checkFile);
results.Add(fileName);
}

View File

@ -1,10 +1,8 @@
using File_Folder_Helper.Models;
using Microsoft.Extensions.Logging;
using System.Collections.ObjectModel;
using System.Text.Json;
using File_Folder_Helper.Models;
using Microsoft.Extensions.Logging;
namespace File_Folder_Helper.ADO2025.PI5;
internal static partial class Helper20250305 {
@ -28,14 +26,15 @@ internal static partial class Helper20250305 {
#if ShellProgressBar
progressBar.Tick();
#endif
if (record.TotalSeconds is null)
if (record.TotalSeconds is null) {
Download(record);
else if (record.TotalSeconds.Value == 0)
} else if (record.TotalSeconds.Value == 0) {
logger.LogInformation("Different lengths");
else if (record.TotalSeconds.Value > 0)
} else if (record.TotalSeconds.Value > 0) {
logger.LogInformation("Overwrite remote (https)");
else
} else {
logger.LogInformation("Overwrite local");
}
}
#if ShellProgressBar
progressBar.Dispose();
@ -50,18 +49,21 @@ internal static partial class Helper20250305 {
NginxFileSystem nginxFileSystem;
ReadOnlyCollection<Record> records;
string checkDirectory = $"{compareDirectory}\\{string.Join('\\', directoryNames)}";
if (!Directory.Exists(checkDirectory))
if (!Directory.Exists(checkDirectory)) {
_ = Directory.CreateDirectory(checkDirectory);
}
for (int i = 0; i < nginxFileSystems.Count; i++) {
nginxFileSystem = NginxFileSystem.Get(format, timeZoneInfo, uri, nginxFileSystems[i]);
if (nginxFileSystem.Type == "file") {
Record? record = CompareFile(host, directoryNames, compareDirectory, nginxFileSystem);
if (record is not null)
if (record is not null) {
results.Add(record);
}
} else {
records = CompareDirectory(format, timeZoneInfo, host, directoryNames, compareDirectory, nginxFileSystem);
foreach (Record record in records)
foreach (Record record in records) {
results.Add(record);
}
}
}
}
@ -72,18 +74,18 @@ internal static partial class Helper20250305 {
List<NginxFileSystem>? results;
Task<HttpResponseMessage> taskHttpResponseMessage = _HttpClient.GetAsync(uri);
taskHttpResponseMessage.Wait();
if (!taskHttpResponseMessage.Result.IsSuccessStatusCode)
if (!taskHttpResponseMessage.Result.IsSuccessStatusCode) {
results = null;
else {
} else {
Task<string> taskString = taskHttpResponseMessage.Result.Content.ReadAsStringAsync();
taskString.Wait();
if (taskString.Result.StartsWith('<'))
if (taskString.Result.StartsWith('<')) {
results = null;
else {
} else {
NginxFileSystem[]? nginxFileSystems = JsonSerializer.Deserialize(taskString.Result, NginxFileSystemCollectionSourceGenerationContext.Default.NginxFileSystemArray);
if (nginxFileSystems is null)
if (nginxFileSystems is null) {
results = null;
else {
} else {
results = [];
NginxFileSystem nginxFileSystem;
for (int i = 0; i < nginxFileSystems.Length; i++) {
@ -98,21 +100,22 @@ internal static partial class Helper20250305 {
private static Record? CompareFile(string host, ReadOnlyCollection<string> directoryNames, string compareDirectory, NginxFileSystem nginxFileSystem) {
Record? result;
if (nginxFileSystem.LastModified is null || nginxFileSystem.Length is null)
if (nginxFileSystem.LastModified is null || nginxFileSystem.Length is null) {
result = null;
else {
} else {
Uri uri = new($"https://{host}/{string.Join('/', directoryNames)}/{nginxFileSystem.Name}");
FileInfo fileInfo = new($"{compareDirectory}\\{string.Join('\\', directoryNames)}\\{nginxFileSystem.Name}");
if (!fileInfo.Exists)
if (!fileInfo.Exists) {
result = new(URI: uri, Path: fileInfo.FullName, LastModified: nginxFileSystem.LastModified.Value, TotalSeconds: null);
else {
} else {
int totalSeconds = (int)new TimeSpan(fileInfo.LastWriteTime.Ticks - nginxFileSystem.LastModified.Value.Ticks).TotalSeconds;
if (totalSeconds is not < 2 or not > -2)
if (totalSeconds is not < 2 or not > -2) {
result = new(URI: uri, Path: fileInfo.FullName, LastModified: nginxFileSystem.LastModified.Value, TotalSeconds: totalSeconds);
else if (fileInfo.Length != nginxFileSystem.Length.Value)
} else if (fileInfo.Length != nginxFileSystem.Length.Value) {
result = new(URI: uri, Path: fileInfo.FullName, LastModified: nginxFileSystem.LastModified.Value, TotalSeconds: 0);
else
} else {
result = null;
}
}
}
return result;

View File

@ -8,23 +8,24 @@ internal static partial class Helper20250306 {
string searchPattern = args[2];
string sourceDirectory = Path.GetFullPath(args[0]);
string[] files = Directory.GetFiles(sourceDirectory, searchPattern, SearchOption.TopDirectoryOnly);
if (files.Length != 1)
if (files.Length != 1) {
logger.LogWarning("<{files}>(s)", files.Length);
else
} else {
ProcessDataStandardFormatToJson(logger, files[0]);
}
}
private static void ProcessDataStandardFormatToJson(ILogger<Worker> logger, string file) {
string[] lines = File.ReadAllLines(file);
int? columnTitlesLine = GetProcessDataStandardFormatColumnTitlesLine(lines);
if (columnTitlesLine is null)
if (columnTitlesLine is null) {
logger.LogWarning("<{columnTitlesLine}> is null", nameof(columnTitlesLine));
else {
} else {
string? text = ProcessDataStandardFormatToLastDataLine(lines, columnTitlesLine.Value);
File.WriteAllText(Path.Combine(".vscode", "helper", ".lbl"), text);
if (lines.Length < columnTitlesLine.Value + 1)
if (lines.Length < columnTitlesLine.Value + 1) {
logger.LogWarning("<{lines}>(s)", lines.Length);
else {
} else {
string json = ProcessDataStandardFormatToJson(columnTitlesLine.Value, [], lines);
File.WriteAllText(Path.Combine(".vscode", "helper", ".json"), json);
}
@ -35,8 +36,9 @@ internal static partial class Helper20250306 {
int? result = null;
bool foundEndOfFile = false;
for (int i = 0; i < lines.Length; i++) {
if (lines[i] == "EOF")
if (lines[i] == "EOF") {
foundEndOfFile = true;
}
if (foundEndOfFile && lines[i].StartsWith("END_OFFSET") && i + 3 < lines.Length) {
result = i + 2;
break;
@ -62,14 +64,16 @@ internal static partial class Helper20250306 {
string line;
string value;
string[] segments;
if (columns.Length == 0)
if (columns.Length == 0) {
columns = lines[columnTitlesLine].Trim().Split('|');
}
int columnsLength = columns.Length - 2;
for (int i = columnTitlesLine + 1; i < lines.Length; i++) {
line = "{";
segments = lines[i].Trim().Split('|');
if (segments.Length != columnsLength)
if (segments.Length != columnsLength) {
continue;
}
for (int c = 1; c < segments.Length; c++) {
value = segments[c].Replace("\\", "\\\\").Replace("\"", "\\\"");
line += '"' + columns[c].Trim('"') + '"' + ':' + '"' + value + '"' + ',';

View File

@ -11,16 +11,17 @@ internal static partial class Helper20250315 {
string sourceDirectory = Path.GetFullPath(args[0]);
if (searchPatterns.Length == 1) {
string[] files = Directory.GetFiles(sourceDirectory, searchPatterns[0], SearchOption.AllDirectories);
if (files.Length == 0)
if (files.Length == 0) {
logger.LogWarning("<{files}>(s)", files.Length);
else {
} else {
string directoryName;
string[] directories;
foreach (string file in files) {
directoryName = Path.GetDirectoryName(file) ?? throw new Exception();
directories = Directory.GetDirectories(directoryName, "*", SearchOption.TopDirectoryOnly);
foreach (string directory in directories)
foreach (string directory in directories) {
HelperDeleteEmptyDirectories.DeleteEmptyDirectories(logger, directory);
}
}
}
} else {
@ -29,13 +30,14 @@ internal static partial class Helper20250315 {
HelperDeleteEmptyDirectories.DeleteEmptyDirectories(logger, sourceDirectory);
foreach (string searchPattern in searchPatterns) {
files = Directory.GetFiles(sourceDirectory, searchPattern, SearchOption.AllDirectories);
if (files.Length == 0)
if (files.Length == 0) {
logger.LogWarning("<{files}>(s)", files.Length);
else {
} else {
foreach (string file in files) {
checkFile = $"{file}.json";
if (File.Exists(checkFile))
if (File.Exists(checkFile)) {
continue;
}
File.Move(file, checkFile);
}
}

View File

@ -1,11 +1,10 @@
using Microsoft.Extensions.Logging;
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.Text.Json;
using System.Text.Json.Serialization;
using System.Text.RegularExpressions;
using Microsoft.Extensions.Logging;
namespace File_Folder_Helper.ADO2025.PI5;
internal static partial class Helper20250320 {
@ -40,7 +39,6 @@ internal static partial class Helper20250320 {
string result = JsonSerializer.Serialize(this, MethodCollectionCommonSourceGenerationContext.Default.Method);
return result;
}
}
[JsonSourceGenerationOptions(WriteIndented = true)]
@ -63,7 +61,6 @@ internal static partial class Helper20250320 {
string result = JsonSerializer.Serialize(this, MethodCollectionCommonSourceGenerationContext.Default.Method);
return result;
}
}
[JsonSourceGenerationOptions(WriteIndented = true)]
@ -102,8 +99,9 @@ internal static partial class Helper20250320 {
string[] cSharpFiles = Directory.GetFiles(repositoryDirectory, "*.cs", SearchOption.AllDirectories);
ReadOnlyCollection<string> gitOthersModifiedAndDeletedExcludingStandardFiles = logOnly ? new(cSharpFiles) : Helpers.HelperGit.GetOthersModifiedAndDeletedExcludingStandardFiles(repositoryDirectory, usePathCombine, cancellationToken);
foreach (string cSharpFile in cSharpFiles) {
if (!gitOthersModifiedAndDeletedExcludingStandardFiles.Contains(cSharpFile))
if (!gitOthersModifiedAndDeletedExcludingStandardFiles.Contains(cSharpFile)) {
continue;
}
for (int i = 0; i < 10; i++) {
lines = File.ReadAllLines(cSharpFile);
check = SortFile(logger, logOnly, scopeSpaces, cSharpFile, lines);
@ -111,34 +109,38 @@ internal static partial class Helper20250320 {
Thread.Sleep(500);
changed.Add($"{i + 1:00}) {cSharpFile}");
}
if (logOnly || !check)
if (logOnly || !check) {
break;
}
}
}
if (changed.Count == 0)
if (changed.Count == 0) {
logger.LogInformation("No changes :)");
else {
} else {
changed.Reverse();
foreach (string c in changed)
foreach (string c in changed) {
logger.LogInformation(c);
}
}
}
private static bool SortFile(ILogger<Worker> logger, bool logOnly, int scopeSpaces, string cSharpFile, string[] lines) {
bool result;
ReadOnlyCollection<Method> methods = GetMethods(logger, scopeSpaces, cSharpFile, lines);
if (methods.Count == 0)
if (methods.Count == 0) {
result = false;
else if (methods.Any(l => l.EndLine is null))
} else if (methods.Any(l => l.EndLine is null)) {
result = false;
else if (logOnly) {
foreach (Method method in methods)
} else if (logOnly) {
foreach (Method method in methods) {
logger.LogInformation("{cSharpFile} - {Name} has {lines} line(s)", cSharpFile, method.Match.Name, (method.EndLine is null ? 999999 : method.EndLine.Value - method.StartLine).ToString("000000"));
}
result = false;
} else {
ReadOnlyCollection<Method> sortedMethods = GetSortedMethods(methods);
if (Debugger.IsAttached)
if (Debugger.IsAttached) {
File.WriteAllText(Path.Combine(".vscode", "helper", ".json"), JsonSerializer.Serialize(sortedMethods.ToArray(), MethodCollectionCommonSourceGenerationContext.Default.MethodArray));
}
ReadOnlyCollection<MethodWith> collection = GetCollection(logger, lines, sortedMethods);
result = WriteAllLines(cSharpFile, lines, collection);
}
@ -166,18 +168,23 @@ internal static partial class Helper20250320 {
System.Text.RegularExpressions.Match regularExpressionsMatch;
for (int i = 0; i < lines.Length; i++) {
check = GetNumberOfStartSpaces(lines, i);
if (check != scopeSpaces)
if (check != scopeSpaces) {
continue;
}
line = lines[i].Trim();
if (string.IsNullOrEmpty(line))
if (string.IsNullOrEmpty(line)) {
continue;
if (line.Length < 5)
}
if (line.Length < 5) {
continue;
if (line.EndsWith(','))
}
if (line.EndsWith(',')) {
continue;
}
regularExpressionsMatch = CSharpMethodLine().Match(line);
if (!regularExpressionsMatch.Success)
if (!regularExpressionsMatch.Success) {
continue;
}
match = new(Async: regularExpressionsMatch.Groups[_Async].Value,
Name: regularExpressionsMatch.Groups[_Name].Value,
Parameters: regularExpressionsMatch.Groups[_Parameters].Value,
@ -194,50 +201,61 @@ internal static partial class Helper20250320 {
Not: $"!{match.Name}(",
Wrap: $"({match.Name}(");
logger.LogInformation("{line} {a} // {results}", line.Split(" =>")[0], "{ }", results.Count);
if (string.IsNullOrEmpty(match.Name))
if (string.IsNullOrEmpty(match.Name)) {
continue;
}
blocks = 0;
startLine = GetStartLine(lines, i);
if (!lines[startLine].StartsWith("#pragma") && !lines[startLine].StartsWith("#nullable"))
if (!lines[startLine].StartsWith("#pragma") && !lines[startLine].StartsWith("#nullable")) {
firstLine = lines[startLine].Trim();
else
} else {
firstLine = lines[startLine + 1].Trim();
}
isLinq = !lines[i + 1].StartsWith("#pragma") && !lines[i + 1].StartsWith("#nullable") && lines[i].Trim()[^1] != '{' && lines[i + 1].Trim() != "{";
if (isLinq)
if (isLinq) {
blocks++;
}
endLine = null;
if (lines[i].Trim()[^1] == '{')
if (lines[i].Trim()[^1] == '{') {
blocks++;
}
for (int j = i + 1; j < lines.Length; j++) {
innerLine = lines[j].Trim();
if (innerLine.StartsWith("#pragma") || innerLine.StartsWith("#nullable"))
if (innerLine.StartsWith("#pragma") || innerLine.StartsWith("#nullable")) {
continue;
}
if (isLinq && string.IsNullOrEmpty(innerLine)) {
if (line.EndsWith(';'))
if (line.EndsWith(';')) {
blocks--;
}
}
blocks += GetLineBlockCount(innerLine, isLinq);
if (blocks != 0)
if (blocks != 0) {
continue;
}
endLine = j;
if (lines.Length > j + 1 && string.IsNullOrEmpty(lines[j + 1].Trim()))
if (lines.Length > j + 1 && string.IsNullOrEmpty(lines[j + 1].Trim())) {
endLine++;
if (j > lines.Length - 2)
}
if (j > lines.Length - 2) {
throw new Exception();
}
break;
}
referenceToLineNumbers = GetReferenceToLineNumbers(lines: lines, start: 0, end: lines.Length, i: i, search: search, parameters: parameters);
if (referenceToLineNumbers.Count == 0) {
lineSegmentFirst = line.Split(match.Name)[0];
if (!lines[i - 1].Trim().StartsWith("[Obsolete")) {
if (lineSegmentFirst.StartsWith("private"))
if (lineSegmentFirst.StartsWith("private")) {
logger.LogWarning("// <{cSharpFileName}> {name} with {parameters} parameter(s) <{line}>", Path.GetFileName(cSharpFile), match.Name, parameters, lineSegmentFirst);
else
} else {
logger.LogInformation("// <{cSharpFileName}> {name} with {parameters} parameter(s) <{line}>", Path.GetFileName(cSharpFile), match.Name, parameters, lineSegmentFirst);
}
}
}
if (referenceToLineNumbers.Count == 0)
if (referenceToLineNumbers.Count == 0) {
referenceToLineNumbers.Add(-1);
}
logger.LogInformation("{line} {a} // {results} ~~~ {startLine} => {firstUsedLine}", line.Split(" =>")[0], "{ }", results.Count, startLine, referenceToLineNumbers.First());
method = new(EndLine: endLine,
FirstLine: firstLine,
@ -257,8 +275,9 @@ internal static partial class Helper20250320 {
private static int GetNumberOfStartSpaces(string[] lines, int i) {
int result = 0;
foreach (char @char in lines[i]) {
if (@char != ' ')
if (@char != ' ') {
break;
}
result += 1;
}
return result;
@ -289,8 +308,9 @@ internal static partial class Helper20250320 {
System.Text.RegularExpressions.Match[] matches = parameterRegex.Matches($"{match.Parameters},").ToArray();
try {
foreach (System.Text.RegularExpressions.Match m in matches) {
if (!m.Success)
if (!m.Success) {
continue;
}
value = m.Value.Trim()[..^1];
segments = value.Split(' ');
results.Add(segments[^1], value);
@ -300,8 +320,9 @@ internal static partial class Helper20250320 {
System.Text.RegularExpressions.Match m;
for (int i = 0; i < matches.Length; i++) {
m = matches[i];
if (!m.Success)
if (!m.Success) {
continue;
}
results.Add(i.ToString(), i.ToString());
}
}
@ -313,8 +334,9 @@ internal static partial class Helper20250320 {
string line;
for (int j = i - 1; j > -1; j--) {
line = lines[j].Trim();
if (!line.StartsWith('[') && !line.StartsWith('#') && !line.StartsWith("/// "))
if (!line.StartsWith('[') && !line.StartsWith('#') && !line.StartsWith("/// ")) {
break;
}
result--;
}
return result;
@ -324,16 +346,17 @@ internal static partial class Helper20250320 {
int result = 0;
bool ignore = false;
for (int i = 0; i < line.Length; i++) {
if (line[i] == '\'')
if (line[i] == '\'') {
i++;
else if (!isLinq && !ignore && line[i] == '{')
} else if (!isLinq && !ignore && line[i] == '{') {
result++;
else if (!isLinq && !ignore && line[i] == '}')
} else if (!isLinq && !ignore && line[i] == '}') {
result--;
else if (isLinq && !ignore && line[i] == ';')
} else if (isLinq && !ignore && line[i] == ';') {
result--;
else if (i > 0 && line[i] == '"' && line[i - 1] != '\\')
} else if (i > 0 && line[i] == '"' && line[i - 1] != '\\') {
ignore = !ignore;
}
}
return result;
}
@ -344,8 +367,9 @@ internal static partial class Helper20250320 {
string[] afterSegments;
string lastSegmentBeforeDot;
for (int j = start; j < end; j++) {
if (j == i)
if (j == i) {
continue;
}
segments = lines[j].Split(search.Name);
if (segments.Length == 1) {
segments = lines[j].Split(search.Not);
@ -354,23 +378,26 @@ internal static partial class Helper20250320 {
if (segments.Length == 1) {
if (!lines[j].EndsWith(search.Delegate)) {
segments = lines[j].Split(search.Constructor);
if (segments.Length == 1)
if (segments.Length == 1) {
continue;
}
}
}
}
}
if (lines[j].EndsWith(search.Delegate))
if (lines[j].EndsWith(search.Delegate)) {
results.Add(j);
else {
} else {
lastSegmentBeforeDot = segments[^1].Split(").")[0];
if (parameters.Count == 0) {
if (lastSegmentBeforeDot.Contains(','))
if (lastSegmentBeforeDot.Contains(',')) {
continue;
}
} else {
afterSegments = lastSegmentBeforeDot.Split(',');
if (afterSegments.Length != parameters.Count)
if (afterSegments.Length != parameters.Count) {
continue;
}
}
results.Add(j);
}
@ -383,10 +410,12 @@ internal static partial class Helper20250320 {
List<Method> check = sortedMethods.ToList();
foreach (Method method in sortedMethods) {
logger.LogInformation($"{method.Match.Name} => {method.Parameters.Count}");
if (method.EndLine is null)
if (method.EndLine is null) {
continue;
if (!check.Remove(method))
}
if (!check.Remove(method)) {
continue;
}
MethodWith methodWith = GetMethodWith(lines, sortedMethods, check, method, method.EndLine.Value);
results.Add(methodWith);
}
@ -399,27 +428,32 @@ internal static partial class Helper20250320 {
MethodWith[] sortedReferences;
Dictionary<int, MethodWith> references = [];
foreach (Method m in methods) {
if (m.EndLine is null)
if (m.EndLine is null) {
continue;
if (m == method)
}
if (m == method) {
continue;
}
referenceToLineNumbers = GetReferenceToLineNumbers(lines: lines, start: method.StartLine, end: methodEndLineValue, i: -1, search: m.Search, parameters: m.Parameters);
if (referenceToLineNumbers.Count > 0) {
if (!check.Remove(m))
if (!check.Remove(m)) {
continue;
}
foreach (int i in referenceToLineNumbers) {
if (references.ContainsKey(i))
if (references.ContainsKey(i)) {
continue;
}
methodWith = GetMethodWith(lines, methods, check, m, m.EndLine.Value);
references.Add(i, methodWith);
break;
}
}
}
if (references.Count < 2)
if (references.Count < 2) {
sortedReferences = (from l in references select l.Value).ToArray();
else
} else {
sortedReferences = (from l in references orderby l.Key select l.Value).ToArray();
}
methodWith = new(EndLine: method.EndLine,
FirstLine: method.FirstLine,
Line: method.Line,
@ -435,29 +469,33 @@ internal static partial class Helper20250320 {
private static bool WriteAllLines(string cSharpFile, string[] lines, ReadOnlyCollection<MethodWith> collection) {
bool result;
if (Debugger.IsAttached)
if (Debugger.IsAttached) {
WriteDebug(collection);
}
List<string> results = [];
ReadOnlyCollection<int> methodLines = GetMethodLines(collection);
int maxMethodLines = methodLines.Max();
for (int i = 0; i < maxMethodLines; i++) {
if (methodLines.Contains(i))
if (methodLines.Contains(i)) {
continue;
}
results.Add(lines[i]);
}
List<bool> nests = [true];
foreach (MethodWith methodWith in collection) {
if (methodWith.EndLine is null)
if (methodWith.EndLine is null) {
continue;
}
AppendLines(results, nests, lines, methodWith, methodWith.EndLine.Value);
}
for (int i = maxMethodLines + 1; i < lines.Length; i++)
for (int i = maxMethodLines + 1; i < lines.Length; i++) {
results.Add(lines[i]);
}
string text = File.ReadAllText(cSharpFile);
string join = string.Join(Environment.NewLine, results);
if (join == text)
if (join == text) {
result = false;
else {
} else {
result = true;
File.WriteAllText(cSharpFile, join);
}
@ -467,16 +505,18 @@ internal static partial class Helper20250320 {
private static void WriteDebug(ReadOnlyCollection<MethodWith> collection) {
List<string> results = [];
List<bool> nests = [true];
foreach (MethodWith methodWith in collection)
foreach (MethodWith methodWith in collection) {
AppendLines(results, nests, methodWith);
}
File.WriteAllText(Path.Combine(".vscode", "helper", ".md"), string.Join(Environment.NewLine, results));
}
private static void AppendLines(List<string> results, List<bool> nests, MethodWith methodWith) {
nests.Add(true);
results.Add($" - {new string('#', nests.Count)} {methodWith.Match.Name} => {methodWith.Parameters.Count}");
foreach (MethodWith m in methodWith.References)
foreach (MethodWith m in methodWith.References) {
AppendLines(results, nests, m);
}
nests.RemoveAt(nests.Count - 1);
}
@ -484,23 +524,27 @@ internal static partial class Helper20250320 {
List<int> results = [];
List<bool> nests = [true];
foreach (MethodWith methodWith in collection) {
if (methodWith.EndLine is null)
if (methodWith.EndLine is null) {
continue;
}
AppendLineNumbers(results, nests, methodWith, methodWith.EndLine.Value);
}
int[] distinct = results.Distinct().ToArray();
if (distinct.Length != results.Count)
if (distinct.Length != results.Count) {
throw new Exception();
}
return new(results);
}
private static void AppendLineNumbers(List<int> results, List<bool> nests, MethodWith methodWith, int methodWithEndLineValue) {
nests.Add(true);
for (int i = methodWith.StartLine; i < methodWithEndLineValue + 1; i++)
for (int i = methodWith.StartLine; i < methodWithEndLineValue + 1; i++) {
results.Add(i);
}
foreach (MethodWith m in methodWith.References) {
if (m.EndLine is null)
if (m.EndLine is null) {
continue;
}
AppendLineNumbers(results, nests, m, m.EndLine.Value);
}
nests.RemoveAt(nests.Count - 1);
@ -508,11 +552,13 @@ internal static partial class Helper20250320 {
private static void AppendLines(List<string> results, List<bool> nests, string[] lines, MethodWith methodWith, int methodWithEndLineValue) {
nests.Add(true);
for (int i = methodWith.StartLine; i < methodWithEndLineValue + 1; i++)
for (int i = methodWith.StartLine; i < methodWithEndLineValue + 1; i++) {
results.Add(lines[i]);
}
foreach (MethodWith m in methodWith.References) {
if (m.EndLine is null)
if (m.EndLine is null) {
continue;
}
AppendLines(results, nests, lines, m, m.EndLine.Value);
}
nests.RemoveAt(nests.Count - 1);

View File

@ -1,8 +1,6 @@
using System.Collections.ObjectModel;
using File_Folder_Helper.Helpers;
using Microsoft.Extensions.Logging;
using System.Collections.ObjectModel;
namespace File_Folder_Helper.ADO2025.PI5;
@ -21,14 +19,15 @@ internal static partial class Helper20250321 {
bool check = searchPattern.Split('.').Length == 3;
ReadOnlyCollection<ThreeDeep> collection = ThreeDeep.GetCollection(files);
foreach (ThreeDeep threeDeep in collection) {
if (!json && check)
if (!json && check) {
fileNameWithoutExtension = threeDeep.DirectoryName;
else if (!json && !check)
} else if (!json && !check) {
fileNameWithoutExtension = threeDeep.FileNameWithoutExtension;
else if (json)
} else if (json) {
fileNameWithoutExtension = Path.GetFileNameWithoutExtension(threeDeep.FileNameWithoutExtension);
else
} else {
throw new NotImplementedException();
}
directory = $"{fileNameWithoutExtension[^1]}{fileNameWithoutExtension[^3..][..2]}";
if (json || (!json && !check)) {
record = new(Directory: Path.Combine(sourceDirectory, "new-a", directory),
@ -38,13 +37,13 @@ internal static partial class Helper20250321 {
record = new(Directory: Path.Combine(sourceDirectory, "new-b", directory, threeDeep.DirectoryName),
File: $"{threeDeep.FileNameWithoutExtension}{threeDeep.Extension}",
ThreeDeep: threeDeep);
} else
} else {
throw new NotImplementedException();
}
results.Add(record);
}
return results.AsReadOnly();
}
}
private record ThreeDeep(string Extension,
@ -83,17 +82,19 @@ internal static partial class Helper20250321 {
internal static void MoveToLast(ILogger<Worker> logger, List<string> args) {
string[] searchPatterns = args[2].Split('~');
string sourceDirectory = Path.GetFullPath(args[0]);
if (searchPatterns.Length == 1)
if (searchPatterns.Length == 1) {
logger.LogInformation("No code for just one!");
else {
} else {
HelperDeleteEmptyDirectories.DeleteEmptyDirectories(logger, sourceDirectory);
ReadOnlyCollection<Record> collection = GetCollection(logger, searchPatterns, sourceDirectory);
if (collection.Count != 0)
if (collection.Count != 0) {
UseCollection(collection);
else
} else {
logger.LogInformation("No files!");
if (collection.Count != 0)
}
if (collection.Count != 0) {
HelperDeleteEmptyDirectories.DeleteEmptyDirectories(logger, sourceDirectory);
}
}
}
@ -102,9 +103,9 @@ internal static partial class Helper20250321 {
List<Record> results = [];
foreach (string searchPattern in searchPatterns) {
files = Directory.GetFiles(sourceDirectory, searchPattern, SearchOption.AllDirectories);
if (files.Length == 0)
if (files.Length == 0) {
logger.LogWarning("<{files}>(s)", files.Length);
else {
} else {
ReadOnlyCollection<Record> collection = Record.GetCollection(sourceDirectory, searchPattern, files);
results.AddRange(collection);
}
@ -117,19 +118,22 @@ internal static partial class Helper20250321 {
string checkFile;
List<string> distinct = [];
foreach (Record record in collection) {
if (distinct.Contains(record.Directory))
if (distinct.Contains(record.Directory)) {
continue;
}
distinct.Add(record.Directory);
}
foreach (string directory in distinct) {
if (Directory.Exists(directory))
if (Directory.Exists(directory)) {
continue;
}
_ = Directory.CreateDirectory(directory);
}
foreach (Record record in collection) {
checkFile = Path.Combine(record.Directory, record.File);
if (File.Exists(checkFile))
if (File.Exists(checkFile)) {
continue;
}
fullPath = ThreeDeep.GetFullPath(record.ThreeDeep);
File.Move(fullPath, checkFile);
}

View File

@ -1,8 +1,7 @@
using Microsoft.Extensions.Logging;
using System.Text.Json;
using System.Text.Json.Serialization;
using Microsoft.Extensions.Logging;
namespace File_Folder_Helper.ADO2025.PI5;
internal static partial class Helper20250404 {
@ -128,10 +127,11 @@ internal static partial class Helper20250404 {
ParseMetrics(logger, fileName, url);
string sourceDirectory = Path.GetFullPath(args[0]);
string[] files = Directory.GetFiles(sourceDirectory, searchPattern, SearchOption.AllDirectories);
if (files.Length == 0)
if (files.Length == 0) {
logger.LogWarning("<{files}>(s)", files.Length);
else
} else {
KumaToGatus(files);
}
}
private static void ParseMetrics(ILogger<Worker> logger, string fileName, string url) {
@ -174,12 +174,14 @@ internal static partial class Helper20250404 {
string checkFile;
foreach (string file in files) {
checkFile = file.ToLower().Replace('_', '-');
if (checkFile != file)
if (checkFile != file) {
File.Move(file, checkFile);
}
json = File.ReadAllText(checkFile);
kuma = JsonSerializer.Deserialize(json, KumaCommonSourceGenerationContext.Default.Kuma);
if (kuma is null)
if (kuma is null) {
continue;
}
WriteGatus(checkFile, kuma);
}
}
@ -193,8 +195,9 @@ internal static partial class Helper20250404 {
];
string[] segments;
foreach (MonitorList monitorList in kuma.MonitorList) {
if (monitorList.Type is not "http" and not "postgres")
if (monitorList.Type is not "http" and not "postgres") {
continue;
}
results.Add($" - name: {monitorList.Name}");
results.Add($" group: {monitorList.PathName.Split(' ')[0]}");
results.Add($" enabled: {monitorList.Active.ToString().ToLower()}");
@ -208,19 +211,22 @@ internal static partial class Helper20250404 {
}
results.Add(" conditions:");
results.Add(" - \"[STATUS] < 300\"");
if (monitorList.Url.Contains("https"))
if (monitorList.Url.Contains("https")) {
results.Add(" - \"[CERTIFICATE_EXPIRATION] > 48h\"");
}
results.Add($" - \"[RESPONSE_TIME] < {monitorList.Timeout}\"");
} else if (monitorList.Type == "postgres") {
segments = monitorList.DatabaseConnectionString.Split('@');
if (segments.Length != 2)
if (segments.Length != 2) {
continue;
}
results.Add($" # connectionString: \"{monitorList.DatabaseConnectionString}\"");
results.Add($" url: \"tcp://{segments[1].Split('/')[0]}\"");
results.Add(" conditions:");
results.Add(" - \"[CONNECTED] == true\"");
} else
} else {
throw new NotImplementedException();
}
results.Add(" alerts:");
results.Add(" - type: email");
results.Add(" description: \"healthcheck failed\"");

View File

@ -1,12 +1,10 @@
using File_Folder_Helper.Models;
using Microsoft.Extensions.FileSystemGlobbing;
using Microsoft.Extensions.Logging;
using System.Collections.ObjectModel;
using System.Text.Json;
using System.Text.Json.Serialization;
using File_Folder_Helper.Models;
using Microsoft.Extensions.FileSystemGlobbing;
using Microsoft.Extensions.Logging;
#if ShellProgressBar
using ShellProgressBar;
#endif
@ -65,53 +63,53 @@ internal static partial class Helper20250407 {
const int rightSideOnlyIndex = 4;
const int leftSideIsNewerIndex = 1;
const int rightSideIsNewerIndex = 3;
if (string.IsNullOrEmpty(segments[leftSideOnlyIndex]))
if (string.IsNullOrEmpty(segments[leftSideOnlyIndex])) {
leftSideOnly = null;
else if (segments[leftSideOnlyIndex][0] == plus)
} else if (segments[leftSideOnlyIndex][0] == plus) {
leftSideOnly = true;
else if (segments[leftSideOnlyIndex][0] == minus)
} else if (segments[leftSideOnlyIndex][0] == minus) {
leftSideOnly = false;
else {
} else {
check = false;
leftSideOnly = null;
}
if (string.IsNullOrEmpty(segments[leftSideIsNewerIndex]))
if (string.IsNullOrEmpty(segments[leftSideIsNewerIndex])) {
leftSideIsNewer = null;
else if (segments[leftSideIsNewerIndex][0] == greaterThan)
} else if (segments[leftSideIsNewerIndex][0] == greaterThan) {
leftSideIsNewer = true;
else if (segments[leftSideIsNewerIndex][0] == lessThan)
} else if (segments[leftSideIsNewerIndex][0] == lessThan) {
leftSideIsNewer = false;
else {
} else {
check = false;
leftSideIsNewer = null;
}
if (string.IsNullOrEmpty(segments[notEqualButIndex]))
if (string.IsNullOrEmpty(segments[notEqualButIndex])) {
notEqualBut = null;
else if (segments[notEqualButIndex][0] == greaterThan)
} else if (segments[notEqualButIndex][0] == greaterThan) {
notEqualBut = true;
else if (segments[notEqualButIndex][0] == lessThan)
} else if (segments[notEqualButIndex][0] == lessThan) {
notEqualBut = false;
else {
} else {
check = false;
notEqualBut = null;
}
if (string.IsNullOrEmpty(segments[rightSideIsNewerIndex]))
if (string.IsNullOrEmpty(segments[rightSideIsNewerIndex])) {
rightSideIsNewer = null;
else if (segments[rightSideIsNewerIndex][0] == greaterThan)
} else if (segments[rightSideIsNewerIndex][0] == greaterThan) {
rightSideIsNewer = true;
else if (segments[rightSideIsNewerIndex][0] == lessThan)
} else if (segments[rightSideIsNewerIndex][0] == lessThan) {
rightSideIsNewer = false;
else {
} else {
check = false;
rightSideIsNewer = null;
}
if (string.IsNullOrEmpty(segments[rightSideOnlyIndex]))
if (string.IsNullOrEmpty(segments[rightSideOnlyIndex])) {
rightSideOnly = null;
else if (segments[rightSideOnlyIndex][0] == plus)
} else if (segments[rightSideOnlyIndex][0] == plus) {
rightSideOnly = true;
else if (segments[rightSideOnlyIndex][0] == minus)
} else if (segments[rightSideOnlyIndex][0] == minus) {
rightSideOnly = false;
else {
} else {
check = false;
rightSideOnly = null;
}
@ -160,9 +158,9 @@ internal static partial class Helper20250407 {
matcher.AddIncludePatterns(!File.Exists(includePatternsFile) ? ["*"] : File.ReadAllLines(includePatternsFile));
matcher.AddExcludePatterns(!File.Exists(excludePatternsFile) ? ["System Volume Information"] : File.ReadAllLines(excludePatternsFile));
ReadOnlyCollection<Record> rightRecords = GetRecords(rightDirectory, matcher);
if (rightRecords.Count == 0)
if (rightRecords.Count == 0) {
logger.LogInformation("No source records");
else {
} else {
string checkFile = Path.Combine(rightDirectory, fileName);
Review review = new(AreEqual: null,
LeftSideIsNewer: null,
@ -173,9 +171,9 @@ internal static partial class Helper20250407 {
RightSideOnly: null);
string json = JsonSerializer.Serialize(review, ReviewCommonSourceGenerationContext.Default.Review);
WriteAllText(checkFile, json);
if (rootUniformResourceLocators.Length == 0)
if (rootUniformResourceLocators.Length == 0) {
logger.LogInformation("No urls");
else {
} else {
string format = NginxFileSystem.GetFormat();
TimeZoneInfo timeZoneInfo = TimeZoneInfo.Local;
Sync(logger, rightDirectory, fileName, logic, rootUniformResourceLocators, rightRecords, format, timeZoneInfo);
@ -194,11 +192,13 @@ internal static partial class Helper20250407 {
ReadOnlyCollection<ReadOnlyCollection<string>> collection = Helpers.HelperDirectory.GetFilesCollection(rightDirectory, "*", "*");
foreach (ReadOnlyCollection<string> c in collection) {
foreach (string f in c) {
if (!matcher.Match(rightDirectory, f).HasMatches)
if (!matcher.Match(rightDirectory, f).HasMatches) {
continue;
}
fileInfo = new(f);
if (fileInfo.Length == 0)
if (fileInfo.Length == 0) {
continue;
}
relativePath = Path.GetRelativePath(rightDirectory, fileInfo.FullName);
record = new(RelativePath: relativePath,
Size: fileInfo.Length,
@ -211,20 +211,21 @@ internal static partial class Helper20250407 {
private static void WriteAllText(string path, string text) {
string check = !File.Exists(path) ? string.Empty : File.ReadAllText(path);
if (check != text)
if (check != text) {
File.WriteAllText(path, text);
}
}
private static void Sync(ILogger<Worker> logger, string rightDirectory, string fileName, Logic? logic, string[] rootUniformResourceLocators, ReadOnlyCollection<Record> rightRecords, string format, TimeZoneInfo timeZoneInfo) {
Review? review;
foreach (string rootUniformResourceLocator in rootUniformResourceLocators) {
if (!rootUniformResourceLocator.StartsWith("https:"))
if (!rootUniformResourceLocator.StartsWith("https:")) {
logger.LogInformation("Not supported URL <{url}>", rootUniformResourceLocator);
else {
} else {
review = GetJsonResponse(logger, fileName, rootUniformResourceLocator, format, timeZoneInfo);
if (review?.Records is null || review.Records.Length == 0)
if (review?.Records is null || review.Records.Length == 0) {
logger.LogInformation("No response records");
else {
} else {
ReadOnlyCollection<Record> leftRecords = review.Records.AsReadOnly();
Sync(logger, rightDirectory, fileName, logic, rightRecords, rootUniformResourceLocator, leftRecords);
}
@ -285,8 +286,9 @@ internal static partial class Helper20250407 {
match = nginxFileSystem.LastModified.Value;
continue;
}
if (nginxFileSystem.LastModified is null || nginxFileSystem.LastModified <= dateTime)
if (nginxFileSystem.LastModified is null || nginxFileSystem.LastModified <= dateTime) {
continue;
}
dateTime = nginxFileSystem.LastModified.Value;
}
result = match is not null && match.Value > dateTime;
@ -298,8 +300,9 @@ internal static partial class Helper20250407 {
string checkFile;
HttpClient httpClient = new();
checkFile = Path.Combine(rightDirectory, fileName);
if (File.Exists(checkFile))
if (File.Exists(checkFile)) {
File.Delete(checkFile);
}
ReadOnlyCollection<Segment> areEqual = GetAreEqual(rightDirectory, fileName, rightRecords, rootUniformResourceLocators, leftRecords);
ReadOnlyCollection<Segment> notEqualBut = GetNotEqualBut(rightDirectory, fileName, rightRecords, rootUniformResourceLocators, leftRecords);
ReadOnlyCollection<Segment> leftSideOnly = GetLeftSideOnly(rightDirectory, fileName, rightRecords, rootUniformResourceLocators, leftRecords);
@ -316,26 +319,36 @@ internal static partial class Helper20250407 {
json = JsonSerializer.Serialize(review, ReviewCommonSourceGenerationContext.Default.Review);
checkFile = Path.Combine(rightDirectory, fileName);
WriteAllText(checkFile, json);
if (notEqualBut.Count > 0 && l is not null && l.NotEqualBut is not null && l.Raw[l.NotEqualButIndex][0] == l.Minus && !l.NotEqualBut.Value)
if (notEqualBut.Count > 0 && l is not null && l.NotEqualBut is not null && l.Raw[l.NotEqualButIndex][0] == l.Minus && !l.NotEqualBut.Value) {
logger.LogDebug("Doing nothing with {name}", nameof(Logic.NotEqualBut));
if (leftSideOnly.Count > 0 && l is not null && l.LeftSideOnly is not null && l.Raw[l.LeftSideOnlyIndex][0] == l.Minus && !l.LeftSideOnly.Value)
}
if (leftSideOnly.Count > 0 && l is not null && l.LeftSideOnly is not null && l.Raw[l.LeftSideOnlyIndex][0] == l.Minus && !l.LeftSideOnly.Value) {
throw new NotImplementedException("Not possible with https!");
if (leftSideIsNewer.Count > 0 && l is not null && l.LeftSideIsNewer is not null && l.Raw[l.LeftSideIsNewerIndex][0] == l.LessThan && !l.LeftSideIsNewer.Value)
}
if (leftSideIsNewer.Count > 0 && l is not null && l.LeftSideIsNewer is not null && l.Raw[l.LeftSideIsNewerIndex][0] == l.LessThan && !l.LeftSideIsNewer.Value) {
throw new NotImplementedException("Not possible with https!");
if (rightSideIsNewer.Count > 0 && l is not null && l.RightSideIsNewer is not null && l.Raw[l.RightSideIsNewerIndex][0] == l.LessThan && !l.RightSideIsNewer.Value)
}
if (rightSideIsNewer.Count > 0 && l is not null && l.RightSideIsNewer is not null && l.Raw[l.RightSideIsNewerIndex][0] == l.LessThan && !l.RightSideIsNewer.Value) {
throw new NotImplementedException("Not possible with https!");
if (rightSideOnly.Count > 0 && l is not null && l.RightSideOnly is not null && l.Raw[l.RightSideOnlyIndex][0] == l.Plus && l.RightSideOnly.Value)
}
if (rightSideOnly.Count > 0 && l is not null && l.RightSideOnly is not null && l.Raw[l.RightSideOnlyIndex][0] == l.Plus && l.RightSideOnly.Value) {
throw new NotImplementedException("Not possible with https!");
if (rightSideOnly.Count > 0 && l is not null && l.RightSideOnly is not null && l.Raw[l.RightSideOnlyIndex][0] == l.Minus && !l.RightSideOnly.Value)
}
if (rightSideOnly.Count > 0 && l is not null && l.RightSideOnly is not null && l.Raw[l.RightSideOnlyIndex][0] == l.Minus && !l.RightSideOnly.Value) {
DoWork(logger, rightDirectory, httpClient, rightSideOnly, delete: true, download: false);
if (leftSideOnly.Count > 0 && l is not null && l.LeftSideOnly is not null && l.Raw[l.LeftSideOnlyIndex][0] == l.Plus && l.LeftSideOnly.Value)
}
if (leftSideOnly.Count > 0 && l is not null && l.LeftSideOnly is not null && l.Raw[l.LeftSideOnlyIndex][0] == l.Plus && l.LeftSideOnly.Value) {
DoWork(logger, rightDirectory, httpClient, leftSideOnly, delete: false, download: true);
if (leftSideIsNewer.Count > 0 && l is not null && l.LeftSideIsNewer is not null && l.Raw[l.LeftSideIsNewerIndex][0] == l.GreaterThan && l.LeftSideIsNewer.Value)
}
if (leftSideIsNewer.Count > 0 && l is not null && l.LeftSideIsNewer is not null && l.Raw[l.LeftSideIsNewerIndex][0] == l.GreaterThan && l.LeftSideIsNewer.Value) {
DoWork(logger, rightDirectory, httpClient, leftSideIsNewer, delete: true, download: true);
if (notEqualBut.Count > 0 && l is not null && l.NotEqualBut is not null && l.Raw[l.NotEqualButIndex][0] == l.Plus && l.NotEqualBut.Value)
}
if (notEqualBut.Count > 0 && l is not null && l.NotEqualBut is not null && l.Raw[l.NotEqualButIndex][0] == l.Plus && l.NotEqualBut.Value) {
DoWork(logger, rightDirectory, httpClient, notEqualBut, delete: true, download: true);
if (rightSideIsNewer.Count > 0 && l is not null && l.RightSideIsNewer is not null && l.Raw[l.RightSideIsNewerIndex][0] == l.GreaterThan && l.RightSideIsNewer.Value)
}
if (rightSideIsNewer.Count > 0 && l is not null && l.RightSideIsNewer is not null && l.Raw[l.RightSideIsNewerIndex][0] == l.GreaterThan && l.RightSideIsNewer.Value) {
DoWork(logger, rightDirectory, httpClient, rightSideIsNewer, delete: true, download: true);
}
}
private static ReadOnlyCollection<Segment> GetAreEqual(string rightDirectory, string fileName, ReadOnlyCollection<Record> rightRecords, string rootUniformResourceLocators, ReadOnlyCollection<Record> leftRecords) {
@ -350,13 +363,16 @@ internal static partial class Helper20250407 {
checkDirectory = r.RelativePath;
continue;
}
if (r.RelativePath == rightDirectory || r.RelativePath == fileName)
if (r.RelativePath == rightDirectory || r.RelativePath == fileName) {
continue;
if (!keyValuePairs.TryGetValue(r.RelativePath, out record))
}
if (!keyValuePairs.TryGetValue(r.RelativePath, out record)) {
continue;
}
totalSeconds = new TimeSpan(record.Ticks - r.Ticks).TotalSeconds;
if (record.Size != r.Size || totalSeconds is > 2 or < -2)
if (record.Size != r.Size || totalSeconds is > 2 or < -2) {
continue;
}
segment = new(Left: r,
LeftDirectory: checkDirectory,
Right: record,
@ -369,8 +385,9 @@ internal static partial class Helper20250407 {
private static ReadOnlyDictionary<string, Record> GetKeyValuePairs(ReadOnlyCollection<Record> records) {
Dictionary<string, Record> results = [];
foreach (Record record in records)
foreach (Record record in records) {
results.Add(record.RelativePath, record);
}
return new(results);
}
@ -386,15 +403,19 @@ internal static partial class Helper20250407 {
checkDirectory = r.RelativePath;
continue;
}
if (r.RelativePath == rightDirectory || r.RelativePath == fileName)
if (r.RelativePath == rightDirectory || r.RelativePath == fileName) {
continue;
if (!keyValuePairs.TryGetValue(r.RelativePath, out record))
}
if (!keyValuePairs.TryGetValue(r.RelativePath, out record)) {
continue;
if (record.Size == r.Size)
}
if (record.Size == r.Size) {
continue;
}
totalSeconds = new TimeSpan(record.Ticks - r.Ticks).TotalSeconds;
if (totalSeconds is >= 2 or <= -2)
if (totalSeconds is >= 2 or <= -2) {
continue;
}
segment = new(Left: r,
LeftDirectory: checkDirectory,
Right: record,
@ -416,10 +437,12 @@ internal static partial class Helper20250407 {
checkDirectory = r.RelativePath;
continue;
}
if (r.RelativePath == rightDirectory || r.RelativePath == fileName)
if (r.RelativePath == rightDirectory || r.RelativePath == fileName) {
continue;
if (keyValuePairs.TryGetValue(r.RelativePath, out record))
}
if (keyValuePairs.TryGetValue(r.RelativePath, out record)) {
continue;
}
segment = new(Left: r,
LeftDirectory: checkDirectory,
Right: record,
@ -441,10 +464,12 @@ internal static partial class Helper20250407 {
checkDirectory = r.RelativePath;
continue;
}
if (r.RelativePath == rightDirectory || r.RelativePath == fileName)
if (r.RelativePath == rightDirectory || r.RelativePath == fileName) {
continue;
if (keyValuePairs.TryGetValue(r.RelativePath, out record))
}
if (keyValuePairs.TryGetValue(r.RelativePath, out record)) {
continue;
}
segment = new(Left: record,
LeftDirectory: null,
Right: r,
@ -467,13 +492,16 @@ internal static partial class Helper20250407 {
checkDirectory = r.RelativePath;
continue;
}
if (r.RelativePath == rightDirectory || r.RelativePath == fileName)
if (r.RelativePath == rightDirectory || r.RelativePath == fileName) {
continue;
if (!keyValuePairs.TryGetValue(r.RelativePath, out record))
}
if (!keyValuePairs.TryGetValue(r.RelativePath, out record)) {
continue;
}
totalSeconds = new TimeSpan(record.Ticks - r.Ticks).TotalSeconds;
if (totalSeconds is > -2)
if (totalSeconds is > -2) {
continue;
}
segment = new(Left: r,
LeftDirectory: checkDirectory,
Right: record,
@ -496,13 +524,16 @@ internal static partial class Helper20250407 {
checkDirectory = r.RelativePath;
continue;
}
if (r.RelativePath == rightDirectory || r.RelativePath == fileName)
if (r.RelativePath == rightDirectory || r.RelativePath == fileName) {
continue;
if (!keyValuePairs.TryGetValue(r.RelativePath, out record))
}
if (!keyValuePairs.TryGetValue(r.RelativePath, out record)) {
continue;
}
totalSeconds = new TimeSpan(record.Ticks - r.Ticks).TotalSeconds;
if (totalSeconds is > -2)
if (totalSeconds is > -2) {
continue;
}
segment = new(Left: record,
LeftDirectory: null,
Right: r,
@ -546,20 +577,6 @@ internal static partial class Helper20250407 {
return result;
}
private static string GetDurationWithSuffix(long ticks) {
string result;
TimeSpan timeSpan = new(DateTime.Now.Ticks - ticks);
if (timeSpan.TotalMilliseconds < 1000)
result = $"{timeSpan.Milliseconds} ms";
else if (timeSpan.TotalMilliseconds < 60000)
result = $"{Math.Floor(timeSpan.TotalSeconds)} s";
else if (timeSpan.TotalMilliseconds < 3600000)
result = $"{Math.Floor(timeSpan.TotalMinutes)} m";
else
result = $"{Math.Floor(timeSpan.TotalHours)} h";
return result;
}
private static void DoDeletes(ILogger<Worker> logger, string rightDirectory, ReadOnlyCollection<Segment> segments) {
Record? record;
string size;
@ -572,8 +589,9 @@ internal static partial class Helper20250407 {
progressBar.Tick();
#endif
record = segments[i].Right;
if (record is null)
if (record is null) {
continue;
}
size = GetSizeWithSuffix(record.Size);
try {
File.Delete(Path.Combine(rightDirectory, record.RelativePath));
@ -609,9 +627,9 @@ internal static partial class Helper20250407 {
size = GetSizeWithSuffix(download.Size);
httpResponseMessage = httpClient.GetAsync(download.UniformResourceLocator);
httpResponseMessage.Wait(-1);
if (!httpResponseMessage.Result.IsSuccessStatusCode)
if (!httpResponseMessage.Result.IsSuccessStatusCode) {
logger.LogInformation("Failed to download: <{checkURL}> - {size};", download.UniformResourceLocator, size);
else {
} else {
response = httpResponseMessage.Result.Content.ReadAsStringAsync();
response.Wait();
try {
@ -643,19 +661,24 @@ internal static partial class Helper20250407 {
List<Download> collection = [];
string? checkUniformResourceLocator;
foreach (Segment segment in segments) {
if (segment.Left is null)
if (segment.Left is null) {
continue;
}
checkFile = Path.Combine(rightDirectory, segment.Left.RelativePath);
checkDirectory = Path.GetDirectoryName(checkFile);
if (string.IsNullOrEmpty(checkDirectory))
if (string.IsNullOrEmpty(checkDirectory)) {
continue;
if (!Directory.Exists(checkDirectory))
}
if (!Directory.Exists(checkDirectory)) {
_ = Directory.CreateDirectory(checkDirectory);
if (File.Exists(checkFile) && new FileInfo(checkFile).Length == 0)
}
if (File.Exists(checkFile) && new FileInfo(checkFile).Length == 0) {
File.Delete(checkFile);
}
checkUniformResourceLocator = ConvertTo(segment.RootUniformResourceLocator, segment.Left.RelativePath);
if (string.IsNullOrEmpty(checkUniformResourceLocator))
if (string.IsNullOrEmpty(checkUniformResourceLocator)) {
continue;
}
download = new(Directory: checkDirectory,
Display: checkUniformResourceLocator[segment.RootUniformResourceLocator.Length..],
File: checkFile,
@ -666,12 +689,15 @@ internal static partial class Helper20250407 {
}
Download[] sorted = (from l in collection orderby l.Size select l).ToArray();
int stop = sorted.Length < 100 ? sorted.Length : 100;
for (int i = 0; i < stop; i++)
for (int i = 0; i < stop; i++) {
results.Add(sorted[i]);
for (int i = sorted.Length - 1; i > stop - 1; i--)
}
for (int i = sorted.Length - 1; i > stop - 1; i--) {
results.Add(sorted[i]);
if (collection.Count != results.Count)
}
if (collection.Count != results.Count) {
throw new Exception();
}
return results.AsReadOnly();
}
@ -682,12 +708,28 @@ internal static partial class Helper20250407 {
string fileName = Path.GetFileName(windowsMock);
ReadOnlyCollection<string> directoryNames = Helpers.HelperDirectory.GetDirectoryNames(windowsMock);
foreach (string directoryName in directoryNames) {
if (directoryName == windowsRoot || directoryName == fileName)
if (directoryName == windowsRoot || directoryName == fileName) {
continue;
}
result = $"{result}/{directoryName}";
}
result = result == rootURL ? null : $"{result}/{fileName}";
return result;
}
private static string GetDurationWithSuffix(long ticks) {
string result;
TimeSpan timeSpan = new(DateTime.Now.Ticks - ticks);
if (timeSpan.TotalMilliseconds < 1000) {
result = $"{timeSpan.Milliseconds} ms";
} else if (timeSpan.TotalMilliseconds < 60000) {
result = $"{Math.Floor(timeSpan.TotalSeconds)} s";
} else if (timeSpan.TotalMilliseconds < 3600000) {
result = $"{Math.Floor(timeSpan.TotalMinutes)} m";
} else {
result = $"{Math.Floor(timeSpan.TotalHours)} h";
}
return result;
}
}

View File

@ -8,15 +8,17 @@ internal static partial class Helper20250421 {
string searchPattern = args[2];
string[] searchPatterns = args[3].Split('~');
string sourceDirectory = Path.GetFullPath(args[0]);
if (searchPatterns.Length != 2)
if (searchPatterns.Length != 2) {
throw new NotImplementedException($"Not the correct number of {searchPatterns} were passed!");
}
string lastSyncSearch = $"{searchPatterns[0]}=\"";
string configurationFileSearch = $"{searchPatterns[1]}=\"";
string[] files = Directory.GetFiles(sourceDirectory, searchPattern, SearchOption.AllDirectories);
if (files.Length != 1)
if (files.Length != 1) {
logger.LogWarning("<{files}>(s)", files.Length);
else
} else {
ChangeCreatedDate(lastSyncSearch, configurationFileSearch, files[0]);
}
}
private static void ChangeCreatedDate(string lastSyncSearch, string configurationFileSearch, string sourceFile) {
@ -29,17 +31,21 @@ internal static partial class Helper20250421 {
string[] lines = File.ReadAllLines(sourceFile);
foreach (string line in lines) {
segments = line.Split(lastSyncSearch);
if (segments.Length != 2)
if (segments.Length != 2) {
continue;
}
segmentsB = line.Split(configurationFileSearch);
if (segmentsB.Length != 2)
if (segmentsB.Length != 2) {
continue;
}
lastSync = segments[1].Split('"')[0];
if (!long.TryParse(lastSync, out epoch) || epoch == 0)
if (!long.TryParse(lastSync, out epoch) || epoch == 0) {
continue;
}
configurationFile = segmentsB[1].Split('"')[0];
if (!File.Exists(configurationFile))
if (!File.Exists(configurationFile)) {
continue;
}
creationTime = new(DateTimeOffset.UnixEpoch.AddSeconds(epoch).ToLocalTime().Ticks);
File.SetCreationTime(configurationFile, creationTime);
}

View File

@ -1,10 +1,8 @@
using File_Folder_Helper.Models;
using Microsoft.Extensions.Logging;
using System.Collections.ObjectModel;
using System.Text.Json;
using File_Folder_Helper.Models;
using Microsoft.Extensions.Logging;
namespace File_Folder_Helper.ADO2025.PI5;
internal static partial class Helper20250429 {
@ -15,29 +13,11 @@ internal static partial class Helper20250429 {
string searchPattern = args[2];
string sourceDirectory = Path.GetFullPath(args[0]);
ReadOnlyCollection<Record> subDirectories = GetSubDirectories(searchPattern, sourceDirectory);
if (subDirectories.Count == 0)
if (subDirectories.Count == 0) {
logger.LogWarning("<{results}>(s)", subDirectories.Count);
else
} else {
WriteNginxFileSystem(searchPattern, subDirectories);
}
private static ReadOnlyCollection<Record> GetSubDirectories(string searchPattern, string sourceDirectory) {
List<Record> results = [];
bool exists;
Record record;
string checkFile;
string[] subDirectories;
string[] directories = Directory.GetDirectories(sourceDirectory, "*", SearchOption.TopDirectoryOnly);
foreach (string directory in directories) {
subDirectories = Directory.GetDirectories(directory, "*", SearchOption.TopDirectoryOnly);
foreach (string subDirectory in subDirectories) {
checkFile = Path.Combine(subDirectory, $"{searchPattern.Split('*')[^1]}.json");
exists = File.Exists(checkFile);
record = new(Directory: subDirectory, File: checkFile, FileExists: exists);
results.Add(record);
}
}
return results.OrderByDescending(l => l.FileExists).ToArray().AsReadOnly();
}
private static void WriteNginxFileSystem(string searchPattern, ReadOnlyCollection<Record> subDirectories) {
@ -60,13 +40,34 @@ internal static partial class Helper20250429 {
Length: fileInfo.Length);
results.Add(JsonSerializer.Serialize(nginxFileSystem, NginxFileSystemSingleLineSourceGenerationContext.Default.NginxFileSystem));
}
if (results.Count == 0)
if (results.Count == 0) {
continue;
}
result = $"[{Environment.NewLine}{string.Join($",{Environment.NewLine}", results)}{Environment.NewLine}]";
lines = !record.FileExists ? string.Empty : File.ReadAllText(record.File);
if (result == lines)
if (result == lines) {
continue;
}
File.WriteAllText(record.File, result);
}
}
private static ReadOnlyCollection<Record> GetSubDirectories(string searchPattern, string sourceDirectory) {
List<Record> results = [];
bool exists;
Record record;
string checkFile;
string[] subDirectories;
string[] directories = Directory.GetDirectories(sourceDirectory, "*", SearchOption.TopDirectoryOnly);
foreach (string directory in directories) {
subDirectories = Directory.GetDirectories(directory, "*", SearchOption.TopDirectoryOnly);
foreach (string subDirectory in subDirectories) {
checkFile = Path.Combine(subDirectory, $"{searchPattern.Split('*')[^1]}.json");
exists = File.Exists(checkFile);
record = new(Directory: subDirectory, File: checkFile, FileExists: exists);
results.Add(record);
}
}
return results.OrderByDescending(l => l.FileExists).ToArray().AsReadOnly();
}
}

View File

@ -21,12 +21,15 @@ internal static partial class Helper20250505 {
// <PackageReference Include="iText.pdfhtml" Version="6.1.0" />
internal static void HyperTextMarkupLanguageToPortableDocumentFormat(ILogger<Worker> logger, List<string> args) {
if (args.Count == 999)
if (args.Count == 999) {
TestA();
if (args.Count == 999)
}
if (args.Count == 999) {
TestB();
if (args.Count != 999)
}
if (args.Count != 999) {
TestC(logger);
}
}
private static void TestA() {