private IndexedRestoreTargetGraph(IRestoreTargetGraph graph) { Graph = graph ?? throw new ArgumentNullException(nameof(graph)); // Id -> Node foreach (var node in graph.Flattened) { var id = node.Key.Name; if (!_lookup.ContainsKey(id)) { _lookup.Add(id, node); } } // Index NU1107 version conflict errors var versionConflicts = graph.AnalyzeResult?.VersionConflicts; if (versionConflicts != null) { foreach (var node in versionConflicts) { // Selected and conflicting will have the same name. _idsWithErrors.Add(node.Conflicting.Key.Name); } } // Index cycles var cycles = graph.AnalyzeResult?.Cycles; if (cycles != null) { foreach (var node in cycles) { _idsWithErrors.Add(node.Key.Name); } } }
/// <summary> /// Create a specific error message for the unresolved dependency. /// </summary> public static async Task <RestoreLogMessage> GetMessageAsync(IRestoreTargetGraph graph, LibraryRange unresolved, RemoteWalkContext context, ILogger logger, CancellationToken token) { // Default to using the generic unresolved error code, this will be overridden later. var code = NuGetLogCode.NU1100; var message = string.Empty; if (unresolved.TypeConstraintAllows(LibraryDependencyTarget.ExternalProject) && !unresolved.TypeConstraintAllows(LibraryDependencyTarget.Package)) { // Project // Check if the name is a path and if it exists. All project paths should have been normalized and converted to full paths before this. if (unresolved.Name.IndexOf(Path.DirectorySeparatorChar) > -1 && File.Exists(unresolved.Name)) { // File exists but the dg spec did not contain the spec code = NuGetLogCode.NU1105; message = string.Format(CultureInfo.CurrentCulture, Strings.Error_UnableToFindProjectInfo, unresolved.Name); } else { // Generic missing project error code = NuGetLogCode.NU1104; message = string.Format(CultureInfo.CurrentCulture, Strings.Error_ProjectDoesNotExist, unresolved.Name); } } else if (unresolved.TypeConstraintAllows(LibraryDependencyTarget.Package) && context.RemoteLibraryProviders.Count > 0) { // Package var range = unresolved.VersionRange ?? VersionRange.All; var sourceInfo = await GetSourceInfosForIdAsync(unresolved.Name, range, context, logger, token); var allVersions = new SortedSet <NuGetVersion>(sourceInfo.SelectMany(e => e.Value)); if (allVersions.Count == 0) { // No versions found code = NuGetLogCode.NU1101; var sourceList = string.Join(", ", sourceInfo.Select(e => e.Key.Name) .OrderBy(e => e, StringComparer.OrdinalIgnoreCase)); message = string.Format(CultureInfo.CurrentCulture, Strings.Error_NoPackageVersionsExist, unresolved.Name, sourceList); } else { // At least one version found var firstLine = string.Empty; var rangeString = range.ToNonSnapshotRange().PrettyPrint(); if (!IsPrereleaseAllowed(range) && HasPrereleaseVersionsOnly(range, allVersions)) { code = NuGetLogCode.NU1103; firstLine = string.Format(CultureInfo.CurrentCulture, Strings.Error_NoStablePackageVersionsExist, unresolved.Name, rangeString); } else { code = NuGetLogCode.NU1102; firstLine = string.Format(CultureInfo.CurrentCulture, Strings.Error_NoPackageVersionsExistInRange, unresolved.Name, rangeString); } var lines = new List <string>() { firstLine }; lines.AddRange(sourceInfo.Select(e => FormatSourceInfo(e, range))); message = DiagnosticUtility.GetMultiLineMessage(lines); } } else { // Unknown or non-specific. // Also shown when no sources exist. message = string.Format(CultureInfo.CurrentCulture, Strings.Log_UnresolvedDependency, unresolved.ToString(), graph.TargetGraphName); // Set again for clarity code = NuGetLogCode.NU1100; } return(RestoreLogMessage.CreateError(code, message, unresolved.Name, graph.TargetGraphName)); }
public static IndexedRestoreTargetGraph Create(IRestoreTargetGraph graph) { return(new IndexedRestoreTargetGraph(graph)); }