示例#1
0
		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);
		}
示例#2
0
		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());
    }
示例#4
0
		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);
			}
		}
示例#5
0
		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);
		}
示例#6
0
    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);
    }
示例#7
0
		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;
		}
示例#8
0
		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());
    }
示例#10
0
		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);
		}
示例#11
0
		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>");
			}
		}
示例#12
0
		public virtual bool Equals (XElement source, XElement target, ApiChanges changes)
		{
			return XNode.DeepEquals (source, target);
		}
示例#13
0
		public abstract void Modified (XElement source, XElement target, ApiChanges changes);
示例#14
0
		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);
			}
		}
示例#15
0
		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>");
			}
		}
示例#16
0
		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;
		}
示例#17
0
		public override void Modified (XElement source, XElement target, ApiChanges change)
		{
		}
示例#18
0
		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?
			}
		}
示例#19
0
		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?
			}
		}
示例#20
0
		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;
		}