From 2a7d26a8b08fa6776529e6b39aa09e7557a570f9 Mon Sep 17 00:00:00 2001 From: Bertrand Lorentz Date: Fri, 29 Mar 2013 17:50:07 +0100 Subject: [PATCH] audit: Add gen-apidiff-html tool to generate apidiff reports The gen-apidiff-html tool takes all apidiff files in a directory, merges them and then applies mono-api.xsl to produce a nice HTML page that shows the information about the API changes. The various resources needed by the HTML page (images, CSS, javascript) are added in the html/ directory. This is all adapted from an older version of the tools in Mono git master, under mcs/tools/corcompare. --- audit/gen-apidiff-html.cs | 73 +++++ audit/html/c.gif | Bin 0 -> 150 bytes audit/html/cormissing.css | 213 ++++++++++++++ audit/html/cormissing.js | 584 ++++++++++++++++++++++++++++++++++++++ audit/html/d.gif | Bin 0 -> 137 bytes audit/html/e.gif | Bin 0 -> 861 bytes audit/html/en.gif | Bin 0 -> 111 bytes audit/html/f.gif | Bin 0 -> 90 bytes audit/html/i.gif | Bin 0 -> 90 bytes audit/html/m.gif | Bin 0 -> 101 bytes audit/html/n.gif | Bin 0 -> 65 bytes audit/html/p.gif | Bin 0 -> 111 bytes audit/html/r.gif | Bin 0 -> 73 bytes audit/html/s.gif | Bin 0 -> 127 bytes audit/html/sc.gif | Bin 0 -> 70 bytes audit/html/se.gif | Bin 0 -> 73 bytes audit/html/sm.gif | Bin 0 -> 76 bytes audit/html/st.gif | Bin 0 -> 101 bytes audit/html/sx.gif | Bin 0 -> 73 bytes audit/html/tb.gif | Bin 0 -> 49 bytes audit/html/tm.gif | Bin 0 -> 64 bytes audit/html/tp.gif | Bin 0 -> 67 bytes audit/html/w.gif | Bin 0 -> 81 bytes audit/html/y.gif | Bin 0 -> 92 bytes audit/makefile | 5 +- audit/mono-api.xsl | 541 +++++++++++++++++++++++++++++++++++ 26 files changed, 1415 insertions(+), 1 deletion(-) create mode 100644 audit/gen-apidiff-html.cs create mode 100644 audit/html/c.gif create mode 100644 audit/html/cormissing.css create mode 100644 audit/html/cormissing.js create mode 100644 audit/html/d.gif create mode 100644 audit/html/e.gif create mode 100644 audit/html/en.gif create mode 100644 audit/html/f.gif create mode 100644 audit/html/i.gif create mode 100644 audit/html/m.gif create mode 100644 audit/html/n.gif create mode 100644 audit/html/p.gif create mode 100644 audit/html/r.gif create mode 100644 audit/html/s.gif create mode 100644 audit/html/sc.gif create mode 100644 audit/html/se.gif create mode 100644 audit/html/sm.gif create mode 100644 audit/html/st.gif create mode 100644 audit/html/sx.gif create mode 100644 audit/html/tb.gif create mode 100644 audit/html/tm.gif create mode 100644 audit/html/tp.gif create mode 100644 audit/html/w.gif create mode 100644 audit/html/y.gif create mode 100644 audit/mono-api.xsl diff --git a/audit/gen-apidiff-html.cs b/audit/gen-apidiff-html.cs new file mode 100644 index 000000000..b04e0c9b0 --- /dev/null +++ b/audit/gen-apidiff-html.cs @@ -0,0 +1,73 @@ +// +// gen-apidiff-html.cs - Converts a set of apidiff files to HTML by +// merging them and applying an XSL file. +// +// Author: +// Bertrand Lorentz (bertrand.lorentz@gmail.com) +// +// Copyright (C) 2013 Bertrand Lorentz +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + +using System; +using System.IO; +using System.Xml; +using System.Xml.Xsl; + +namespace Mono.AssemblyCompare +{ + public class Driver + { + static int Main (string [] args) + { + if (args.Length != 2) { + Console.WriteLine ("Usage: mono gen-apidiff-html.exe "); + return 1; + } + + string diff_dir = args[0]; + string out_file = args[1]; + + var all = new XmlDocument (); + all.AppendChild(all.CreateElement ("assemblies")); + foreach (string file in Directory.EnumerateFiles(diff_dir, "*.apidiff")) { + Console.WriteLine ("Merging " + file); + var doc = new XmlDocument (); + doc.Load (file); + foreach (XmlNode child in doc.GetElementsByTagName ("assembly")) { + XmlNode imported = all.ImportNode (child, true); + all.DocumentElement.AppendChild (imported); + } + } + + var transform = new XslCompiledTransform (); + transform.Load ("mono-api.xsl"); + var writer = new StreamWriter (out_file); + + Console.WriteLine (String.Format ("Transforming to {0}...", out_file)); + transform.Transform (all.CreateNavigator (), null, writer); + writer.Close (); + + return 0; + } + } +} + diff --git a/audit/html/c.gif b/audit/html/c.gif new file mode 100644 index 0000000000000000000000000000000000000000..02c347efd0b42a6a8be1239b8f1f65d386017246 GIT binary patch literal 150 zcmZ?wbhEHb6krfw*v!DtzyQQR03!Y~03i?ng+Mfj!T^dtS-@gCAQEH-1B= 0 && fView) + { + eltLink.src = 'tm.gif'; + elt.className = elt.className.slice (0, ich); + } + } +} + +function firstElement (elt) +{ + var c = elt.firstChild; + while (c != null) { + if (c.nodeType == 1) // Node.ELEMENT_NODE (IE6 does not recognize it) + return c; + c = c.nextSibling; + } + return null; +} + +function trimSrc (strSrc) +{ + return strSrc.slice (strSrc.lastIndexOf ('/') + 1, strSrc.lastIndexOf ('.')); +} + +function getChildrenByTagName (elt, strTag) +{ + strTag = strTag.toLowerCase (); + var rgChildren = new Array (); + var eltChild = firstElement (elt); + while (eltChild) + { + if (eltChild.tagName && eltChild.tagName.toLowerCase () == strTag) + rgChildren.push (eltChild); + eltChild = eltChild.nextSibling; + } + return rgChildren; +} + +function viewAll (elt, dictTypes) +{ + var fView = isShown (elt, dictTypes); + + var aCounts = new Array (4); + for (i = 0; i < 4; i++) + aCounts [i] = 0; + var rgElts = getChildrenByTagName (elt, 'DIV'); + for (iElt in rgElts) { + var aChildRet = viewAll (rgElts [iElt], dictTypes); + if (aChildRet != null) { + fView = true; + for (i = 0; i < 4; i++) + aCounts [i] += aChildRet [i]; + } + } + + elt.style.display = fView ? '' : 'none'; + + if (!fView) + return null; + + rgShownDivs = getChildrenByTagName (elt, 'DIV'); + for (i = 0; i < rgShownDivs.length; i++) { + var cDiv = rgShownDivs [i]; + if (cDiv.style.display == 'none') + continue; + incrementCount (cDiv, aCounts, dictTypes); + } + + // update the numbers + rgSpans = getChildrenByTagName (elt, 'SPAN'); + for (iSpan in rgSpans) { + var cSpan = rgSpans [iSpan]; + var cImage = firstElement (cSpan); + if (cImage == null) + continue; + switch (trimSrc (cImage.src)) { + case 'st': cSpan.lastChild.nodeValue = ": " + aCounts [0]; break; + case 'sm': cSpan.lastChild.nodeValue = ": " + aCounts [1]; break; + case 'sx': cSpan.lastChild.nodeValue = ": " + aCounts [2]; break; + case 'se': cSpan.lastChild.nodeValue = ": " + aCounts [3]; break; + } + } + return aCounts; +} + +function isShown (elt, dictTypes) +{ + if (!isShownMarkType (elt, dictTypes)) + return false; + + return true; +} + +function isShownMarkType (elt, dictTypes) +{ + var rgImages = getChildrenByTagName (elt, 'IMG'); + var cImages = rgImages.length; + for (var iImage = 0; iImage < cImages; iImage++) + { + var strImage = trimSrc (rgImages [iImage].src); + if (dictTypes [strImage]) + return true; + } + return false; +} + +function incrementCount (cDiv, aCounts, dictTypes) +{ + switch (cDiv.className) { + case 'y': case 'y_': // assembly + case 'n': case 'n_': // namespace + // types + case 'c': case 'c_': case 'i': case 'i_': + case 'en': case 'en_': case 'd': case 'd_': + // members + case 'r': case 'r_': case 'x': case 'x_': case 'm': case 'm_': + case 'f': case 'f_': case 'e': case 'e_': case 'p': case 'p_': + case 'o': case 'o_': case 'a': case 'a_': + var rgImgs = getChildrenByTagName (cDiv, 'IMG'); + for (iImg = 0; iImg < rgImgs.length; iImg++) { + var cImg = rgImgs [iImg]; + if (cImg.className != 't') + continue; + var stype = trimSrc (cImg.src); + if (!dictTypes [stype]) + continue; + switch (stype) { + case "st": aCounts [0]++; break; + case "sm": aCounts [1]++; break; + case "sx": aCounts [2]++; break; + case "se": aCounts [3]++; break; + default: + continue; + } + break; + } + break; + } +} + +/* just for debugging use now. +function firstInnerText (elt) +{ + var s = elt.innerText; + if (s != null) + return s; + var n = elt.firstChild; + while (n != null) { + s = n.nodeValue; + if (s != null && s.replace (/^\s+/g, '') != '') + return s; + s = firstInnerText (n); + if (s != null) + return s; + n = n.nextSibling; + } + return s; +} +*/ + +function getView (elt) +{ + var eltLink = firstElement (elt); + if (eltLink != null && eltLink.className == 't') // toggle + { + var ich = elt.className.indexOf ('_'); + if (ich < 0) + return true; + } + return false; +} + +function getParentDiv (elt) +{ + if (elt) + { + do + { + elt = elt.parentNode; + } + while (elt && elt.tagName != 'DIV'); + } + + return elt; +} + +function getName (elt) +{ + var rgSpans = getChildrenByTagName (elt, 'SPAN'); + for (var iSpan = 0; iSpan < rgSpans.length; iSpan ++) + { + var span = rgSpans [iSpan]; + if (span.className == 'l') // label + { + if (span.innerText) + return span.innerText; + else + return span.firstChild.nodeValue; + } + } + return null; +} + +function clickHandler (evt) +{ + var elt; + if (document.layers) + elt = evt.taget; + else if (window.event && window.event.srcElement) + { + elt = window.event.srcElement; + evt = window.event; + } + else if (evt && evt.stopPropagation) + elt = evt.target; + + if (!elt.className && elt.parentNode) + elt = elt.parentNode; + + if (elt.className == 'l') // label + { + var strClass; + var strField; + var strNamespace; + var strAssembly; + var strFieldType; + + elt = getParentDiv (elt); + var strEltClass = elt.className; + if (strEltClass.charAt (strEltClass.length - 1) == '_') + strEltClass = strEltClass.slice (0, strEltClass.length - 1); + + if (strEltClass == 'x') // constructor + { + strField = 'ctor'; + elt = getParentDiv (elt); + } + else + if (strEltClass == 'm' || // method + strEltClass == 'p' || // property + strEltClass == 'e' || // event + strEltClass == 'f') // field + { + strFieldType = strEltClass; + strField = getName (elt); + var match = strField.match ( /[\.A-Z0-9_]*/i ); + if (match) + strField = match [0]; + elt = getParentDiv (elt); + + } + + var strEltClass = elt.className; + if (strEltClass.charAt (strEltClass.length - 1) == '_') + strEltClass = strEltClass.slice (0, strEltClass.length - 1); + + if (strEltClass == 'c' || // class + strEltClass == 's' || // struct + strEltClass == 'i' || // struct + strEltClass == 'd' || // delegate + strEltClass == 'en') // enum + { + strClass = getName (elt); + if (strEltClass == 'en') + strField = null; + elt = getParentDiv (elt); + } + + var strEltClass = elt.className; + if (strEltClass.charAt (strEltClass.length - 1) == '_') + strEltClass = strEltClass.slice (0, strEltClass.length - 1); + + if (strEltClass == 'n') + { + strNamespace = getName (elt); + elt = getParentDiv (elt); + } + + var strEltClass = elt.className; + if (strEltClass.charAt (strEltClass.length - 1) == '_') + strEltClass = strEltClass.slice (0, strEltClass.length - 1); + + if (strEltClass == 'y') + { + strAssembly = getName (elt); + } + + if (evt.ctrlKey) + { + var strRoot = 'http://anonsvn.mono-project.com/viewcvs/trunk/mcs/class/'; + var strExtra = ''; + + if (strAssembly) + { + if (strAssembly == 'mscorlib') + strAssembly = 'corlib'; + else if (strAssembly == 'System.Xml') + strAssembly = 'System.XML'; + + strRoot = strRoot + strAssembly + '/'; + if (strNamespace) + { + strRoot = strRoot + strNamespace + '/'; + if (strClass) + { + strRoot += strClass + '.cs'; + strExtra += '?view=markup'; + } + } + window.open (strRoot + strExtra, 'CVS'); + } + } + else if (strNamespace) + { + if (document.getElementById ('TargetMsdn1').checked) + { + var re = /\./g ; + strNamespace = strNamespace.toLowerCase ().replace (re, ''); + if (strClass) + strNamespace += strClass.toLowerCase () + 'class'; + if (strField) + strNamespace += strField; + if (strClass || strField) + strNamespace += 'topic'; + + window.open ('http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrf' + strNamespace + '.asp', 'MSDN'); + + } + else + { + if (strClass) + strNamespace += '.' + strClass; + if (strField) + strNamespace += '.' + strField; + if (document.getElementById ('TargetMonodoc').checked) + { + var category = null; + if (strClass == null) + category = "N:"; + else if (strField == null) + category = "T:"; + else { + switch (strFieldType) { + case 'f': category = "F:"; break; + case 'p': category = "P:"; break; + case 'm': category = "M:"; break; + case 'e': category = "E:"; break; + } + } + if (category != null) + window.open ('http://www.go-mono.com/docs/monodoc.ashx?link=' + category + strNamespace); + } + else + { + window.open ('http://msdn2.microsoft.com/library/' + strNamespace + '.aspx', 'MSDN'); + } + } + } + } + else + { + if (elt.parentNode && elt.parentNode.className == 't') // toggle + elt = elt.parentNode; + else if (elt.className != 't') // toggle + return; + + while (elt != null && elt.tagName != 'DIV') + elt = elt.parentNode; + + if (evt.shiftKey) + { + var rgElts = getChildrenByTagName (elt, 'DIV'); + var cElts = rgElts.length; + if (cElts != 0) + { + var fView = false; + var iElt; + for (iElt = 0; iElt < cElts; iElt ++) + { + if (getView (rgElts [iElt])) + { + fView = true; + break; + } + } + for (iElt = 0; iElt < cElts; iElt ++) + { + setView (rgElts [iElt], !fView); + } + } + } + else if (evt.ctrlKey) + { + setView (elt, true); + var eltParent = getParentDiv (elt); + while (eltParent) + { + var rgSiblings = getChildrenByTagName (eltParent, 'DIV'); + var cSiblings = rgSiblings.length; + for (var iSibling = 0; iSibling < cSiblings; iSibling++) + { + var eltSibling = rgSiblings [iSibling]; + if (eltSibling != elt) + { + setView (eltSibling, false); + } + } + elt = eltParent; + eltParent = getParentDiv (elt); + } + } + else + toggle (elt); + } + + return false; +} + +function filterTree () +{ + var eltMissing = document.getElementById ('missing'); + var eltTodo = document.getElementById ('todo'); + var eltExtra = document.getElementById ('extra'); + var eltErrors = document.getElementById ('errors'); + var eltStable = document.getElementById ('stable'); + + var dictTypes = new Object (); + if (eltMissing.checked) + dictTypes ['sm'] = true; + if (eltTodo.checked) + dictTypes ['st'] = true; + if (eltErrors.checked) + dictTypes ['se'] = true; + if (eltExtra.checked) + dictTypes ['sx'] = true; + if (eltStable.checked) + dictTypes ['sc'] = true; + + viewAll (document.getElementById ('ROOT'), dictTypes); +} + +function addAndFilter () +{ + var newInput = document.getElementById ('NewFilterTarget'); + var newAttr = newInput.value; + if (newAttr.length > 0) { + var selection = document.getElementById ('FilteredAttributes'); + var newElem = document.createElement ('option'); + newElem.appendChild (document.createTextNode (newAttr)); + selection.appendChild (newElem); + newInput.value = ''; + filterTree (); + } +} + +function removeAndFilter () +{ + var selection = document.getElementById ('FilteredAttributes'); + if (selection.selectedIndex >= 0) { + var newInput = document.getElementById ('NewFilterTarget'); + if (newInput.value.length == 0) + newInput.value = selection.options [selection.selectedIndex].firstChild.nodeValue; + selection.removeChild (selection.options [selection.selectedIndex]); + filterTree (); + } +} + +function selectMissing () +{ + toggleFilter ('missing'); +} + +function selectTodo () +{ + toggleFilter ('todo'); +} + +function selectExtra () +{ + toggleFilter ('extra'); +} + +function selectErrors () +{ + toggleFilter ('errors'); +} + +function selectStable () +{ + toggleFilter ('stable'); +} + +function toggleAttributeFilter (attrName) +{ + toggleFilter (attrName); +} + +function toggleFilter (strFilter) +{ + var eltTodo = document.getElementById ('todo'); + var eltMissing = document.getElementById ('missing'); + var eltExtra = document.getElementById ('extra'); + var eltErrors = document.getElementById ('errors'); + + var eltToggle = document.getElementById (strFilter); + if (window && window.event && window.event.shiftKey) + { + eltMissing.checked = eltTodo.checked = eltExtra.checked = eltErrors.checked = false; + eltToggle.checked = true; + } + else + if (!eltTodo.checked && !eltMissing.checked && !eltExtra.checked && !eltErrors.checked) + { + eltMissing.checked = eltTodo.checked = eltExtra.checked = eltErrors.checked = true; + eltToggle.checked = false; + } + filterTree (); +} + +function onLoad () +{ + var eltMissing = document.getElementById ('missing'); + var eltTodo = document.getElementById ('todo'); + var eltExtra = document.getElementById ('extra'); + var eltErrors = document.getElementById ('errors'); + eltMissing.checked = eltTodo.checked = eltExtra.checked = eltErrors.checked = true; + filterTree (); +} + +if (document.layers) +{ + document.captureEvents (Event.MOUSEUP); + document.onmouseup = clickHandler; +} +else if (document.attachEvent) +{ + document.attachEvent('onclick', clickHandler); +} +else if (document.addEventListener) +{ + document.addEventListener('click', clickHandler, false); +} +else + document.onclick = clickHandler; + diff --git a/audit/html/d.gif b/audit/html/d.gif new file mode 100644 index 0000000000000000000000000000000000000000..c9735952f33ce1c324694af50ec016013c1224b3 GIT binary patch literal 137 zcmZ?wbhEHb6krfwSj524z|a5$2M!$g&+wmtf#Lsu5D5f|KUu)E4u}M)WnlJ;*mY%J z0IQ>Rr?yLB;Y9&<)|AXy)73<>qhqpP?K;A+JV%cIkE*{)SabT}vvJ#!xHJ?B8O$6W fFTO0eByS&*7Yrr54 zOK4GJG1x$Z#c)fIav~!tqNR_uWSNl_*^&zjij`3n)u@LQz0nz6(a6IOXfll*=!XOf zVGS6hVM!}ISPVAMV6~i6nVhK1mXYXVEm>7o<12DuK{30s@e!vn0A93XG-|ODKcLAp zcEAb2D1wdw09@<<>;<4+_zX^?= zj4Vn|Y~?OE&nV?vHkTr_{)kCtFn5w4nF+_RhGfWpN&>1Ep^rJNf+re~SnMgEash$RK9` literal 0 HcmV?d00001 diff --git a/audit/html/i.gif b/audit/html/i.gif new file mode 100644 index 0000000000000000000000000000000000000000..56cd032a565f89845e0ac7ff7a332ec5d4495e5e GIT binary patch literal 90 zcmZ?wbhEHb6krfwn8?7;(9m$;zySsZhX4QnEB<5wG8h-n&}rR1`G*fZuHa$v51|rfXf^9sd50pGAy;!5RS0;T?Pc literal 0 HcmV?d00001 diff --git a/audit/html/m.gif b/audit/html/m.gif new file mode 100644 index 0000000000000000000000000000000000000000..75fe3586d48bb17baa6d988cd2492af535a73fd8 GIT binary patch literal 101 zcmZ?wbhEHb6krfwSj50^;J|?fAYf?t&+wmtf#Lsu5D5f2AOfU@f!Qcx*PVX`r(D%! yOD8FAxDz{_)zMLl1=izYEJSOWlnL?d$m literal 0 HcmV?d00001 diff --git a/audit/html/n.gif b/audit/html/n.gif new file mode 100644 index 0000000000000000000000000000000000000000..f6fa746304d8d763eec15a0ebcb39078b3b22ac1 GIT binary patch literal 65 zcmZ?wbhEHb6krfwXkY+=|NsB%fM}2i1Cv5e|H{*Q8Te9!ua@{uyIA%obK#GkgWD#? Pac){&J?q>X5e91jW_1^A literal 0 HcmV?d00001 diff --git a/audit/html/p.gif b/audit/html/p.gif new file mode 100644 index 0000000000000000000000000000000000000000..b79d0dd7edb10b694efddae3efd5c630810141fd GIT binary patch literal 111 zcmZ?wbhEHb6krfwSj524(9i%R4jeeZz`*eT|9>C}0g69azziJ_2~x|zY~r!&&c6x0 zmYy8>9eaFLMyXto#I74F}H9XEpPqi{XBr~m^4lhU02m8a)29qkl4SejdV cJB3ec{&nA{8Esmfb5&Q@PI12O#>ij|0B;l;9{>OV literal 0 HcmV?d00001 diff --git a/audit/html/s.gif b/audit/html/s.gif new file mode 100644 index 0000000000000000000000000000000000000000..f2fd5c8aee22abf3fb7bddd26d8a404834e485c8 GIT binary patch literal 127 zcmZ?wbhEHb6krfwSj51<(9qBT#{U_B5D0)mAX@P!3y8&_10q0b8JJxvcBTJ0FT$Q| zxmmBXdx1cB#Ub&yO?%JKo+ogl{EHx)to||sfxd&X8w*t!7!EG|_@hLp Q+iyi%;)T4Ow^xH#$XKq@BJ4) literal 0 HcmV?d00001 diff --git a/audit/html/se.gif b/audit/html/se.gif new file mode 100644 index 0000000000000000000000000000000000000000..1c46eaa588795488e4d65724de4a77e06fe3c5bc GIT binary patch literal 73 zcmZ?wbhEHbY+D@2z+epkbpaT& literal 0 HcmV?d00001 diff --git a/audit/html/sm.gif b/audit/html/sm.gif new file mode 100644 index 0000000000000000000000000000000000000000..0c7194786d5685c6767a440632b3bf4ea2624dd0 GIT binary patch literal 76 zcmZ?wbhEHb*x10p@c;jR#h)w;AfN*xK=KSsvUB=7l{VVWaBehQ a;FcO0Ju#NS-SKdT?2=t2?^cU2SOWktUKcw6 literal 0 HcmV?d00001 diff --git a/audit/html/st.gif b/audit/html/st.gif new file mode 100644 index 0000000000000000000000000000000000000000..067582cb398506ed795358cbadf68d89996691a2 GIT binary patch literal 101 zcmZ?wbhEHb{RaUct@x7##AVO{5g@e;%vu?0PKyHe sCdI_GO>$jD#~0O*|_$N&HU literal 0 HcmV?d00001 diff --git a/audit/html/sx.gif b/audit/html/sx.gif new file mode 100644 index 0000000000000000000000000000000000000000..2c8ca54792980ba8d37687ee1b06f7a6a5009b9d GIT binary patch literal 73 zcmZ?wbhEHb1ev35*BQ=fyEGSOWly>mp_V literal 0 HcmV?d00001 diff --git a/audit/html/y.gif b/audit/html/y.gif new file mode 100644 index 0000000000000000000000000000000000000000..08f00d4ea11f8d253bff1cc22a94a23d41e0c30f GIT binary patch literal 92 zcmZ?wbhEHb6krfwn8?7;(9m$;zySsZhX4QnEB<5wG8h + + + + + + + + + + + Gtk# API Status + + + + + +

