Exemplo n.º 1
0
        private ITask <SPath[]> CalculateFileDiff(ChangesTreeNode node)
        {
            var rightFile = node.Path.ToSPath();
            var tmpDir    = Manager.Environment.UnityProjectPath.ToSPath().Combine("Temp", "ghu-diffs").EnsureDirectoryExists();
            var leftFile  = tmpDir.Combine(rightFile.FileName + "_" + Repository.CurrentHead + rightFile.ExtensionWithDot);

            return(new GitProcessTask(Platform, "show HEAD:\"" + rightFile.ToString(SlashMode.Forward) + "\"")
                   .Configure(Manager.ProcessManager)
                   .Catch(_ => true)
                   .Then((success, ex, txt) =>
            {
                // both files exist, just compare them
                if (success && rightFile.FileExists())
                {
                    leftFile.WriteAllText(txt);
                    return new SPath[] { 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 SPath[] { leftFolder, rightFolder };
            }));
        }
Exemplo n.º 2
0
        private ITask <SPath[]> CalculateFolderDiff(ChangesTreeNode node)
        {
            var rightFile    = node.Path.ToSPath();
            var tmpDir       = Manager.Environment.UnityProjectPath.ToSPath().Combine("Temp").CreateTempDirectory();
            var changedFiles = treeChanges.GetLeafNodes(node).Select(x => x.Path.ToSPath()).ToList();

            return(TaskManager.With(files => {
                var leftFolder = tmpDir.Combine("left", rightFile.FileName);
                var rightFolder = tmpDir.Combine("right", rightFile.FileName);
                foreach (var file in files)
                {
                    var txt = new GitProcessTask(Platform,
                                                 "show HEAD:\"" + file.ToString(SlashMode.Forward) + "\"")
                              .Configure(Manager.ProcessManager)
                              .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 SPath[] { leftFolder, rightFolder };
            }, changedFiles, "Calculating diff..."));
        }
Exemplo n.º 3
0
        private GenericMenu CreateChangesTreeContextMenu(ChangesTreeNode node)
        {
            var genericMenu = new GenericMenu();

            genericMenu.AddItem(new GUIContent("Show History"), false, () => { });

            return(genericMenu);
        }
Exemplo n.º 4
0
        private GenericMenu CreateContextMenu(ChangesTreeNode node)
        {
            var genericMenu = new GenericMenu();

            genericMenu.AddItem(new GUIContent("Show Diff"), false, () =>
            {
                ITask <SPath[]> 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
                    {
                        ex.Rethrow();
                    }
                })
                .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);
        }