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); }
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); }