Example #1
0
        public void Run(IEnumerable<string> args)
        {
            var extras = _optionSet.Parse(args);

            foreach (string arg in PathHelper.ExpandPaths(extras))
            {
                var absolutePath = Path.GetFullPath(arg);

                var assembly = Assembly.LoadFrom(absolutePath);

                var assemblyInfo = new AssemblyInfo();
                assemblyInfo.ReadAssembly(assembly, _excludePattern);

                if (_version != null)
                {
                    assemblyInfo.Version = _version;
                }

                var fileName = PathHelper.FormatPath(_output, assemblyInfo);

                using (var xmlWriter = new XmlTextWriter(fileName, Encoding.UTF8)
                                       {
                                           Formatting = Formatting.Indented
                                       })
                {
                    assemblyInfo.WriteXml(xmlWriter);
                }
            }
        }
Example #2
0
        public void Run(IEnumerable<string> args)
        {
            var extras = _optionSet.Parse(args);

            var assemblies = new List<AssemblyInfo>();

            foreach (string arg in PathHelper.ExpandPaths(extras))
            {
                var assemblyInfo = new AssemblyInfo();

                using (var xmlReader = new XmlTextReader(arg))
                {
                    assemblyInfo.ReadXml(xmlReader);
                }

                assemblies.Add(assemblyInfo);
            }

            foreach (var group in assemblies.GroupBy(a => a.Name))
            {
                var reporter = new Reporter();

                foreach (var assembly in group)
                {
                    reporter.Assemblies.Add(assembly);
                }

                var report = reporter.GenerateReport();

                var outputPath = PathHelper.FormatPath(_output, report);

                PathHelper.EnsureFolderExists(outputPath);

                using (var xmlWriter = new XmlTextWriter(outputPath, Encoding.UTF8)
                                       {
                                           Formatting = Formatting.Indented
                                       })
                {
                    report.WriteXml(xmlWriter);
                }

                if (!string.IsNullOrEmpty(_transform))
                {
                    var transform = new XslCompiledTransform();
                    transform.Load(_transform);

                    var document = new XPathDocument(outputPath);

                    var transformOutput = PathHelper.FormatPath(_transformOutput, report);

                    using (var stream = new FileStream(transformOutput, FileMode.Create))
                    {
                        transform.Transform(document, null, stream);
                        stream.Flush();
                    }
                }
            }
        }
Example #3
0
 private static void FindRemovedTypes(AssemblyInfo report, AssemblyInfo thisAssembly, AssemblyInfo previousAssembly)
 {
     if (previousAssembly != null)
     {
         foreach (var type in previousAssembly.Types)
         {
             if (!thisAssembly.Types.Contains(type.Name))
             {
                 report.Types.Get(type.Name).Changes.Add(new TypeChangeInfo
                                                         {
                                                             Kind = TypeChangeKind.RemovedType,
                                                             Version = thisAssembly.Version
                                                         });
             }
         }
     }
 }
Example #4
0
        public AssemblyInfo GenerateReport()
        {
            var report = new AssemblyInfo();

            AssemblyInfo previousAssembly = null;

            foreach (var assembly in Assemblies.OrderBy(a => a.Version.PadNumbers()))
            {
                report.Name = assembly.Name;
                report.Version = assembly.Version;

                FindAddedTypes(report, assembly, previousAssembly);
                FindRemovedTypes(report, assembly, previousAssembly);
                UpdateExistingTypes(report, assembly, previousAssembly);
                UpdateExistingTypeMembers(report, assembly, previousAssembly);

                previousAssembly = assembly;
            }

            return report;
        }
Example #5
0
        private static void FindAddedTypes(AssemblyInfo report, AssemblyInfo thisAssembly, AssemblyInfo previousAssembly)
        {
            foreach (var type in thisAssembly.Types)
            {
                if (report.Types.Contains(type.Name))
                {
                    continue;
                }

                var newType = type.Clone();

                if (previousAssembly != null)
                {
                    newType.Changes.Add(new TypeChangeInfo
                                        {
                                            Kind = TypeChangeKind.AddedType,
                                            Version = thisAssembly.Version
                                        });
                }

                report.Types.Add(newType);
            }
        }
Example #6
0
        private AssemblyInfo LoadReport(string path)
        {
            var report = new AssemblyInfo();
            report.ReadXml(new XmlTextReader(path));

            return report;
        }
Example #7
0
        private void AddData(AssemblyInfo report, ISheet worksheet)
        {
            var data = new List<List<string>>();

            foreach (var typeInfo in report.Types)
            {
                foreach (var change in typeInfo.Changes)
                {
                    var row = new List<string>();
                    data.Add(row);
                    ForEachColumn((i, f) => row.Add(f.Getter(report, typeInfo, change, null, null)));
                }

                foreach (var memberInfo in typeInfo.Members)
                {
                    foreach (var change in memberInfo.Changes)
                    {
                        var row = new List<string>();
                        data.Add(row);
                        ForEachColumn((i, f) => row.Add(f.Getter(report, typeInfo, null, memberInfo, change)));
                    }
                }
            }

            data = data.OrderByDescending(row => row[0]).ToList();

            if (_multipleSheets)
            {
                _rowIndex = 1;
            }

            foreach (var dataRow in data)
            {
                var row = worksheet.CreateRow(_rowIndex);

                for (var i = 0; i < dataRow.Count; i++)
                {
                    row.CreateCell(i).SetCellValue(dataRow[i]);
                }

                _rowIndex++;
            }
        }
