public override void Modified (XElement source, XElement target, ApiChanges diff) { SourceAssembly = source.GetAttribute ("name"); TargetAssembly = target.GetAttribute ("name"); // TODO: version // ? custom attributes ? comparer.Compare (source, target); }
public override bool Equals (XElement source, XElement target, ApiChanges changes) { if (base.Equals (source, target, changes)) return true; var name = source.GetAttribute ("name"); var srcValue = source.GetAttribute ("value"); var tgtValue = target.GetAttribute ("value"); var change = new ApiChange (); change.Header = "Modified " + GroupName; if (State.BaseType == "System.Enum") { change.Append (name).Append (" = "); if (srcValue != tgtValue) { change.AppendModified (srcValue, tgtValue, true); } else { change.Append (srcValue); } } else { RenderFieldAttributes (source.GetFieldAttributes (), target.GetFieldAttributes (), change); var srcType = source.GetTypeName ("fieldtype"); var tgtType = target.GetTypeName ("fieldtype"); if (srcType != tgtType) { change.AppendModified (srcType, tgtType, true); } else { change.Append (srcType); } change.Append (" "); change.Append (name); if (srcType == "string" && srcValue != null) srcValue = "\"" + srcValue + "\""; if (tgtType == "string" && tgtValue != null) tgtValue = "\"" + tgtValue + "\""; if (srcValue != tgtValue) { change.Append (" = "); if (srcValue == null) srcValue = "null"; if (tgtValue == null) tgtValue = "null"; change.AppendModified (srcValue, tgtValue, true); } else if (srcValue != null) { change.Append (" = "); change.Append (srcValue); } change.Append (";"); } changes.Add (source, target, change); return false; }
public void ApproveExample() { var engine = new ComparerEngine(); var diff = engine.CreateDiff("ExampleV1.dll", "ExampleV2.dll"); var stringBuilder = new StringWriter(); var formatter = new APIUpgradeToMarkdownFormatter(); formatter.WriteOut(ApiChanges.FromDiff(diff), stringBuilder); Approvals.Verify(stringBuilder.ToString()); }
public override void Modified (XElement source, XElement target, ApiChanges differences) { var output = Output; State.Output = new StringWriter (); comparer.Compare (source, target); var s = Output.ToString (); State.Output = output; if (s.Length > 0) { Output.WriteLine ("<h2>Namespace {0}</h2>", target.Attribute ("name").Value); Output.WriteLine (s); } }
public override void Modified (XElement source, XElement target, ApiChanges diff) { SourceAssembly = source.GetAttribute ("name"); TargetAssembly = target.GetAttribute ("name"); var sb = source.GetAttribute ("version"); var tb = target.GetAttribute ("version"); if (sb != tb) { Output.WriteLine ("<h4>Assembly Version Changed: {0} vs {1}</h4>", tb, sb); } // ? custom attributes ? comparer.Compare (source, target); }
static bool Compare(CompareSet compareSet, bool showAllVersions = true, bool nonInteractive = false, string reportPath = null) { var engine = new ComparerEngine(); var diff = engine.CreateDiff(compareSet.LeftAssemblyGroup, compareSet.RightAssemblyGroup); var breakingChanges = BreakingChangeFinder.Find(diff) .ToList(); var hasBreakingChange = breakingChanges.Any(); if (!showAllVersions && !hasBreakingChange) { return(true); } Console.Out.Write("Checking {0}", compareSet); if (hasBreakingChange) { Console.Out.WriteLine(": {0} Breaking Changes found", breakingChanges.Count); } else { Console.Out.WriteLine(": No breaking changes found"); } var resultFile = reportPath ?? Path.Combine(Path.GetTempPath(), Guid.NewGuid() + ".md"); using (var fileStream = File.OpenWrite(resultFile)) using (var into = new StreamWriter(fileStream)) { var formatter = new APIUpgradeToMarkdownFormatter(); formatter.WriteOut(ApiChanges.FromDiff(diff), @into); @into.Flush(); @into.Close(); fileStream.Close(); } Console.Out.WriteLine(resultFile); if (!nonInteractive) { Process.Start(resultFile); } return(!hasBreakingChange); }
public override bool Equals (XElement source, XElement target, ApiChanges changes) { if (base.Equals (source, target, changes)) return true; var change = new ApiChange (); change.Header = "Modified " + GroupName; RenderMethodAttributes (source, target, change); RenderReturnType (source, target, change); RenderName (source, target, change); RenderGenericParameters (source, target, change); RenderParameters (source, target, change); changes.Add (source, target, change); return false; }
public override bool Equals (XElement source, XElement target, ApiChanges changes) { if (base.Equals (source, target, changes)) return true; var change = new ApiChange (); change.Header = "Modified " + GroupName; change.Append ("public event "); var srcEventType = source.GetTypeName ("eventtype"); var tgtEventType = target.GetTypeName ("eventtype"); if (srcEventType != tgtEventType) { change.AppendModified (srcEventType, tgtEventType, true); } else { change.Append (srcEventType); } change.Append (" "); change.Append (source.GetAttribute ("name")).Append (";"); return false; }
public void ApproveNServiceBus() { var packages = new[] { "4.6.4", "5.0.0-beta0004" }; var nugetCacheDirectory = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "NuGet", "Cache"); var repo = new AggregateRepository(new[] { PackageRepositoryFactory.Default.CreateRepository(nugetCacheDirectory), PackageRepositoryFactory.Default.CreateRepository("https://www.nuget.org/api/v2"), PackageRepositoryFactory.Default.CreateRepository("https://www.myget.org/F/particular/"), }); var packageManager = new PackageManager(repo, "packages"); foreach (var v in packages) { if (!Directory.Exists(Path.Combine("packages", "NServiceBus." + v))) { packageManager.InstallPackage("NServiceBus", SemanticVersion.Parse(v)); } } var file1 = Path.Combine("packages", "NServiceBus." + packages[0], "lib", "net40", "NServiceBus.Core.dll"); var file2 = Path.Combine("packages", "NServiceBus." + packages[1], "lib", "net45", "NServiceBus.Core.dll"); var engine = new ComparerEngine(); var diff = engine.CreateDiff(file1, file2); var stringBuilder = new StringWriter(); var formatter = new APIUpgradeToMarkdownFormatter(); formatter.WriteOut(ApiChanges.FromDiff(diff), stringBuilder); Approvals.Verify(stringBuilder.ToString()); }
public override bool Equals (XElement source, XElement target, ApiChanges changes) { RenderAttributes (source, target, changes); // We don't want to compare attributes. RemoveAttributes (source); RemoveAttributes (target); return base.Equals (source, target, changes); }
void Modify (ApiChanges modified) { foreach (var changes in modified) { Output.WriteLine ("<p>{0}:</p>", changes.Key); Output.WriteLine ("<pre>"); foreach (var element in changes.Value) { Output.Write ("<div {0}>", element.Breaking ? "data-is-breaking" : "data-is-non-breaking"); foreach (var line in element.Member.ToString ().Split ('\n')) Output.WriteLine ("\t{0}", line); Output.Write ("</div>"); } Output.WriteLine ("</pre>"); } }
public virtual bool Equals (XElement source, XElement target, ApiChanges changes) { return XNode.DeepEquals (source, target); }
public abstract void Modified (XElement source, XElement target, ApiChanges changes);
public override void Modified (XElement source, XElement target, ApiChanges diff) { // hack - there could be changes that we're not monitoring (e.g. attributes properties) var output = Output; State.Output = new StringWriter (); var sb = source.GetAttribute ("base"); var tb = target.GetAttribute ("base"); if (sb != tb) { Output.Write ("Modified base type: "); Output.WriteLine (new ApiChange ().AppendModified (sb, tb, true).Member.ToString ()); } ccomparer.Compare (source, target); icomparer.Compare (source, target); fcomparer.Compare (source, target); pcomparer.Compare (source, target); ecomparer.Compare (source, target); mcomparer.Compare (source, target); var si = source.Element ("classes"); if (si != null) { var ti = target.Element ("classes"); kcomparer = new NestedClassComparer (); kcomparer.Compare (si.Elements ("class"), ti == null ? null : ti.Elements ("class")); } var s = (Output as StringWriter).ToString (); State.Output = output; if (s.Length > 0) { Output.WriteLine ("<h3>Type Changed: {0}.{1}</h3>", State.Namespace, GetTypeName (target)); Output.WriteLine (s); } }
void Modify (ApiChanges modified) { foreach (var changes in modified) { Output.WriteLine ("<p>{0}:</p>", changes.Key); Output.WriteLine ("<pre>"); foreach (var element in changes.Value) { foreach (var line in element.Member.ToString ().Split ('\n')) Output.WriteLine ("\t{0}", line); } Output.WriteLine ("</pre>"); } }
public override bool Equals (XElement source, XElement target, ApiChanges changes) { if (base.Equals (source, target, changes)) return true; XElement srcGetter, srcSetter; XElement tgtGetter, tgtSetter; GetAccessors (source, out srcGetter, out srcSetter); GetAccessors (target, out tgtGetter, out tgtSetter); List<XElement> srcIndexers = null; List<XElement> tgtIndexers = null; bool isIndexer = false; if (srcGetter != null) { srcIndexers = srcGetter.DescendantList ("parameters", "parameter"); tgtIndexers = tgtGetter.DescendantList ("parameters", "parameter"); isIndexer = srcIndexers != null && srcIndexers.Count > 0; } var change = new ApiChange (); change.Header = "Modified " + GroupName; RenderMethodAttributes (GetMethodAttributes (srcGetter, srcSetter), GetMethodAttributes (tgtGetter, tgtSetter), change); RenderPropertyType (source, target, change); if (isIndexer) { RenderIndexers (srcIndexers, tgtIndexers, change); } else { RenderName (source, target, change); } RenderGenericParameters (source, target, change); RenderAccessors (srcGetter, tgtGetter, srcSetter, tgtSetter, change); changes.Add (source, target, change); return false; }
public override void Modified (XElement source, XElement target, ApiChanges change) { }
protected void RenderAttributes (XElement source, XElement target, ApiChanges changes) { var srcObsolete = source.GetObsoleteMessage (); var tgtObsolete = target.GetObsoleteMessage (); if (srcObsolete == tgtObsolete) return; // nothing changed if (srcObsolete == null) { if (tgtObsolete == null) return; // neither is obsolete var change = new ApiChange (); change.Header = "Obsoleted " + GroupName; if (State.Colorize) change.Append ("<span style='color:gray'>"); change.Append ("[Obsolete ("); if (tgtObsolete != string.Empty) change.Append ("\"").Append (tgtObsolete).Append ("\""); change.Append ("]\n"); change.Append (GetDescription (target)); if (State.Colorize) change.Append ("</span>"); change.AnyChange = true; changes.Add (source, target, change); } else if (tgtObsolete == null) { // Made non-obsolete. Do we care to report this? } else { // Obsolete message changed. Do we care to report this? } }
protected void RenderAttributes (XElement source, XElement target, ApiChanges changes) { var srcObsolete = source.GetObsoleteMessage (); var tgtObsolete = target.GetObsoleteMessage (); if (srcObsolete == tgtObsolete) return; // nothing changed if (srcObsolete == null) { if (tgtObsolete == null) return; // neither is obsolete var change = new ApiChange (); change.Header = "Obsoleted " + GroupName; change.Append (string.Format ("<span class='obsolete obsolete-{0}' data-is-non-breaking>", ElementName)); change.Append ("[Obsolete ("); if (tgtObsolete != string.Empty) change.Append ("\"").Append (tgtObsolete).Append ("\""); change.Append (")]\n"); change.Append (GetDescription (target)); change.Append ("</span>"); change.AnyChange = true; changes.Add (source, target, change); } else if (tgtObsolete == null) { // Made non-obsolete. Do we care to report this? } else { // Obsolete message changed. Do we care to report this? } }
public override bool Equals (XElement source, XElement target, ApiChanges changes) { if (base.Equals (source, target, changes)) return true; XElement srcGetter, srcSetter; XElement tgtGetter, tgtSetter; GetAccessors (source, out srcGetter, out srcSetter); GetAccessors (target, out tgtGetter, out tgtSetter); var change = new ApiChange (); change.Header = "Modified " + GroupName; RenderMethodAttributes (GetMethodAttributes (srcGetter, srcSetter), GetMethodAttributes (tgtGetter, tgtSetter), change); RenderPropertyType (source, target, change); RenderName (source, target, change); RenderGenericParameters (source, target, change); RenderAccessors (srcGetter, tgtGetter, srcSetter, tgtSetter, change); changes.Add (source, target, change); return false; }