private void DoDiffStatusContex(FileStatus fileStatus, GenericMenu menu)
        {
            menu.AddItem(new GUIContent("Select All"), false, SelectFilteredCallback, fileStatus);
            if (GitManager.CanStage(fileStatus))
            {
                menu.AddItem(new GUIContent("Add All"), false, () =>
                {
                    GitManager.Repository.Stage(statusList.Where(s => s.State.IsFlagSet(fileStatus)).SelectMany(s => GitManager.GetPathWithMeta(s.Path)));
                    GitManager.Update();
                });
            }
            else
            {
                menu.AddDisabledItem(new GUIContent("Add All"));
            }

            if (GitManager.CanUnstage(fileStatus))
            {
                menu.AddItem(new GUIContent("Remove All"), false, () =>
                {
                    GitManager.Repository.Unstage(statusList.Where(s => s.State.IsFlagSet(fileStatus)).SelectMany(s => GitManager.GetPathWithMeta(s.Path)));
                    GitManager.Update();
                });
            }
            else
            {
                menu.AddDisabledItem(new GUIContent("Remove All"));
            }
        }
Exemple #2
0
 private static bool RemoveSelectedValidate()
 {
     if (gitManager == null || !initializer.IsValidRepo)
     {
         return(false);
     }
     return(Selection.assetGUIDs.Select(AssetDatabase.GUIDToAssetPath).Select(p => gitManager.ToLocalPath(p)).SelectMany(gitManager.GetPathWithMeta)
            .Any(g => GitManager.CanUnstage(gitManager.Repository.RetrieveStatus(g))));
 }
Exemple #3
0
 private static bool RemoveSelectedValidate()
 {
     if (gitManager == null || !gitManager.IsValidRepo)
     {
         return(false);
     }
     string[] paths = Selection.assetGUIDs.Select(g => string.IsNullOrEmpty(Path.GetExtension(AssetDatabase.GUIDToAssetPath(g))) ? AssetDatabase.GUIDToAssetPath(g) + ".meta" : AssetDatabase.GUIDToAssetPath(g)).SelectMany(GitManager.GetPathWithMeta).ToArray();
     return(paths.Any(g => GitManager.CanUnstage(gitManager.Repository.RetrieveStatus(g))));
 }
        private void DoDiffElementContex(GenericMenu editMenu)
        {
            StatusListEntry[] entries       = statusList.Where(e => e.Selected).ToArray();
            FileStatus        selectedFlags = entries.Select(e => e.State).CombineFlags();

            GUIContent addContent = new GUIContent("Stage");

            if (GitManager.CanStage(selectedFlags))
            {
                editMenu.AddItem(addContent, false, AddSelectedCallback);
            }
            else
            {
                editMenu.AddDisabledItem(addContent);
            }
            GUIContent removeContent = new GUIContent("Unstage");

            if (GitManager.CanUnstage(selectedFlags))
            {
                editMenu.AddItem(removeContent, false, RemoveSelectedCallback);
            }
            else
            {
                editMenu.AddDisabledItem(removeContent);
            }

            editMenu.AddSeparator("");
            if (entries.Length == 1)
            {
                string path = entries[0].Path;
                if (selectedFlags.IsFlagSet(FileStatus.Conflicted))
                {
                    if (GitConflictsHandler.CanResolveConflictsWithTool(path))
                    {
                        editMenu.AddItem(new GUIContent("Resolve Conflicts"), false, ResolveConflictsCallback, path);
                    }
                    else
                    {
                        editMenu.AddDisabledItem(new GUIContent("Resolve Conflicts"));
                    }
                    editMenu.AddItem(new GUIContent("Resolve (Using Ours)"), false, ResolveConflictsOursCallback, entries[0].Path);
                    editMenu.AddItem(new GUIContent("Resolve (Using Theirs)"), false, ResolveConflictsTheirsCallback, entries[0].Path);
                }
                else
                {
                    editMenu.AddItem(new GUIContent("Difference"), false, SeeDifferenceSelectedCallback, entries[0].Path);
                    editMenu.AddItem(new GUIContent("Difference with previous version"), false, SeeDifferencePrevSelectedCallback, entries[0].Path);
                }
            }
            editMenu.AddSeparator("");
            editMenu.AddItem(new GUIContent("Revert"), false, RevertSelectedCallback);
            editMenu.AddSeparator("");
            editMenu.AddItem(new GUIContent("Reload"), false, ReloadCallback);
        }
