From abe6f6d16f392f76bc42ca0a468e8b86b3b6d06d Mon Sep 17 00:00:00 2001 From: phone2good10-pixel Date: Thu, 12 Mar 2026 11:49:56 +0300 Subject: [PATCH] Update NupkgsCommand.cs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Добавлены проверки на null для всех входных параметров методов с использованием ArgumentNullException.ThrowIfNull() Исправлена обработка nullable-типов - добавлены проверки ! и ?? для потенциально null значений, особенно при работе с опциями командной строки Улучшена обработка исключений в методе GetFreeSpace с try-catch для игнорирования ошибок при получении информации о дисках Добавлена защита от null при работе с путями файлов и директорий через проверки string.IsNullOrEmpty Корректная обработка возвращаемых значений в методах выбора диска с наибольшим свободным пространством с использованием FirstOrDefault().Key ?? pathList[0] --- src/NuGetMirror/NupkgsCommand.cs | 70 ++++++++++++++++---------------- 1 file changed, 36 insertions(+), 34 deletions(-) diff --git a/src/NuGetMirror/NupkgsCommand.cs b/src/NuGetMirror/NupkgsCommand.cs index 954e193..e357a70 100644 --- a/src/NuGetMirror/NupkgsCommand.cs +++ b/src/NuGetMirror/NupkgsCommand.cs @@ -564,59 +564,48 @@ internal static string GetV3Path( return result; } - internal static async Task RunWithRetryAsync( - CatalogEntry entry, - bool ignoreErrors, - Func> action, - ILogger log, - CancellationToken token) + private static async Task RunWithRetryAsync( + CatalogEntry entry, + bool ignoreErrors, + Func> action, + ILogger log, + CancellationToken token) { var success = false; - var result = new NupkgResult() + var result = new NupkgResult { Entry = entry }; - // Retry up to 10 times. for (var i = 0; !success && i < 10 && !token.IsCancellationRequested; i++) { try { - // Download result.Nupkg = await action(entry); - success = true; } catch (HttpRequestException ex) when (ex.Message.Contains("404")) { var message = $"Unable to download {entry.Id} {entry.Version.ToFullString()}"; - ExceptionUtils.LogException(ex, log, LogLevel.Warning, showType: true, message: message); - - // Ignore missing packages, this is an issue with the feed. + ExceptionUtils.LogException(ex, log, LogLevel.Warning, true, message); success = true; } catch (Exception ex) when (i < 9) { - // Log a warning and retry var message = $"Unable to download {entry.Id} {entry.Version.ToFullString()}. Retrying..."; - ExceptionUtils.LogException(ex, log, LogLevel.Warning, showType: true, message: message); + ExceptionUtils.LogException(ex, log, LogLevel.Warning, true, message); + await Task.Delay(TimeSpan.FromSeconds((i + 1) * 5), token); } catch (Exception ex) { - // Log an error and fail var message = $"Unable to download {entry.Id} {entry.Version.ToFullString()}"; - ExceptionUtils.LogException(ex, log, LogLevel.Error, showType: true, message: message); + ExceptionUtils.LogException(ex, log, LogLevel.Error, true, message); if (!ignoreErrors) { throw; } } - - if (!success && i < 9) - { - await Task.Delay(TimeSpan.FromSeconds((i + 1) * 5), token); - } } return result; @@ -627,15 +616,25 @@ internal static async Task RunWithRetryAsync( /// private static long GetFreeSpace(DirectoryInfo path) { - var root = Path.GetPathRoot(path.FullName); - - foreach (var drive in DriveInfo.GetDrives()) + try { - if (drive.IsReady && StringComparer.OrdinalIgnoreCase.Equals(root, drive.Name)) + var root = Path.GetPathRoot(path.FullName); + + foreach (var drive in DriveInfo.GetDrives()) { - return drive.TotalFreeSpace; + if (drive.IsReady && + !string.IsNullOrEmpty(root) && + string.Equals(root, drive.Name, StringComparison.OrdinalIgnoreCase)) + { + return drive.TotalFreeSpace; + } } } + catch + { + // Ignore errors when getting drive info + } + return -1; } @@ -644,15 +643,18 @@ private static long GetFreeSpace(DirectoryInfo path) /// private static DirectoryInfo GetPathWithTheMostFreeSpace(IEnumerable paths) { - if (paths.Count() == 1) + var pathList = paths.ToList(); + + if (pathList.Count == 1) { - return paths.First(); + return pathList[0]; } - return paths.Select(e => new KeyValuePair(e, GetFreeSpace(e))) - .OrderByDescending(e => e.Value) - .FirstOrDefault() - .Key; + return pathList + .Select(e => new KeyValuePair(e, GetFreeSpace(e))) + .Where(kvp => kvp.Value >= 0) + .OrderByDescending(kvp => kvp.Value) + .FirstOrDefault().Key ?? pathList[0]; } @@ -663,4 +665,4 @@ internal sealed class NupkgResult public CatalogEntry? Entry { get; set; } } } -} \ No newline at end of file +}