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()); }
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; }
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); }
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()); }
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()); }