Exemple #5
0
        internal void Build(FileStatus fileStatus, GenericMenu menu, GitDiffWindow window)
        {
            menu.AddItem(new GUIContent("Select All"), false, () => SelectFilteredCallback(fileStatus, window));
            if (GitManager.CanStage(fileStatus))
            {
                menu.AddItem(new GUIContent("Add All"), false, () =>
                {
                    string[] paths = window.GetStatusList().Where(s => s.State.IsFlagSet(fileStatus)).SelectMany(s => gitManager.GetPathWithMeta(s.LocalPath)).ToArray();
                    if (gitManager.Threading.IsFlagSet(GitSettingsJson.ThreadingType.Stage))
                    {
                        gitManager.AsyncStage(paths).onComplete += (o) => { window.Repaint(); };
                    }
                    else
                    {
                        GitCommands.Stage(gitManager.Repository, paths);
                        gitManager.MarkDirtyAuto(paths);
                    }
                    window.Repaint();
                });
            }
            else
            {
                menu.AddDisabledItem(new GUIContent("Add All"));
            }

            if (GitManager.CanUnstage(fileStatus))
            {
                menu.AddItem(new GUIContent("Remove All"), false, () =>
                {
                    string[] paths = window.GetStatusList().Where(s => s.State.IsFlagSet(fileStatus)).SelectMany(s => gitManager.GetPathWithMeta(s.LocalPath)).ToArray();
                    if (gitManager.Threading.IsFlagSet(GitSettingsJson.ThreadingType.Unstage))
                    {
                        gitManager.AsyncUnstage(paths).onComplete += (o) => { window.Repaint(); };
                    }
                    else
                    {
                        GitCommands.Unstage(gitManager.Repository, paths);
                        gitManager.MarkDirtyAuto(paths);
                    }
                    window.Repaint();
                });
            }
            else
            {
                menu.AddDisabledItem(new GUIContent("Remove All"));
            }
        }
        private void DoFileDiff(Rect rect, StatusListEntry info)
        {
            Event current = Event.current;


            if (rect.y > DiffRect.height + diffScroll.y || rect.y + rect.height < diffScroll.y)
            {
                return;
            }

            Rect stageToggleRect = new Rect(rect.x + rect.width - rect.height, rect.y + 14, rect.height, rect.height);

            if (current.type == EventType.Repaint)
            {
                string filePath = info.Path;
                string fileName = Path.GetFileName(filePath);

                Object asset = null;
                if (filePath.EndsWith(".meta"))
                {
                    asset = AssetDatabase.LoadAssetAtPath(AssetDatabase.GetAssetPathFromTextMetaFilePath(filePath), typeof(Object));
                }
                else
                {
                    asset = AssetDatabase.LoadAssetAtPath(filePath, typeof(Object));
                }

                GUI.SetNextControlName(info.Path);
                GUI.Box(rect, GUIContent.none, info.Selected ? "TL LogicBar 1" : styles.diffElement);

                bool canUnstage = GitManager.CanUnstage(info.State);
                bool canStage   = GitManager.CanStage(info.State);
                if (canUnstage)
                {
                    GUIContent content = EditorGUIUtility.IconContent("toggle on act@2x");
                    GUI.Box(new Rect(rect.x + rect.width - rect.height, rect.y + 14, rect.height, rect.height), content, GUIStyle.none);
                }
                else if (canStage)
                {
                    GUIContent content = EditorGUIUtility.IconContent("toggle act@2x");
                    GUI.Box(stageToggleRect, content, GUIStyle.none);
                }

                GUIContent iconContent = null;
                string     extension   = Path.GetExtension(filePath);
                if (string.IsNullOrEmpty(extension))
                {
                    iconContent = EditorGUIUtility.IconContent("Folder Icon");
                }

                if (iconContent == null)
                {
                    if (asset != null)
                    {
                        iconContent         = new GUIContent(AssetPreview.GetMiniThumbnail(asset));
                        iconContent.tooltip = asset.GetType().Name;
                    }
                    else
                    {
                        iconContent         = EditorGUIUtility.IconContent("DefaultAsset Icon");
                        iconContent.tooltip = "Unknown Type";
                    }
                }

                float x = rect.x + elementSideMargin;
                GUI.Box(new Rect(x, rect.y + elementTopBottomMargin, iconSize, iconSize), iconContent, styles.assetIcon);
                x += iconSize + 8;


                styles.diffElementName.Draw(new Rect(x, rect.y + elementTopBottomMargin + 2, rect.width - elementSideMargin - iconSize - rect.height, EditorGUIUtility.singleLineHeight), new GUIContent(fileName), false, info.Selected, info.Selected, false);

                x = rect.x + elementSideMargin + iconSize + 8;
                GUI.Box(new Rect(x, rect.y + elementTopBottomMargin + EditorGUIUtility.singleLineHeight + 4, 21, 21), GitManager.GetDiffTypeIcon(info.State, false), GUIStyle.none);
                x += 25;
                if (info.MetaChange.IsFlagSet(MetaChangeEnum.Meta))
                {
                    GUIContent metaIconContent = EditorGUIUtility.IconContent("UniGit/meta");
                    metaIconContent.tooltip = ".meta file changed";
                    GUI.Box(new Rect(x, rect.y + elementTopBottomMargin + EditorGUIUtility.singleLineHeight + 4, 21, 21), metaIconContent, GUIStyle.none);
                    x += 25;
                }

                styles.diffElementPath.Draw(new Rect(x, rect.y + elementTopBottomMargin + EditorGUIUtility.singleLineHeight + 7, rect.width - elementSideMargin - iconSize - rect.height * 2, EditorGUIUtility.singleLineHeight), new GUIContent(filePath), false, info.Selected, info.Selected, false);
            }
            else if (current.type == EventType.MouseDown)
            {
                if (current.button == 0 && stageToggleRect.Contains(current.mousePosition))
                {
                    bool updateFlag = false;
                    if (GitManager.CanStage(info.State))
                    {
                        GitManager.Repository.Stage(info.Path);
                        updateFlag = true;
                    }
                    else if (GitManager.CanUnstage(info.State))
                    {
                        GitManager.Repository.Unstage(info.Path);
                        updateFlag = true;
                    }

                    if (updateFlag)
                    {
                        Repaint();
                        current.Use();
                        UpdateStatusList();
                    }
                }
            }
        }
