public AssemblyComparerThread(AssemblyManager manager, AssemblyGroup group, string fileName, IHandleProgress progress) { _manager = manager; _group = group; _fileName = fileName; _progress = progress; }
private AssemblyGroup DoCompareFiles(AssemblyManager manager, string[] assemblyFiles) { string[] assemblyFilesResolved = new string[assemblyFiles.Length]; for (int i = 0; i < assemblyFiles.Length; i++) { if (Path.IsPathRooted(assemblyFiles[i])) { assemblyFilesResolved[i] = Path.GetFullPath(assemblyFiles[i]); } else { assemblyFilesResolved[i] = Path.GetFullPath(Path.Combine(Directory.GetCurrentDirectory(), assemblyFiles[i])); } } AssemblyGroup group = new AssemblyGroup(); foreach (string file in assemblyFilesResolved) { if (group.Name == null) { group.Name = Path.GetFileName(file); } if (Path.GetFileName(file) != group.Name) { group.Name = "(Multiple Names)"; break; } } foreach (string fileName in assemblyFilesResolved) { AssemblyComparerThread act = new AssemblyComparerThread(manager, group, fileName, _progress); if (_config.Multithread) { _tpw.QueueUserWorkItem(Execute, act); } else { Execute(act); } } if (_config.Multithread) { _tpw.WaitOne(); List <AssemblyDetail> sorted = new List <AssemblyDetail>(); foreach (string fileName in assemblyFilesResolved) { AssemblyDetail sortedDetail = group.Assemblies.Find(delegate(AssemblyDetail detail) { return(string.Compare(detail.Location, fileName, true) == 0); }); if (sortedDetail == null) { Log.Error("Unable to sort assembly " + fileName); //Log.Error(" List has " + string.Join(",", group.Assemblies.ConvertAll(delegate(AssemblyDetail detail) { return detail.Location; }).ToArray())); } else { sorted.Add(sortedDetail); } } group.Assemblies.Clear(); group.Assemblies.AddRange(sorted); } ListOperations.AlignLists(group.Assemblies); group.PerformCompare(_filter); return(group); }
public AssemblyComparison CompareAssemblyDirectories(bool recurse, DiffConfig config, ComparisonFilter filter, params string[] assemblyDirectories) { _config = config; _filter = filter; int totalFiles = 0; List <List <ICanAlign> > allEntries = new List <List <ICanAlign> >(); SearchOption option = recurse ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly; foreach (string dir in assemblyDirectories) { List <ICanAlign> entry = new List <ICanAlign>(); entry.AddRange(AssemblyDirectoryEntry.From(dir, Directory.GetFiles(dir, "*.dll", option))); entry.AddRange(AssemblyDirectoryEntry.From(dir, Directory.GetFiles(dir, "*.exe", option))); totalFiles += entry.Count; allEntries.Add(entry); } if (allEntries.Count == 0) { return(null); } AppDomainIsolationLevel level = _config.IsolationLevel; if (level == AppDomainIsolationLevel.AutoDetect) { level = IsolationDetector.AutoDetectIsolationLevelDirs(assemblyDirectories); } ListOperations.AlignListsNoParent(allEntries.ToArray()); AssemblyManager manager = AssemblyManagerFactory.Create(level); AssemblyComparison ac = new AssemblyComparison(); if (_progress != null) { _progress.SetMaxRange(totalFiles); } for (int j = 0; j < allEntries[0].Count; j++) { List <string> thisRun = new List <string>(); for (int i = 0; i < allEntries.Count; i++) { if (allEntries[i][j].Status == Status.Present) { thisRun.Add(((AssemblyDirectoryEntry)allEntries[i][j]).Path); } } ac.Groups.Add(DoCompareFiles(manager, thisRun.ToArray())); } manager.AllExtractionsComplete(); FilterResultSet(ac, filter); return(ac); }
private AssemblyGroup DoCompareFiles(AssemblyManager manager, string[] assemblyFiles) { string[] assemblyFilesResolved = new string[assemblyFiles.Length]; for (int i = 0; i < assemblyFiles.Length; i++) { if (Path.IsPathRooted(assemblyFiles[i])) { assemblyFilesResolved[i] = assemblyFiles[i]; } else { assemblyFilesResolved[i] = Path.GetFullPath(Path.Combine(Directory.GetCurrentDirectory(), assemblyFiles[i])); } } AssemblyGroup group = new AssemblyGroup(); foreach (string file in assemblyFilesResolved) { if (group.Name == null) { group.Name = Path.GetFileName(file); } if (Path.GetFileName(file) != group.Name) { group.Name = "(Multiple Names)"; break; } } foreach (string fileName in assemblyFilesResolved) { AssemblyComparerThread act = new AssemblyComparerThread(manager, group, fileName, _progress); if (_config.Multithread) { _tpw.QueueUserWorkItem(Execute, act); } else { Execute(act); } } if (_config.Multithread) { _tpw.WaitOne(); List<AssemblyDetail> sorted = new List<AssemblyDetail>(); foreach (string fileName in assemblyFilesResolved) { AssemblyDetail sortedDetail = group.Assemblies.Find(delegate(AssemblyDetail detail) { return string.Compare(detail.Location, fileName, true) == 0; }); if (sortedDetail == null) { Log.Error("Unable to sort assembly " + fileName); //Log.Error(" List has " + string.Join(",", group.Assemblies.ConvertAll(delegate(AssemblyDetail detail) { return detail.Location; }).ToArray())); } else { sorted.Add(sortedDetail); } } group.Assemblies.Clear(); group.Assemblies.AddRange(sorted); } ListOperations.AlignLists(group.Assemblies); group.PerformCompare(_filter); return group; }