public override void Run(IEnumerable <string> args) { string rootdir = ""; string omitlist = ""; string processlist = ""; string pattern = ""; List <string> extras = CommandUtils.ProcessFileArgs(args, ref rootdir, ref omitlist, ref processlist, ref pattern ); string message = "For internal use only."; string sigil = "To be added."; bool nocheck = false; bool nosigil = false; var opt = new OptionSet { { "m|message=", (m) => message = m }, { "s|sigil=", (s) => sigil = s }, { "no-check-browsable", (n) => nocheck = n != null }, { "no-check-TBA", (t) => nosigil = t != null } }; extras = opt.Parse(extras); CommandUtils.ThrowOnFiniteExtras(extras); Func <XElement, bool> hassigil; Func <XDocument, bool> typehassigil; Func <XElement, bool> qualifies; if (nosigil) { // Mark types and members internal, regardless of whether the summaries are filled out hassigil = (x) => true; typehassigil = (x) => true; } else { hassigil = (e) => e.Element("Docs").Element("summary").Value == sigil; typehassigil = (t) => t.Element("Type").Element("Docs").Element("summary").Value == sigil; } if (!nocheck) { qualifies = (e) => { return(e.Elements("Attributes") .Any((XElement child) => child.Elements("Attribute") .Any((XElement name) => name.Value.Contains("EditorBrowsableState.Never"))) && hassigil(e)); }; } else { qualifies = hassigil; } foreach (string file in CommandUtils.GetFileList(processlist, omitlist, rootdir, pattern)) { XDocument xdoc = new XDocument(XElement.Load(file)); // Find every member that has the internal marker and summary="To be added." (or the provided sigil) XElement memberRoot = xdoc.Element("Type").Element("Members"); if (memberRoot == null || !memberRoot.Descendants().Any()) { continue; } IEnumerable <XElement> hits = memberRoot.Elements("Member").Where(s => qualifies(s)); foreach (XElement x in hits) { x.Element("Docs").Element("summary").Value = message; } if (typehassigil(xdoc)) { xdoc.Element("Type").Element("Docs").Element("summary").Value = message; } CommandUtils.WriteXDocument(xdoc, file); } }
public override void Run(IEnumerable <string> args) { // throw new NotImplementedException(); string updatedDir = ""; string omitlist = ""; string processlist = ""; string pattern = ""; List <string> extras = CommandUtils.ProcessFileArgs(args, ref updatedDir, ref omitlist, ref processlist, ref pattern); string oldFilesDir = ""; bool typeOnly = false; string reportFile = ""; bool nosigil = false; var options = new OptionSet { { "previous=", (p) => oldFilesDir = p }, { "typeonly", (t) => typeOnly = t != null }, { "reportfile=", (r) => reportFile = r }, { "no-check-TBA", (t) => nosigil = t != null } }; extras = options.Parse(extras); CommandUtils.ThrowOnFiniteExtras(extras); if (String.IsNullOrEmpty(oldFilesDir)) { throw new ArgumentException("You must supply a parallel directory from which to source new content with 'previous='."); } if (String.IsNullOrEmpty(reportFile) || !reportFile.EndsWith(".csv")) { throw new ArgumentException("'reportfile=' must be used, and its value must end with '.csv'."); } string bareReportDir = Path.GetDirectoryName(Path.GetFullPath(reportFile)); if (!Directory.Exists(bareReportDir)) { throw new ArgumentException(bareReportDir + " does not exist."); } IEnumerable <string> updated = CommandUtils.GetFileList(processlist, omitlist, updatedDir, pattern); StreamWriter reportStream = new StreamWriter(reportFile); reportStream.WriteLine(String.Format(CommandUtils.CSVFormatString(5), "File Name", "Type", "Member", "Need file summary", "Need member summary")); Func <XElement, bool> hasSigil = null; if (nosigil) { hasSigil = (XElement e) => true; } else { hasSigil = (XElement e) => e.Element("Docs").Element("summary").Value == "To be added."; } //Func<XElement, bool> needSummary = (XElement e) => e.Element("Docs").Element("summary").Value == "To be added."; Func <XElement, string> MemberLine = (XElement e) => { return(string.Format( CommandUtils.CSVFormatString(5), "", "", e.Attribute("MemberName").Value, "", hasSigil(e) ? "y" : "n")); }; List <string> toWrite = new List <string>(); foreach (string updatedXMLFile in updated) { bool fileLineAdded = false; XDocument updatedXDoc = XDocument.Load(updatedXMLFile); Func <string> FileLine = () => { return(string.Format( CommandUtils.CSVFormatString(5), updatedXMLFile, updatedXDoc.Element("Type").Attribute("FullName").Value, "", hasSigil(updatedXDoc.Element("Type")) ? "y" : "n", "")); }; string oldXMLFile = EcmaXmlHelper.GetParallelFilePathFor(updatedXMLFile, oldFilesDir, updatedDir); XDocument oldXDoc = File.Exists(oldXMLFile) ? XDocument.Load(oldXMLFile) : null; if (null == oldXDoc && hasSigil(updatedXDoc.Element("Type"))) { toWrite.Add(FileLine()); fileLineAdded = true; } IEnumerable <XElement> newMembers = EcmaXmlHelper.NewMembers(updatedXDoc, oldXDoc); if (null != newMembers && newMembers.Where((f) => hasSigil(f)).Any()) { if (!fileLineAdded) { toWrite.Add(FileLine()); } foreach (XElement e in newMembers.Where((f) => hasSigil(f))) { toWrite.Add(MemberLine(e)); } } // If toWrite isn't empty, write all lines if (toWrite.Any()) { foreach (string s in toWrite) { reportStream.WriteLine(s); } } toWrite.Clear(); } reportStream.Flush(); reportStream.Close(); }