Exemple #7
0
            static void OnPostprocessAllAssets(string[] importedAssets, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths)
            {
                if (EditorPrefs.GetBool("UniGit_DisablePostprocess"))
                {
                    return;
                }
                if (GitManager.Repository != null)
                {
                    if (GitManager.Settings != null && GitManager.Settings.AutoStage)
                    {
                        if (importedAssets != null && importedAssets.Length > 0)
                        {
                            string[] importedAssetsToStage = importedAssets.Where(a => !GitManager.IsEmptyFolder(a)).SelectMany(g => GitManager.GetPathWithMeta(g)).Where(g => GitManager.CanStage(GitManager.Repository.RetrieveStatus(g))).ToArray();
                            if (importedAssetsToStage.Length > 0)
                            {
                                GitManager.Repository.Stage(importedAssetsToStage);
                                GitManager.MarkDirty(importedAssetsToStage);
                            }
                        }

                        if (movedAssets != null && movedAssets.Length > 0)
                        {
                            string[] movedAssetsFinal = movedAssets.Where(a => !GitManager.IsEmptyFolder(a)).SelectMany(g => GitManager.GetPathWithMeta(g)).Where(g => GitManager.CanStage(GitManager.Repository.RetrieveStatus(g))).ToArray();
                            if (movedAssetsFinal.Length > 0)
                            {
                                GitManager.Repository.Stage(movedAssetsFinal);
                                GitManager.MarkDirty(movedAssetsFinal);
                            }
                        }
                    }

                    //automatic deletion of previously moved asset is necessary even if AutoStage is off
                    if (movedFromAssetPaths != null && movedFromAssetPaths.Length > 0)
                    {
                        string[] movedFromAssetPathsFinal = movedFromAssetPaths.SelectMany(g => GitManager.GetPathWithMeta(g)).Where(g => GitManager.CanUnstage(GitManager.Repository.RetrieveStatus(g))).ToArray();
                        if (movedFromAssetPathsFinal.Length > 0)
                        {
                            GitManager.Repository.Unstage(movedFromAssetPathsFinal);
                            GitManager.MarkDirty(movedFromAssetPathsFinal);
                        }
                    }

                    //automatic deletion is necessary even if AutoStage is off
                    if (deletedAssets != null && deletedAssets.Length > 0)
                    {
                        string[] deletedAssetsFinal = deletedAssets.SelectMany(g => GitManager.GetPathWithMeta(g)).Where(g => GitManager.CanUnstage(GitManager.Repository.RetrieveStatus(g))).ToArray();
                        if (deletedAssetsFinal.Length > 0)
                        {
                            GitManager.Repository.Unstage(deletedAssetsFinal);
                            GitManager.MarkDirty(deletedAssetsFinal);
                        }
                    }
                }
            }
 private static bool RevetValidate()
 {
     return(Selection.assetGUIDs.Select(e => AssetDatabase.GUIDToAssetPath(e)).SelectMany(e => GitManager.GetPathWithMeta(e)).Where(e => File.Exists(e)).Select(e => GitManager.Repository.RetrieveStatus(e)).Any(e => GitManager.CanStage(e) | GitManager.CanUnstage(e)));
 }
