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); } } }
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(); } } } }
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 }); } } } }
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; }
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); } }
private AssemblyInfo LoadReport(string path) { var report = new AssemblyInfo(); report.ReadXml(new XmlTextReader(path)); return report; }
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++; } }
public static string FormatPath(string output, AssemblyInfo assembly) { return output.Replace("%name%", assembly.Name) .Replace("%version%", assembly.Version); }
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++; } } } }
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 }); } } } } } }
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 }); } } } } }