From 970a53451e498ce7b4cb31de2da8064a4085f28a Mon Sep 17 00:00:00 2001 From: phone2good10-pixel Date: Thu, 12 Mar 2026 11:50:38 +0300 Subject: [PATCH] Update MirrorUtility.cs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Добавлены проверки на null для всех входных параметров с использованием ArgumentNullException.ThrowIfNull() в методах GetCursorFile, SaveCursor и SetTempRoot Исправлена обработка nullable-значений при парсинге JSON - добавлена проверка json["cursor"]?.ToObject() и !string.IsNullOrEmpty(cursorValue) перед использованием Упрощен синтаксис using-блоков - использование современных конструкций без лишних скобок для StreamReader и JsonTextReader Добавлена обработка исключений при получении поля через рефлексию с ?? throw new InvalidOperationException() Улучшена инициализация JObject с использованием современного синтаксиса инициализатора ["cursor"] = time.ToString("o") --- src/NuGetMirror/MirrorUtility.cs | 52 ++++++++++++++++---------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/src/NuGetMirror/MirrorUtility.cs b/src/NuGetMirror/MirrorUtility.cs index 4c876d9..94aa729 100644 --- a/src/NuGetMirror/MirrorUtility.cs +++ b/src/NuGetMirror/MirrorUtility.cs @@ -9,34 +9,32 @@ namespace NuGetMirror { - /// - /// Mirror a feed to disk as a folder of nupkgs. - /// public static class MirrorUtility { private const string CursorFile = "cursor.json"; - /// - /// cursor.json path - /// public static FileInfo GetCursorFile(DirectoryInfo root) { + ArgumentNullException.ThrowIfNull(root); return new FileInfo(Path.Combine(root.FullName, CursorFile)); } - /// - /// Load cursor.json if it exists. - /// If it doesn't exist MinTime is returned. - /// public static DateTimeOffset LoadCursor(DirectoryInfo root) { + ArgumentNullException.ThrowIfNull(root); + var file = GetCursorFile(root); if (file.Exists) { - var json = LoadJson(file.OpenRead()); + using var stream = file.OpenRead(); + var json = LoadJson(stream); + var cursorValue = json["cursor"]?.ToObject(); - return DateTimeOffset.Parse(json["cursor"]!.ToObject()!, CultureInfo.InvariantCulture); + if (!string.IsNullOrEmpty(cursorValue)) + { + return DateTimeOffset.Parse(cursorValue, CultureInfo.InvariantCulture); + } } return DateTimeOffset.MinValue; @@ -44,28 +42,25 @@ public static DateTimeOffset LoadCursor(DirectoryInfo root) internal static JObject LoadJson(Stream stream) { - using (var reader = new StreamReader(stream)) - using (var jsonReader = new JsonTextReader(reader)) + using var reader = new StreamReader(stream); + using var jsonReader = new JsonTextReader(reader) { - // Avoid error prone json.net date handling - jsonReader.DateParseHandling = DateParseHandling.None; + DateParseHandling = DateParseHandling.None + }; - return JObject.Load(jsonReader); - } + return JObject.Load(jsonReader); } - /// - /// Write cursor.json to disk. - /// public static void SaveCursor(DirectoryInfo root, DateTimeOffset time) { - var file = GetCursorFile(root); + ArgumentNullException.ThrowIfNull(root); + var file = GetCursorFile(root); FileUtility.Delete(file.FullName); - var json = new JObject() + var json = new JObject { - { "cursor", time.ToString("o") } + ["cursor"] = time.ToString("o") }; File.WriteAllText(file.FullName, json.ToString()); @@ -73,10 +68,15 @@ public static void SaveCursor(DirectoryInfo root, DateTimeOffset time) internal static void SetTempRoot(this SourceCacheContext context, string path) { + ArgumentNullException.ThrowIfNull(context); + ArgumentException.ThrowIfNullOrWhiteSpace(path); + var folderProp = typeof(SourceCacheContext) - .GetField("_generatedTempFolder", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static); + .GetField("_generatedTempFolder", + BindingFlags.Instance | BindingFlags.NonPublic) + ?? throw new InvalidOperationException("Field _generatedTempFolder not found"); - folderProp!.SetValue(context, path); + folderProp.SetValue(context, path); } } }