Example #8
0
 public static string FormatPath(string output, AssemblyInfo assembly)
 {
     return output.Replace("%name%", assembly.Name)
                  .Replace("%version%", assembly.Version);
 }
Example #9
0
        private void AddData(AssemblyInfo report, ISheet worksheet)
        {
            var rowIndex = 2;

            foreach (var typeInfo in report.Types)
            {
                foreach (var memberInfo in typeInfo.Members)
                {
                    foreach (var change in memberInfo.Changes)
                    {
                        var row = worksheet.CreateRow(rowIndex);

                        ForEachColumn((i, f) => row.CreateCell(i).SetCellValue(f.Getter(typeInfo, memberInfo, change)));

                        rowIndex++;
                    }
                }
            }
        }
Example #10
0
        private static void UpdateExistingTypeMembers(AssemblyInfo report, AssemblyInfo thisAssembly, AssemblyInfo previousAssembly)
        {
            if (previousAssembly != null)
            {
                foreach (var reportType in report.Types)
                {
                    if (previousAssembly.Types.Contains(reportType.Name) &&
                        thisAssembly.Types.Contains(reportType.Name))
                    {
                        var previousType = previousAssembly.Types.Get(reportType.Name);
                        var thisType = thisAssembly.Types.Get(reportType.Name);

                        foreach (var member in thisType.Members)
                        {
                            // Is this a new member?
                            if (!previousType.Members.Contains(member.Name) || previousType.Members.TryGet(member) == null)
                            {
                                var newMember = member.Clone();

                                newMember.Changes.Add(new MemberChangeInfo
                                                      {
                                                          Kind = MemberChangeKind.AddedMember,
                                                          Version = thisAssembly.Version
                                                      });

                                reportType.Members.Add(newMember);
                            }
                            else
                            {
                                // The member is old. Check to see if it was modified.
                                var oldMember = previousType.Members.Get(member);

                                // Did the member just become obsolete?
                                if (!oldMember.Obsolete && member.Obsolete)
                                {
                                    reportType.Members.Get(member.Name).Changes.Add(
                                        new MemberChangeInfo
                                        {
                                            Kind = MemberChangeKind.ObsoletedMember,
                                            Version = thisAssembly.Version
                                        });
                                }

                                if (!reportType.Members.IsOverloaded(member.Name))
                                {
                                    if (oldMember.Parameters.Count < member.Parameters.Count)
                                    {
                                        for (var i = oldMember.Parameters.Count; i < member.Parameters.Count; i++)
                                        {
                                            var typeMember = reportType.Members.Get(member.Name);

                                            typeMember.Changes.Add(new MemberChangeInfo
                                                                   {
                                                                       Kind = MemberChangeKind.AddedParameter,
                                                                       Version = thisAssembly.Version,
                                                                       New = member.Parameters[i].Name
                                                                   });

                                            typeMember.UpdateParameters(member);
                                        }
                                    }
                                    else if (oldMember.Parameters.Count > member.Parameters.Count)
                                    {
                                        for (var i = member.Parameters.Count; i < oldMember.Parameters.Count; i++)
                                        {
                                            var typeMember = reportType.Members.Get(member.Name);

                                            typeMember.Changes.Add(new MemberChangeInfo
                                                                   {
                                                                       Kind = MemberChangeKind.RemovedParameter,
                                                                       Version = thisAssembly.Version,
                                                                       Old = oldMember.Parameters[i].Name
                                                                   });

                                            typeMember.UpdateParameters(member);
                                        }
                                    }
                                }
                            }
                        }

                        // Look for removed members.
                        foreach (var member in previousType.Members)
                        {
                            if (!thisType.Members.Contains(member.Name))
                            {
                                var removedMember = reportType.Members.Get(member);

                                removedMember.Changes.Add(new MemberChangeInfo
                                                          {
                                                              Kind = MemberChangeKind.RemovedMember,
                                                              Version = thisAssembly.Version
                                                          });
                            }
                        }
                    }
                }
            }
        }
Example #11
0
        private static void UpdateExistingTypes(AssemblyInfo report, AssemblyInfo thisAssembly, AssemblyInfo previousAssembly)
        {
            if (previousAssembly != null)
            {
                foreach (var type in previousAssembly.Types)
                {
                    if (previousAssembly.Types.Contains(type.Name) &&
                        thisAssembly.Types.Contains(type.Name))
                    {
                        var previousType = previousAssembly.Types.Get(type.Name);
                        var thisType = thisAssembly.Types.Get(type.Name);

                        // Did the type just become obsolete?
                        if (!previousType.Obsolete && thisType.Obsolete)
                        {
                            report.Types.Get(type.Name).Changes.Add(
                                new TypeChangeInfo
                                {
                                    Kind = TypeChangeKind.ObsoletedType,
                                    Version = thisAssembly.Version
                                });
                        }
                    }
                }
            }
        }