Exemplo n.º 1
0
        private void AddMessage(IAssetsLogMessage message)
        {
            var logToMsBuild = true;
            var targetGraphs = message.GetTargetGraphs(LockFile);

            targetGraphs = targetGraphs.Any() ? targetGraphs : new LockFileTarget[] { null };

            foreach (var target in targetGraphs)
            {
                var targetLib = message.LibraryId == null ? null : target?.GetTargetLibrary(message.LibraryId);

                Diagnostics.Add(
                    message.Code.ToString(),
                    message.Message,
                    message.FilePath,
                    FromLogLevel(message.Level),
                    message.StartLineNumber,
                    message.StartColumnNumber,
                    message.EndLineNumber,
                    message.EndColumnNumber,
                    target?.Name,
                    targetLib == null ? null : $"{targetLib.Name}/{targetLib.Version.ToNormalizedString()}",
                    logToMsBuild);

                logToMsBuild = false; // only write first instance of this diagnostic to msbuild
            }
        }
Exemplo n.º 2
0
        /// <summary>
        /// Converts the <code>IAssetsLogMessage</code> object into a <code>JObject</code> that can be written into the assets file.
        /// </summary>
        /// <param name="logMessage"><code>IAssetsLogMessage</code> representing the log message.</param>
        /// <returns><code>JObject</code> containg the json representation of the log message.</returns>
        private static JObject WriteLogMessage(IAssetsLogMessage logMessage, string projectPath)
        {
            var logJObject = new JObject()
            {
                [LogMessageProperties.CODE]  = Enum.GetName(typeof(NuGetLogCode), logMessage.Code),
                [LogMessageProperties.LEVEL] = Enum.GetName(typeof(LogLevel), logMessage.Level)
            };

            if (logMessage.Level == LogLevel.Warning)
            {
                logJObject[LogMessageProperties.WARNING_LEVEL] = (int)logMessage.WarningLevel;
            }

            if (logMessage.FilePath != null &&
                (projectPath == null || !PathUtility.GetStringComparerBasedOnOS().Equals(logMessage.FilePath, projectPath)))
            {
                // Do not write the file path if it is the same as the project path.
                // This prevents duplicate information in the lock file.
                logJObject[LogMessageProperties.FILE_PATH] = logMessage.FilePath;
            }

            if (logMessage.StartLineNumber > 0)
            {
                logJObject[LogMessageProperties.START_LINE_NUMBER] = logMessage.StartLineNumber;
            }

            if (logMessage.StartColumnNumber > 0)
            {
                logJObject[LogMessageProperties.START_COLUMN_NUMBER] = logMessage.StartColumnNumber;
            }

            if (logMessage.EndLineNumber > 0)
            {
                logJObject[LogMessageProperties.END_LINE_NUMBER] = logMessage.EndLineNumber;
            }

            if (logMessage.EndColumnNumber > 0)
            {
                logJObject[LogMessageProperties.END_COLUMN_NUMBER] = logMessage.EndColumnNumber;
            }

            if (logMessage.Message != null)
            {
                logJObject[LogMessageProperties.MESSAGE] = logMessage.Message;
            }

            if (logMessage.LibraryId != null)
            {
                logJObject[LogMessageProperties.LIBRARY_ID] = logMessage.LibraryId;
            }

            if (logMessage.TargetGraphs != null &&
                logMessage.TargetGraphs.Any() &&
                logMessage.TargetGraphs.All(l => !string.IsNullOrEmpty(l)))
            {
                logJObject[LogMessageProperties.TARGET_GRAPHS] = new JArray(logMessage.TargetGraphs);
            }

            return(logJObject);
        }
Exemplo n.º 3
0
 public bool Equals(IAssetsLogMessage other)
 {
     return(other.Code == Code &&
            other.Level == Level &&
            other.WarningLevel == WarningLevel &&
            other.Message == Message &&
            other.LibraryId == LibraryName);
 }
Exemplo n.º 4
0
 public AssetsFileLogMessage(IAssetsLogMessage logMessage)
 {
     Code         = logMessage.Code;
     Level        = logMessage.Level;
     WarningLevel = logMessage.WarningLevel;
     Message      = logMessage.Message;
     LibraryName  = logMessage.LibraryId;
 }
        /// <summary>
        /// Get the library from each target graph it exists in.
        /// </summary>
        public static IEnumerable <LockFileTargetLibrary> GetTargetLibraries(this IAssetsLogMessage message, LockFile assetsFile)
        {
            if (message == null)
            {
                throw new ArgumentNullException(nameof(message));
            }

            if (assetsFile == null)
            {
                throw new ArgumentNullException(nameof(assetsFile));
            }

            return(message.GetTargetGraphs(assetsFile).Select(target => target.GetTargetLibrary(message.LibraryId)));
        }