Exemple #9
0
 private static bool RevetValidate()
 {
     if (gitManager == null || !gitManager.IsValidRepo)
     {
         return(false);
     }
     return(Selection.assetGUIDs.Select(AssetDatabase.GUIDToAssetPath).SelectMany(GitManager.GetPathWithMeta).Where(File.Exists).Select(e => gitManager.Repository.RetrieveStatus(e)).Any(e => GitManager.CanStage(e) | GitManager.CanUnstage(e)));
 }
Exemple #10
0
        internal void Build(IGenericMenu editMenu, GitDiffWindow window)
        {
            StatusListEntry[] entries       = window.GetStatusList().Where(window.IsSelected).ToArray();
            FileStatus        selectedFlags = entries.Select(e => e.State).CombineFlags();

            GUIContent addContent = new GUIContent("Stage", GitGUI.Textures.CollabPush);

            if (GitManager.CanStage(selectedFlags))
            {
                editMenu.AddItem(addContent, false, () => { AddSelectedCallback(window); });
            }
            else
            {
                editMenu.AddDisabledItem(addContent);
            }
            GUIContent removeContent = new GUIContent("Unstage", GitGUI.Textures.CollabPull);

            if (GitManager.CanUnstage(selectedFlags))
            {
                editMenu.AddItem(removeContent, false, () => { RemoveSelectedCallback(window); });
            }
            else
            {
                editMenu.AddDisabledItem(removeContent);
            }

            editMenu.AddSeparator("");
            Texture2D diffIcon = GitGUI.Textures.ZoomTool;

            if (entries.Length >= 1)
            {
                string localPath = entries[0].LocalPath;
                if (selectedFlags.IsFlagSet(FileStatus.Conflicted))
                {
                    if (conflictsHandler.CanResolveConflictsWithTool(localPath))
                    {
                        editMenu.AddItem(new GUIContent("Resolve Conflicts", "Resolve merge conflicts"), false, ResolveConflictsCallback, localPath);
                    }
                    else
                    {
                        editMenu.AddDisabledItem(new GUIContent("Resolve Conflicts"));
                    }
                    editMenu.AddItem(new GUIContent("Resolve (Using Ours)"), false, ResolveConflictsOursCallback, localPath);
                    editMenu.AddItem(new GUIContent("Resolve (Using Theirs)"), false, ResolveConflictsTheirsCallback, localPath);
                }
                else if (!selectedFlags.IsFlagSet(FileStatus.Ignored))
                {
                    if (entries[0].MetaChange == (MetaChangeEnum.Object | MetaChangeEnum.Meta))
                    {
                        editMenu.AddItem(new GUIContent("Difference/Asset", diffIcon), false, () => { SeeDifferenceObject(entries[0]); });
                        editMenu.AddItem(new GUIContent("Difference/Meta", diffIcon), false, () => { SeeDifferenceMeta(entries[0]); });
                    }
                    else
                    {
                        editMenu.AddItem(new GUIContent("Difference", diffIcon), false, () => { SeeDifferenceAuto(entries[0]); });
                    }

                    if (entries[0].MetaChange == (MetaChangeEnum.Object | MetaChangeEnum.Meta))
                    {
                        editMenu.AddItem(new GUIContent("Difference with previous version/Asset", diffIcon), false, () => { SeeDifferencePrevObject(entries[0]); });
                        editMenu.AddItem(new GUIContent("Difference with previous version/Meta", diffIcon), false, () => { SeeDifferencePrevMeta(entries[0]); });
                    }
                    else
                    {
                        editMenu.AddItem(new GUIContent("Difference with previous version", diffIcon), false, () => { SeeDifferencePrevAuto(entries[0]); });
                    }
                }
                else
                {
                    editMenu.AddDisabledItem(new GUIContent("Difference", diffIcon));
                    editMenu.AddDisabledItem(new GUIContent("Difference with previous version", diffIcon));
                }
                editMenu.AddSeparator("");
            }

            if (selectedFlags.IsFlagSet(FileStatus.Ignored))
            {
                editMenu.AddDisabledItem(new GUIContent("Revert", GitGUI.Textures.AnimationWindow));
            }
            else if (entries.Length >= 1)
            {
                if (entries[0].MetaChange == (MetaChangeEnum.Object | MetaChangeEnum.Meta))
                {
                    editMenu.AddItem(new GUIContent("Revert/Asset", GitGUI.Textures.AnimationWindow), false, () => RevertSelectedObjects(window));
                    editMenu.AddItem(new GUIContent("Revert/Meta", GitGUI.Textures.AnimationWindow), false, () => RevertSelectedMeta(window));
                }
                else
                {
                    editMenu.AddItem(new GUIContent("Revert", GitGUI.Textures.AnimationWindow), false, () => RevertSelectedCallback(window));
                }
            }

            if (entries.Length >= 1)
            {
                editMenu.AddSeparator("");
                if (entries[0].MetaChange == (MetaChangeEnum.Object | MetaChangeEnum.Meta))
                {
                    if (gitManager.CanBlame(entries[0].State))
                    {
                        editMenu.AddItem(new GUIContent("Blame/Object", GitGUI.Textures.GameView), false, () => { BlameObject(entries[0]); });
                        editMenu.AddItem(new GUIContent("Blame/Meta", GitGUI.Textures.GameView), false, () => { BlameMeta(entries[0]); });
                    }
                    else
                    {
                        editMenu.AddDisabledItem(new GUIContent("Blame", GitGUI.Textures.GameView));
                    }
                }
                else if (entries.Length > 0)
                {
                    if (gitManager.CanBlame(entries[0].State))
                    {
                        editMenu.AddItem(new GUIContent("Blame", GitGUI.Textures.GameView), false, () => { BlameAuto(entries[0]); });
                    }
                    else
                    {
                        editMenu.AddDisabledItem(new GUIContent("Blame", GitGUI.Textures.GameView));
                    }
                }
            }
            editMenu.AddSeparator("");
            if (entries.Length >= 1)
            {
                editMenu.AddItem(new GUIContent("Show In Explorer", GitGUI.Textures.FolderIcon), false, () => { EditorUtility.RevealInFinder(gitManager.ToProjectPath(entries[0].LocalPath)); });
            }
            editMenu.AddItem(new GUIContent("Open", GitGUI.Textures.OrbitTool), false, () =>
            {
                AssetDatabase.OpenAsset(entries.Select(e => AssetDatabase.LoadAssetAtPath <Object>(gitManager.ToProjectPath(e.LocalPath))).Where(a => a != null).ToArray());
            });
            editMenu.AddItem(new GUIContent("Delete", gitOverlay.icons.trashIconSmall.image), false, () =>
            {
                foreach (var entry in entries)
                {
                    window.DeleteAsset(entry.LocalPath);
                }
            });
            editMenu.AddItem(new GUIContent("Reload", GitGUI.Textures.RotateTool), false, window.ReloadCallback);
        }
