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")); } }
private static bool AddSelectedValidate() { if (initializer == null || !initializer.IsValidRepo) { return(false); } return(Selection.assetGUIDs.Select(AssetDatabase.GUIDToAssetPath).Select(p => gitManager.ToLocalPath(p)).SelectMany(gitManager.GetPathWithMeta) .Any(g => GitManager.CanStage(gitManager.Repository.RetrieveStatus(g)))); }
private static bool AddSelectedValidate() { 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.CanStage(gitManager.Repository.RetrieveStatus(g)))); }
private static bool RevetValidate() { if (gitManager == null || !initializer.IsValidRepo) { return(false); } return(Selection.assetGUIDs.Select(AssetDatabase.GUIDToAssetPath).SelectMany(gitManager.GetPathWithMeta).Where(File.Exists).Select(p => gitManager.ToLocalPath(p)) .Select(e => gitManager.Repository.RetrieveStatus(e)).Any(e => GitManager.CanStage(e) | GitManager.CanUnstage(e))); }
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); }
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(); } } } }
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 string[] OnWillSaveAssets(string[] paths) { if (EditorPrefs.GetBool("UniGit_DisablePostprocess")) { return(paths); } if (GitManager.Settings != null && GitManager.Settings.AutoStage && GitManager.Repository != null && paths != null && paths.Length > 0) { string[] pathsFinal = paths.SelectMany(g => GitManager.GetPathWithMeta(g)).Where(g => GitManager.CanStage(GitManager.Repository.RetrieveStatus(g))).ToArray(); if (pathsFinal.Length > 0) { GitManager.Repository.Stage(pathsFinal); GitManager.MarkDirty(pathsFinal); } } return(paths); }
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))); }
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); }
static void OnPostprocessAllAssets(string[] importedAssets, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths) { if (GitManager.Settings != null && GitManager.Settings.AutoStage) { if (importedAssets.Length > 0) { string[] importedAssetsFinal = importedAssets.SelectMany(g => GitManager.GetPathWithMeta(g)).Where(g => GitManager.CanStage(GitManager.Repository.RetrieveStatus(g))).ToArray(); if (importedAssetsFinal.Length > 0) { GitManager.Repository.Stage(importedAssetsFinal); } } if (movedAssets.Length > 0) { string[] movedAssetsFinal = movedAssets.SelectMany(g => GitManager.GetPathWithMeta(g)).Where(g => GitManager.CanStage(GitManager.Repository.RetrieveStatus(g))).ToArray(); if (movedAssetsFinal.Length > 0) { GitManager.Repository.Stage(movedAssetsFinal); } } } GitManager.Update(); }
private static string[] OnWillSaveAssets(string[] paths) { if (GitManager.Settings != null && GitManager.Settings.AutoStage) { string[] pathsFinal = paths.SelectMany(g => GitManager.GetPathWithMeta(g)).Where(g => GitManager.CanStage(GitManager.Repository.RetrieveStatus(g))).ToArray(); if (pathsFinal.Length > 0) { GitManager.Repository.Stage(pathsFinal); } } GitManager.Update(); return(paths); }
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); }
private static bool AddSelectedValidate() { 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.CanStage(GitManager.Repository.RetrieveStatus(g)))); }