private ITask <NPath[]> CalculateFileDiff(ChangesTreeNode node) { var rightFile = node.Path.ToNPath(); var tmpDir = Manager.Environment.UnityProjectPath.Combine("Temp", "ghu-diffs").EnsureDirectoryExists(); var leftFile = tmpDir.Combine(rightFile.FileName + "_" + Repository.CurrentHead + rightFile.ExtensionWithDot); return(new SimpleProcessTask(TaskManager.Token, "show HEAD:\"" + rightFile.ToString(SlashMode.Forward) + "\"") .Configure(Manager.ProcessManager, false) .Catch(_ => true) .Then((success, txt) => { // both files exist, just compare them if (success && rightFile.FileExists()) { leftFile.WriteAllText(txt); return new NPath[] { leftFile, rightFile }; } var leftFolder = tmpDir.Combine("left", leftFile.FileName).EnsureDirectoryExists(); var rightFolder = tmpDir.Combine("right", leftFile.FileName).EnsureDirectoryExists(); // file was deleted if (!rightFile.FileExists()) { leftFolder.Combine(rightFile).WriteAllText(txt); } // file was created if (!success) { rightFolder.Combine(rightFile).WriteAllText(rightFile.ReadAllText()); } return new NPath[] { leftFolder, rightFolder }; })); }
private ITask <NPath[]> CalculateFolderDiff(ChangesTreeNode node) { var rightFile = node.Path.ToNPath(); var tmpDir = Manager.Environment.UnityProjectPath.Combine("Temp").CreateTempDirectory(); var changedFiles = treeChanges.GetLeafNodes(node).Select(x => x.Path.ToNPath()).ToList(); return(new FuncTask <List <NPath>, NPath[]>(TaskManager.Token, (s, files) => { var leftFolder = tmpDir.Combine("left", rightFile.FileName); var rightFolder = tmpDir.Combine("right", rightFile.FileName); foreach (var file in files) { var txt = new SimpleProcessTask(TaskManager.Token, "show HEAD:\"" + file.ToString(SlashMode.Forward) + "\"") .Configure(Manager.ProcessManager, false) .Catch(_ => true) .RunSynchronously(); if (txt != null) { leftFolder.Combine(file.RelativeTo(rightFile)).WriteAllText(txt); } if (file.FileExists()) { rightFolder.Combine(file.RelativeTo(rightFile)).WriteAllText(file.ReadAllText()); } } return new NPath[] { leftFolder, rightFolder }; }, () => changedFiles) { Message = "Calculating diff..." }); }
private GenericMenu CreateContextMenu(ChangesTreeNode node) { var genericMenu = new GenericMenu(); if (discardGuiContent == null) { discardGuiContent = new GUIContent("Discard"); } genericMenu.AddItem(discardGuiContent, false, () => { GitStatusEntry[] discardEntries; if (node.isFolder) { discardEntries = treeChanges .GetLeafNodes(node) .Select(treeNode => treeNode.GitStatusEntry) .ToArray(); } else { discardEntries = new [] { node.GitStatusEntry }; } Repository.DiscardChanges(discardEntries) .Start(); }); return(genericMenu); }
private GenericMenu CreateChangesTreeContextMenu(ChangesTreeNode node) { var genericMenu = new GenericMenu(); genericMenu.AddItem(new GUIContent("Show History"), false, () => { }); return(genericMenu); }
private GenericMenu CreateContextMenu(ChangesTreeNode node) { var genericMenu = new GenericMenu(); genericMenu.AddItem(new GUIContent("Show Diff"), false, () => { ITask <NPath[]> calculateDiff = null; if (node.IsFolder) { calculateDiff = CalculateFolderDiff(node); } else { calculateDiff = CalculateFileDiff(node); } calculateDiff.FinallyInUI((s, ex, leftRight) => { if (s) { EditorUtility.InvokeDiffTool( leftRight[0].IsInitialized ? leftRight[0].FileName : null, leftRight[0].IsInitialized ? leftRight[0].MakeAbsolute().ToString() : null, leftRight[1].IsInitialized ? leftRight[1].FileName : null, leftRight[1].IsInitialized ? leftRight[1].MakeAbsolute().ToString() : null, null, null); } else { throw ex; } }) .Start(); }); genericMenu.AddSeparator(""); if (discardGuiContent == null) { discardGuiContent = new GUIContent("Discard"); } genericMenu.AddItem(discardGuiContent, false, () => { if (!EditorUtility.DisplayDialog(Localization.DiscardConfirmTitle, Localization.DiscardConfirmDescription, Localization.DiscardConfirmYes, Localization.Cancel)) { return; } GitStatusEntry[] discardEntries; if (node.isFolder) { discardEntries = treeChanges .GetLeafNodes(node) .Select(treeNode => treeNode.GitStatusEntry) .ToArray(); } else { discardEntries = new [] { node.GitStatusEntry }; } Repository.DiscardChanges(discardEntries) .ThenInUI(AssetDatabase.Refresh) .Start(); }); return(genericMenu); }