Exemplo n.º 6
0
        /// <summary>
        /// Get target graphs for the current log message.
        /// </summary>
        public static IEnumerable <LockFileTarget> GetTargetGraphs(this IAssetsLogMessage message, LockFile assetsFile)
        {
            if (message == null)
            {
                throw new ArgumentNullException(nameof(message));
            }

            if (assetsFile == null)
            {
                throw new ArgumentNullException(nameof(assetsFile));
            }

            return(assetsFile.Targets.Where(target => message.TargetGraphs.Contains(target.Name, StringComparer.OrdinalIgnoreCase)));
        }
Exemplo n.º 7
0
 /// <summary>
 /// Converts an IAssetsLogMessage into a RestoreLogMessage.
 /// This is needed when an IAssetsLogMessage needs to be logged and loggers do not have visibility to IAssetsLogMessage.
 /// </summary>
 /// <param name="logMessage">IAssetsLogMessage to be converted.</param>
 /// <returns>RestoreLogMessage equivalent to the IAssetsLogMessage.</returns>
 public static RestoreLogMessage AsRestoreLogMessage(this IAssetsLogMessage logMessage)
 {
     return(new RestoreLogMessage(logMessage.Level, logMessage.Code, logMessage.Message)
     {
         ProjectPath = logMessage.ProjectPath,
         WarningLevel = logMessage.WarningLevel,
         FilePath = logMessage.FilePath,
         LibraryId = logMessage.LibraryId,
         TargetGraphs = logMessage.TargetGraphs,
         StartLineNumber = logMessage.StartLineNumber,
         StartColumnNumber = logMessage.StartColumnNumber,
         EndLineNumber = logMessage.EndLineNumber,
         EndColumnNumber = logMessage.EndColumnNumber
     });
 }
        /// <summary>
        /// Get target graphs for the current log message.
        /// </summary>
        /// <remarks>If the message does not contain target graphs all graphs in the file
        /// will be returned.</remarks>
        public static IEnumerable <LockFileTarget> GetTargetGraphs(this IAssetsLogMessage message, LockFile assetsFile)
        {
            if (message == null)
            {
                throw new ArgumentNullException(nameof(message));
            }

            if (assetsFile == null)
            {
                throw new ArgumentNullException(nameof(assetsFile));
            }

            // If the message does not contain any target graph it should apply to all graphs.
            if (message.TargetGraphs == null || message.TargetGraphs.Count == 0)
            {
                return(assetsFile.Targets);
            }

            return(assetsFile.Targets.Where(target => message.TargetGraphs.Contains(target.Name, StringComparer.OrdinalIgnoreCase)));
        }
Exemplo n.º 9
0
        private void AddMessage(IAssetsLogMessage message)
        {
            var targetGraphs = message.GetTargetGraphs(LockFile);

            targetGraphs = targetGraphs.Any() ? targetGraphs : new LockFileTarget[] { null };

            foreach (var target in targetGraphs)
            {
                var targetLib = message.LibraryId == null ? null : target?.GetTargetLibrary(message.LibraryId);

                _diagnostics.Add(
                    message.Code.ToString(),
                    message.Message,
                    message.FilePath,
                    FromLogLevel(message.Level),
                    message.StartLineNumber,
                    message.StartColumnNumber,
                    message.EndLineNumber,
                    message.EndColumnNumber,
                    target?.Name,
                    targetLib == null ? null : $"{targetLib.Name}/{targetLib.Version.ToNormalizedString()}");
            }
        }
        public async Task RestoreAsync_WithMinimalProjectAndAdditionalErrorMessage_WritesErrorsToAssetsFile()
        {
            // Arrange
            var projectName = "testproj";
            var logger      = new TestLogger();

            using (var rootFolder = TestDirectory.Create())
            {
                var projectFolder = new DirectoryInfo(Path.Combine(rootFolder, projectName));
                projectFolder.Create();
                var objFolder            = projectFolder.CreateSubdirectory("obj");
                var msbuildProjectPath   = new FileInfo(Path.Combine(projectFolder.FullName, $"{projectName}.csproj"));
                var globalPackagesFolder = Path.Combine(rootFolder, "gpf");

                var sources         = new SourceRepository[0];
                var restoreContext  = new DependencyGraphCacheContext(logger, NullSettings.Instance);
                var solutionManager = new Mock <ISolutionManager>();
                var restoreCommandProvidersCache = new RestoreCommandProvidersCache();

                // When a VS nomination results in an exception, we use this minimal DGSpec to do a restore.
                var dgSpec = DependencyGraphSpecTestUtilities.CreateMinimalDependencyGraphSpec(msbuildProjectPath.FullName, objFolder.FullName);
                dgSpec.AddRestore(dgSpec.Projects[0].FilePath);
                // CpsPackageReferenceProject sets some additional properties, from settings, in GetPackageSpecsAndAdditionalMessages(...)
                dgSpec.Projects[0].RestoreMetadata.PackagesPath = globalPackagesFolder;

                // Having an "additional" error message is also critical
                var restoreLogMessage = new RestoreLogMessage(LogLevel.Error, NuGetLogCode.NU1000, "Test error")
                {
                    FilePath    = msbuildProjectPath.FullName,
                    ProjectPath = msbuildProjectPath.FullName
                };
                var additionalMessages = new List <IAssetsLogMessage>()
                {
                    AssetsLogMessage.Create(restoreLogMessage)
                };

                // Act
                await DependencyGraphRestoreUtility.RestoreAsync(
                    dgSpec,
                    restoreContext,
                    restoreCommandProvidersCache,
                    cacheContextModifier : _ => { },
                    sources,
                    parentId : Guid.Empty,
                    forceRestore : false,
                    isRestoreOriginalAction : true,
                    additionalMessages,
                    progressReporter : null,
                    logger,
                    CancellationToken.None);

                // Assert
                var assetsFilePath = Path.Combine(objFolder.FullName, "project.assets.json");
                Assert.True(File.Exists(assetsFilePath), "Assets file does not exist");
                LockFile          assetsFile    = new LockFileFormat().Read(assetsFilePath);
                IAssetsLogMessage actualMessage = Assert.Single(assetsFile.LogMessages);
                Assert.Equal(restoreLogMessage.Level, actualMessage.Level);
                Assert.Equal(restoreLogMessage.Code, actualMessage.Code);
                Assert.Equal(restoreLogMessage.Message, actualMessage.Message);
            }
        }