+

Gtk# API Status

+

+ + + + + + + + + + + + + + + + + + + + + + + +
TODO + Removed
Added + Changed
Stable
+

+ +
+ +
+

+ Legend :
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Assembly + Namespace + Class + Struct
Interface + Delegate + Enum + Method
Field + Property + Event + Attribute
+ +

+ + +
+ + + + + + + + + + + +
+ + y + + + + +
+
+ + + + + + + + + + +
+ + n + + + + +
+
+ + + + + + + +
+ + c + + + + + + + +
+
+ + + + +
+ + s + + + + +
+
+ + + + + + + + + + + +
+ + i + + + + +
+
+ + + + + + + + + +
+ + i + + + + +
+
+ + + + + + + + + + +
+ + w + + + + +
+
+ + + + +
+ + d + + + + +
+
+ + + + +
+ + en + + + + +
+
+ + + + + + + + + + +
+ + m + + + + +
+
+ + + + + + + + + + +
+ + p + + + + +
+
+ + + + + + + + + + +
+ + e + + + + +
+
+ + + + + + + + + + +
+ + x + m + + + + +
+
+ + + + + + + + + + +
+ + f + + + + +
+
+ + + + + + + + + +
+ + o + m + + + + +
+
+ + + + + + + + + + +
+ + r + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + _ + + + + + + se.gif + t + + + + + + st.gif + t + + + + + No TODO description + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + a + tb + +
+
+
+ + + + + + : + + % + + + + + : + + + + + : + + + + + : + + + + + : + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + WARNING: + + + + + + + + + + + +