public VersionAnalysisResult AnalyzeVersions(AssemblyPublicInterface localPublicInterface,
                                                     AssemblyPublicInterface onlinePublicInterface)
        {
            var result = new VersionAnalysisResult();

            result.ActualBump     = CompareVersions(onlinePublicInterface.Version, localPublicInterface.Version, result);
            result.CalculatedBump = AnalyzeInterfaces(onlinePublicInterface, localPublicInterface, result.Changes);

            return(result);
        }
        VersionBumpType AnalyzeInterfaces(AssemblyPublicInterface online, AssemblyPublicInterface local, List <Change> comments)
        {
            var overallBump = _settings.AssumeChanges
                                ? VersionBumpType.Patch
                                : VersionBumpType.None;

            var references = online.References.FullOuterJoin(local.References,
                                                             o => o.Name,
                                                             l => l.Name,
                                                             (o, l) => new { Online = o, Local = l });

            foreach (var reference in references)
            {
                var changes = _assemblyRules.Where(r => r.Applies(reference.Online, reference.Local))
                              .Select(r =>
                {
                    var overrideType = _settings.GetOverrideType(r.GetType());
                    return(new Change {
                        Bump = overrideType.ToBumpType(r.Bump),
                        Message = r.GetMessage(reference.Local)
                    });
                }).ToList();

                comments.AddRange(changes.Where(c => c.Bump != VersionBumpType.None));

                overallBump = Max(overallBump, changes.Select(c => c.Bump));
            }

            var types = online.Types.FullOuterJoin(local.Types,
                                                   o => o.FullName,
                                                   l => l.FullName,
                                                   (o, l) => new { Online = o, Local = l });

            foreach (var type in types)
            {
                var changes = _typeRules.Where(r => r.Applies(type.Online, type.Local))
                              .Select(r =>
                {
                    var overrideType = _settings.GetOverrideType(r.GetType());
                    return(new Change
                    {
                        Bump = overrideType.ToBumpType(r.Bump),
                        Message = r.GetMessage(type.Online ?? type.Local)
                    });
                }).ToList();

                changes.AddRange(_ruleRunners.SelectMany(a => a.Analyze(type.Online, type.Local)));

                comments.AddRange(changes.Where(c => c.Bump != VersionBumpType.None));

                overallBump = Max(overallBump, changes.Select(c => c.Bump));
            }

            return(overallBump);
        }
예제 #3
0
        public async Task <string> Compare(CompareCommand command)
        {
            string report = null;
            AssemblyPublicInterface localAssembly = null;
            var comments = new List <string>();

            try
            {
                localAssembly = AssemblyPublicInterface.Load(command.FullAssemblyPath);

                var bytes = await _nugetClient.GetAssemblyBytesFromPackage(command.PackageName, command.AssemblyFileName, localAssembly.Framework, comments);

                if (bytes == null)
                {
                    return($"An error has current processing your request:\n\n" +
                           $"- {string.Join("\n- ", comments)}");
                }

                var onlineAssembly = AssemblyPublicInterface.Load(bytes);

                var result = _analyzer.AnalyzeVersions(localAssembly, onlineAssembly);

                if (result.ActualBump != result.CalculatedBump)
                {
                    comments = result.GetAllComments();
                    if (_settings.IncludeHeader)
                    {
                        report = command.AssemblyFileName == command.PackageName
                                                        ? $"# {command.AssemblyFileName}\n\n"
                                                        : $"# {command.AssemblyFileName} ( {command.PackageName} )\n\n";
                    }
                    if (!_settings.OmitDisclaimer)
                    {
                        report += "*This is a sanity check that indicates whether the change is more severe than intended.  " +
                                  "It is not foolproof as not all changes can be detected by analyzing the public interface of an " +
                                  "assembly.  Therefore the results of this check are to be considered as a suggestion.  You may determine " +
                                  "that a particular change warrants a more severe version bump than is suggested by this check.*\n\n" +
                                  "**Please use your best judgment when updating the version.  You know your change better than this check can.**\n\n";
                    }
                    report += $"## Summary\n\n" +
                              $"Actual new version: `{localAssembly.Version}` ({result.ActualBump})\n" +
                              $"Suggested new version: `{onlineAssembly.Version.GetSuggestedVersion(result.CalculatedBump)}` ({result.CalculatedBump}).\n";
                    if (comments.Any())
                    {
                        report += $"\n## Details\n\n" +
                                  $"- {string.Join("\n- ", comments)}\n";
                    }
                }
            }
            catch (Exception e)
            {
                var sb    = new StringBuilder();
                var which = localAssembly == null ? "built" : "online";
                sb.AppendLine($"An error occurred while attempting to load the {which} assembly.  Analysis cannot continue.");
                sb.AppendLine("Exception:");
                sb.AppendLine(e.Message);
                sb.AppendLine(e.StackTrace);
                if (e.InnerException != null)
                {
                    sb.AppendLine("Inner Exception:");
                    sb.AppendLine(e.InnerException.Message);
                    sb.AppendLine(e.InnerException.StackTrace);
                }

                report = sb.ToString();
            }

            return(report);
        }