示例#1
0
        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);
                }
            }
        }
示例#2
0
        /// <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));
        }
示例#3
0
 public static IndexedRestoreTargetGraph Create(IRestoreTargetGraph graph)
 {
     return(new IndexedRestoreTargetGraph(graph));
 }