Exemplo n.º 11
0
        /// <summary>
        /// Writes the <see cref="IAssetsLogMessage"/> object to the <see cref="JsonWriter"/>.
        /// </summary>
        /// <param name="logMessage"><code>IAssetsLogMessage</code> representing the log message.</param>
        private static void WriteLogMessage(JsonWriter writer, IAssetsLogMessage logMessage, string projectPath)
        {
            writer.WriteStartObject();

            writer.WritePropertyName(LogMessageProperties.CODE);
            writer.WriteValue(Enum.GetName(typeof(NuGetLogCode), logMessage.Code));

            writer.WritePropertyName(LogMessageProperties.LEVEL);
            writer.WriteValue(Enum.GetName(typeof(LogLevel), logMessage.Level));

            if (logMessage.Level == LogLevel.Warning)
            {
                writer.WritePropertyName(LogMessageProperties.WARNING_LEVEL);
                writer.WriteValue((int)logMessage.WarningLevel);
            }

            if (logMessage.FilePath != null &&
                (projectPath == null || !PathUtility.GetStringComparerBasedOnOS().Equals(logMessage.FilePath, projectPath)))
            {
                // Do not write the file path if it is the same as the project path.
                // This prevents duplicate information in the lock file.
                writer.WritePropertyName(LogMessageProperties.FILE_PATH);
                writer.WriteValue(logMessage.FilePath);
            }

            if (logMessage.StartLineNumber > 0)
            {
                writer.WritePropertyName(LogMessageProperties.START_LINE_NUMBER);
                writer.WriteValue(logMessage.StartLineNumber);
            }

            if (logMessage.StartColumnNumber > 0)
            {
                writer.WritePropertyName(LogMessageProperties.START_COLUMN_NUMBER);
                writer.WriteValue(logMessage.StartColumnNumber);
            }

            if (logMessage.EndLineNumber > 0)
            {
                writer.WritePropertyName(LogMessageProperties.END_LINE_NUMBER);
                writer.WriteValue(logMessage.EndLineNumber);
            }

            if (logMessage.EndColumnNumber > 0)
            {
                writer.WritePropertyName(LogMessageProperties.END_COLUMN_NUMBER);
                writer.WriteValue(logMessage.EndColumnNumber);
            }

            if (logMessage.Message != null)
            {
                writer.WritePropertyName(LogMessageProperties.MESSAGE);
                writer.WriteValue(logMessage.Message);
            }

            if (logMessage.LibraryId != null)
            {
                writer.WritePropertyName(LogMessageProperties.LIBRARY_ID);
                writer.WriteValue(logMessage.LibraryId);
            }

            if (logMessage.TargetGraphs != null &&
                logMessage.TargetGraphs.Any() &&
                logMessage.TargetGraphs.All(l => !string.IsNullOrEmpty(l)))
            {
                writer.WritePropertyName(LogMessageProperties.TARGET_GRAPHS);
                WriteArray(writer, logMessage.TargetGraphs);
            }

            writer.WriteEndObject();
        }