public override void Run(IEnumerable <string> args) { string filesToFixDir = ""; string omitlist = ""; string processlist = ""; string pattern = ""; List <string> extras = CommandUtils.ProcessFileArgs(args, ref filesToFixDir, ref omitlist, ref processlist, ref pattern); // must have string filesToUseAsRefDir = ""; // should have bool doSummaries = true; bool doParameters = true; bool doReturns = true; bool doRemarks = true; bool doTypes = true; // nice to have bool dryRun = false; bool reportChanges = false; var opts = new OptionSet { { "f|fix=", (f) => filesToFixDir = f }, { "u|using=", (u) => filesToUseAsRefDir = u }, { "s|summaries", (s) => doSummaries = s != null }, { "a|params", (p) => doParameters = p != null }, { "r|retvals", (r) => doReturns = r != null }, { "m|remarks", (r) => doRemarks = r != null }, { "t|typesummaries", (t) => doTypes = t != null }, { "y|dryrun", (d) => dryRun = d != null }, { "c|reportchanges", (c) => reportChanges = c != null }, }; extras = opts.Parse(extras); CommandUtils.ThrowOnFiniteExtras(extras); if (String.IsNullOrEmpty(filesToUseAsRefDir)) { throw new ArgumentException("You must supply a parallel directory from which to source new content with '[u|using]'=."); } IEnumerable <string> filesToFix = CommandUtils.GetFileList(processlist, omitlist, filesToFixDir, pattern); HashSet <string> filesToUseAsReference = new HashSet <string>(CommandUtils.GetFileList("", "", filesToUseAsRefDir, "")); filesToFix = filesToFix.Where((f) => filesToUseAsReference.Contains(EcmaXmlHelper.GetParallelFilePathFor(f, filesToUseAsRefDir, filesToFixDir))); foreach (var f in filesToFix) { XDocument currentRefXDoc = EcmaXmlHelper.GetParallelXDocFor( EcmaXmlHelper.GetParallelFilePathFor(f, filesToUseAsRefDir, filesToFixDir), filesToUseAsReference ); if (null == currentRefXDoc) { continue; } Action <XElement> fix = (XElement e) => EcmaXmlHelper.Fix(e, EcmaXmlHelper.GetSelectorFor(e)(currentRefXDoc)); bool changed = false; XDocument currentXDocToFix = XDocument.Load(f); EventHandler <XObjectChangeEventArgs> SetTrueIfChanged = null; SetTrueIfChanged = new EventHandler <XObjectChangeEventArgs>((sender, e) => { currentXDocToFix.Changed -= SetTrueIfChanged; changed = true; }); currentXDocToFix.Changed += SetTrueIfChanged; foreach (XElement e in EcmaXmlHelper.ElementsOfInterest(currentXDocToFix)) { fix(e); } if (changed) { CommandUtils.WriteXDocument(currentXDocToFix, f); } } }
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(); }