Exemple #11
0
        public int Compare(StatusListEntry x, StatusListEntry y)
        {
            int stateCompare = window.IsGrouping() ? GetPriority(x.State).CompareTo(GetPriority(y.State)) : 0;

            if (stateCompare == 0)
            {
                var settings = window.GitDiffSettings;

                if (settings.sortDir == GitDiffWindow.SortDir.Descending)
                {
                    var oldLeft = x;
                    x = y;
                    y = oldLeft;
                }

                if (settings.unstagedChangesPriority)
                {
                    bool canStageX   = GitManager.CanStage(x.State);
                    bool canUnstageX = GitManager.CanUnstage(x.State);
                    bool canStageY   = GitManager.CanStage(y.State);
                    bool canUnstageY = GitManager.CanUnstage(y.State);

                    //prioritize upsaged changes that are pending
                    if ((canStageX && canUnstageX) && !(canStageY && canUnstageY))
                    {
                        return(-1);
                    }
                    if (!(canStageX && canUnstageX) && (canStageY && canUnstageY))
                    {
                        return(1);
                    }
                }

                switch (settings.sortType)
                {
                case GitDiffWindow.SortType.Name:
                    stateCompare = string.Compare(x.Name, y.Name, StringComparison.InvariantCultureIgnoreCase);
                    break;

                case GitDiffWindow.SortType.Path:
                    stateCompare = string.Compare(x.LocalPath, y.LocalPath, StringComparison.InvariantCultureIgnoreCase);
                    break;

                case GitDiffWindow.SortType.ModificationDate:
                    //todo cache modification dates
                    DateTime modifedTimeLeft  = GetClosest(gitManager.GetPathWithMeta(x.LocalPath).Select(p => File.GetLastWriteTime(UniGitPathHelper.Combine(gitManager.GetCurrentRepoPath(), p))));
                    DateTime modifedRightTime = GetClosest(gitManager.GetPathWithMeta(x.LocalPath).Select(p => File.GetLastWriteTime(UniGitPathHelper.Combine(gitManager.GetCurrentRepoPath(), p))));
                    stateCompare = DateTime.Compare(modifedRightTime, modifedTimeLeft);
                    break;

                case GitDiffWindow.SortType.CreationDate:
                    //todo cache creation dates
                    DateTime createdTimeLeft  = GetClosest(gitManager.GetPathWithMeta(x.LocalPath).Select(p => File.GetCreationTime(UniGitPathHelper.Combine(gitManager.GetCurrentRepoPath(), p))));
                    DateTime createdRightTime = GetClosest(gitManager.GetPathWithMeta(y.LocalPath).Select(p => File.GetCreationTime(UniGitPathHelper.Combine(gitManager.GetCurrentRepoPath(), p))));
                    stateCompare = DateTime.Compare(createdRightTime, createdTimeLeft);
                    break;

                default:
                    throw new ArgumentOutOfRangeException();
                }
            }
            if (stateCompare == 0)
            {
                stateCompare = String.Compare(x.LocalPath, y.LocalPath, StringComparison.Ordinal);
            }
            return(stateCompare);
        }
Exemple #12
0
 private static bool RemoveSelectedValidate()
 {
     return(Selection.assetGUIDs.Select(g => string.IsNullOrEmpty(Path.GetExtension(AssetDatabase.GUIDToAssetPath(g))) ? AssetDatabase.GUIDToAssetPath(g) + ".meta" : AssetDatabase.GUIDToAssetPath(g)).SelectMany(g => GitManager.GetPathWithMeta(g)).Any(g => GitManager.CanUnstage(GitManager.Repository.RetrieveStatus(g))));
 }