コード例 #1
0
        private void ParseFiles(CompareSets set)
        {
            // scan directories
            var files = ListFiles(set.Path);

            // set files
            set.FileList = files;
            totalFiles  += files.Count;

            int wt, cpt;

            ThreadPool.GetMaxThreads(out wt, out cpt);

            // files file comparision
            var tasks = new List <Task>();

            foreach (var file in set.FileList)
            {
                tasks.Add(Task.Run(() =>
                {
                    var data = FileCompareData.FromFile(file, set.Path);
                    lock (set)
                    {
                        set.AllFiles.Add(data);
                        set.Files[data.absolutePath] = data;
                        Filenames.Add(data.name);
                    }

                    ++fileScanIndex;
                }));
            }

            Task.WaitAll(tasks.ToArray());
        }
コード例 #2
0
        public async Task Parse()
        {
            totalFiles         = 0;
            fileScanIndex      = 0;
            totalDirectories   = 0;
            directoryScanIndex = 0;
            crossCompareIndex  = 0;
            totalCrossCompare  = 0;

            CompareSets left = new CompareSets
            {
                Path       = LeftPath,
                FileList   = null,
                Files      = LeftFiles,
                Duplicates = DuplicateLeft,
                Refactored = RefactoredLeft,
                EmptyFiles = EmptyFilesLeft
            };

            CompareSets right = new CompareSets
            {
                FileList   = null,
                Path       = RightPath,
                Files      = RightFiles,
                Duplicates = DuplicateRight,
                Refactored = RefactoredRight,
                EmptyFiles = EmptyFilesRight
            };

            // Parse files left and right
            var tasks = new Task[] { Task.Run(() => ParseFiles(left)), Task.Run(() => ParseFiles(right)) };
            await Task.WhenAll(tasks);

            // compare left with left, right with right and then left with right
            totalCrossCompare = left.Files.Count * left.Files.Count + right.Files.Count * right.Files.Count + left.Files.Count * right.Files.Count;

            var crossCompareTasks = new Task[]
            {
                Task.Run(() => { CrossCompareSelf(left); }),
                Task.Run(() => { CrossCompareSelf(right); }),
                Task.Run(() => { CrossCompare(left, right); })
            };

            // wait until done
            await Task.WhenAll(crossCompareTasks);

            totalFiles         = 0;
            fileScanIndex      = 0;
            totalDirectories   = 0;
            directoryScanIndex = 0;
            crossCompareIndex  = 0;
            totalCrossCompare  = 0;
        }
コード例 #3
0
        static void Verify(string leftTargets, string rightTargets)
        {
            var left = leftTargets.Split(';').Select(t => new Target(t, new List <string>())).ToList();

            var right       = rightTargets.Split(';').Select(t => new Target(t, new List <string>())).ToList();
            var compareSets = CompareSets.Create(left, right);


            var output = string.Join(Environment.NewLine, compareSets.Select(cs => cs.Name));

            Console.Out.WriteLine(output);
            Approvals.Verify(output);
        }
コード例 #4
0
        private void CrossCompareSelf(CompareSets set)
        {
            var tasks = new List <Task>();

            foreach (var left in set.AllFiles)
            {
                if (left.LineCount == 0)
                {
                    EmptyFilesLeft.Add(left);
                }
                else
                {
                    foreach (var right in set.AllFiles)
                    {
                        if (right.LineCount == 0)
                        {
                            continue;
                        }
                        if (left != right && !left.Equals(right))
                        {
                            if (left.name == right.name)
                            {
                                // same name
                                if (left.hash == right.hash)
                                {
                                    // local folder must be different
                                    tasks.Add(AddToSet(set.Duplicates, left, right, 100));
                                }
                                else
                                {
                                    // local folder must be different, however, the file has the same name... duplicate?
                                    tasks.Add(AddToSet(CrossSet, left, right));
                                }
                            }
                            else if (left.hash == right.hash)
                            {
                                // renamed?
                                tasks.Add(AddToSet(RefactoredLeft, left, right, 100));
                            }
                            else
                            {
                                // cross compare all files for similatiries
                                tasks.Add(AddToSet(set.Refactored, left, right));
                            }
                        }
                    }
                }
            }

            Task.WaitAll(tasks.ToArray());
        }
コード例 #5
0
        private void CrossCompare(CompareSets leftSet, CompareSets rightSet)
        {
            var tasks = new List <Task>();

            foreach (var left in leftSet.AllFiles)
            {
                foreach (var right in rightSet.AllFiles)
                {
                    if (left.name == right.name)
                    {
                        // same name
                        if (left.localPath == right.localPath)
                        {
                            // same path
                            if (left.hash == right.hash)
                            {
                                // exact match
                                tasks.Add(AddToSet(UnchangedFileSet, left, right, 100));
                            }
                            else
                            {
                                // matching names and folders
                                tasks.Add(AddToSet(ChangedSet, left, right));
                            }
                        }
                        // same name, different path
                        else if (left.hash == right.hash)
                        {
                            // moved
                            tasks.Add(AddToSet(MovedSet, left, right, 100));
                        }
                        else
                        {
                            // moved and changed (probably)
                            tasks.Add(AddToSet(ChangedSet, left, right));
                        }
                    }
                    else if (left.hash == right.hash)
                    {
                        // same file, different names
                        if (left.localPath == right.localPath)
                        {
                            // renamed
                            tasks.Add(AddToSet(RenamedSet, left, right, 100));
                        }
                        else
                        {
                            // moved
                            tasks.Add(AddToSet(MovedSet, left, right, 100));
                        }
                    }
                    else
                    {
                        // different names, different files, check for refactor
                        tasks.Add(AddToSet(CrossSet, left, right));
                    }
                }
            }

            Task.WaitAll(tasks.ToArray());
        }