Ejemplo n.º 1
0
        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);
                }
            }
        }
Ejemplo n.º 2
0
        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();
        }