Esempio n. 1
0
		public AssemblyComparerThread(AssemblyManager manager, AssemblyGroup group, string fileName, IHandleProgress progress)
		{
			_manager = manager;
			_group = group;
			_fileName = fileName;
			_progress = progress;
		}
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
        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);
        }
Esempio n. 4
0
        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;
        }