private bool BaseFilter(VersionControlStatus vcStatus) { using (PushStateUtility.Profiler("CommitWindow::BaseFilter")) { var metaStatus = vcStatus.MetaStatus(); bool interresting = (vcStatus.fileStatus != VCFileStatus.None && (vcStatus.fileStatus != VCFileStatus.Normal || (metaStatus != null && metaStatus.fileStatus != VCFileStatus.Normal))) || vcStatus.lockStatus == VCLockStatus.LockedHere; if (!interresting) return false; ComposedString key = vcStatus.assetPath.TrimEnd(VCCAddMetaFiles.meta); return (assetPaths.Contains(key) || depedencyAssetPaths.Contains(key)); } }
public static string GetLockStatusMessage(VersionControlStatus assetStatus) { string lockMessage = assetStatus.lockStatus.ToString(); if (assetStatus.lockStatus == VCLockStatus.LockedOther) { lockMessage = Terminology.getlock + " by: " + assetStatus.owner; } if (assetStatus.lockStatus == VCLockStatus.LockedHere) { lockMessage = Terminology.getlock + " Here: " + assetStatus.owner; } if (assetStatus.lockStatus == VCLockStatus.NoLock) { if (ComposedString.IsNullOrEmpty(assetStatus.assetPath)) { lockMessage = "Not saved"; } else if (assetStatus.fileStatus == VCFileStatus.Added) { lockMessage = "Added"; } else if (assetStatus.fileStatus == VCFileStatus.Replaced) { lockMessage = "Replaced"; } else { lockMessage = VCUtility.ManagedByRepository(assetStatus) ? "Not " + Terminology.getlock : "Not on Version Control"; } } if (assetStatus.LocalEditAllowed()) { lockMessage = Terminology.allowLocalEdit; if ((assetStatus.lockStatus == VCLockStatus.LockedOther)) { lockMessage += " (" + Terminology.getlock + " By: " + assetStatus.owner + " )"; } } if (assetStatus.fileStatus == VCFileStatus.Modified) { lockMessage += "*"; } return(lockMessage); }
private bool BaseFilter(VersionControlStatus vcStatus) { using (PushStateUtility.Profiler("CommitWindow::BaseFilter")) { var metaStatus = vcStatus.MetaStatus(); bool interesting = (vcStatus.fileStatus != VCFileStatus.None && (vcStatus.fileStatus != VCFileStatus.Normal || (metaStatus != null && metaStatus.fileStatus != VCFileStatus.Normal))) || vcStatus.lockStatus == VCLockStatus.LockedHere || vcStatus.property == VCProperty.Modified; if (!interesting) { return(false); } ComposedString key = vcStatus.assetPath.TrimEnd(VCCAddMetaFiles.meta); return(assetPaths.Contains(key) || depedencyAssetPaths.Contains(key)); } }
private bool GUIFilter(VersionControlStatus vcStatus) { if (searchString.Length > 0) { return(vcStatus.assetPath.Compose().IndexOf(searchString, System.StringComparison.OrdinalIgnoreCase) >= 0); } var metaStatus = vcStatus.MetaStatus(); bool projectSetting = vcStatus.assetPath.StartsWith("ProjectSettings/"); bool unversioned = vcStatus.fileStatus == VCFileStatus.Unversioned; bool meta = metaStatus.fileStatus != VCFileStatus.Normal && vcStatus.fileStatus == VCFileStatus.Normal; bool modifiedNoLock = !projectSetting && vcStatus.ModifiedOrLocalEditAllowed(); bool bHidden = false; if (!string.IsNullOrEmpty(VCSettings.strHiddenFilePaths)) { string[] arPaths = VCSettings.strHiddenFilePaths.Split(';'); for (int i = 0; i < arPaths.Length; i++) { string strPathToCheck = arPaths[i].Trim(new[] { ' ' }); string strPath = vcStatus.assetPath.Compose(); if (strPath == strPathToCheck || (strPathToCheck != "" && strPath.StartsWith(strPathToCheck) && strPath.Replace(strPathToCheck, "").StartsWith("/"))) { bHidden = true; } } } bool bExternal = (vcStatus.fileStatus == VCFileStatus.External); bool bFitsFilter = !((!m_bShowExternal && bExternal) || (!m_bShowUserHidden && bHidden) || (!showUnversioned && unversioned) || (!showMeta && meta) || (!showModifiedNoLock && modifiedNoLock) || (!showProjectSetting && projectSetting)); return(bFitsFilter); //bool rest = !unversioned && !meta && !modifiedNoLock && !projectSetting; //return (showUnversioned && unversioned) || (showMeta && meta) || (showModifiedNoLock && modifiedNoLock) || (showProjectSetting && projectSetting) || rest; }
// This is a performance critical function private bool BaseFilter(VersionControlStatus vcStatus) { if (!vcStatus.Reflected) { return(false); } bool assetCriteria = vcStatus.fileStatus != VCFileStatus.None && (vcStatus.ModifiedOrLocalEditAllowed() || vcStatus.fileStatus != VCFileStatus.Normal || !ComposedString.IsNullOrEmpty(vcStatus.changelist)) && vcStatus.fileStatus != VCFileStatus.Ignored; if (assetCriteria) { return(true); } bool property = vcStatus.property == VCProperty.Modified || vcStatus.property == VCProperty.Conflicted; if (property) { return(true); } bool localLock = vcStatus.lockStatus == VCLockStatus.LockedHere; if (localLock) { return(true); } var metaStatus = vcStatus.MetaStatus(); bool metaCriteria = metaStatus.fileStatus != VCFileStatus.Normal && (metaStatus.fileStatus != VCFileStatus.None || !ComposedString.IsNullOrEmpty(metaStatus.changelist)) && metaStatus.fileStatus != VCFileStatus.Ignored; if (metaCriteria) { return(true); } return(false); }
public static VersionControlStatus GetDominantStatus(IReadOnlyList <VersionControlStatus> statuses) { VersionControlStatus dominantStatus = new VersionControlStatus(); foreach (var status in statuses) { if (status.lockStatus > dominantStatus.lockStatus) { dominantStatus = status; continue; } if (status.fileStatus > dominantStatus.fileStatus) { dominantStatus = status; continue; } if (status.allowLocalEdit && !dominantStatus.allowLocalEdit) { dominantStatus = status; continue; } } return(dominantStatus); }
private static VersionControlStatus ParseXMLNode(XmlNode entryIt, ComposedString assetPath) { var versionControlStatus = new VersionControlStatus(); XmlElement reposStatus = entryIt["repos-status"]; if (reposStatus != null) { if (reposStatus.Attributes["item"] != null && reposStatus.Attributes["item"].InnerText != "normal") { versionControlStatus.remoteStatus = VCRemoteFileStatus.Modified; } XmlElement lockStatus = reposStatus["lock"]; if (lockStatus != null) { if (lockStatus["owner"] != null) { versionControlStatus.owner = lockStatus["owner"].InnerText; } versionControlStatus.lockStatus = VCLockStatus.LockedOther; } } XmlElement wcStatus = entryIt["wc-status"]; if (wcStatus != null) { if (wcStatus.Attributes["item"] == null || !SVNToVersionControlStatusMap.fileStatusMap.TryGetValue(wcStatus.Attributes["item"].InnerText, out versionControlStatus.fileStatus)) { DebugLog.Log("SVN: Unknown file status: " + wcStatus.Attributes["item"].InnerText); } if (wcStatus.Attributes["props"] == null || !SVNToVersionControlStatusMap.propertyMap.TryGetValue(wcStatus.Attributes["props"].InnerText, out versionControlStatus.property)) { DebugLog.Log("SVN: Unknown property: " + wcStatus.Attributes["props"].InnerText); } if (wcStatus.Attributes["revision"] != null) { versionControlStatus.revision = Int32.Parse(wcStatus.Attributes["revision"].InnerText); } if (wcStatus.Attributes["wc-locked"] != null && wcStatus.Attributes["wc-locked"].InnerText == "true") { versionControlStatus.repositoryStatus = VCRepositoryStatus.Locked; } if (wcStatus.Attributes["tree-conflicted"] != null) { versionControlStatus.treeConflictStatus = (wcStatus.Attributes["tree-conflicted"].InnerText == "true") ? VCTreeConflictStatus.TreeConflict : VCTreeConflictStatus.Normal; } /*if (wcStatus.Attributes["moved-from"] != null) * { * var movedFrom = new ComposedString(wcStatus.Attributes["moved-from"].InnerText.Replace('\\', '/').Trim()); * if (movedFrom.StartsWith(dot)) * { * var lastIndex = assetPath.FindLastIndex(slash); * if (lastIndex != -1) * { * versionControlStatus.movedFrom = assetPath.GetSubset(0, lastIndex + 1) + movedFrom; * } * } * else * { * versionControlStatus.movedFrom = movedFrom; * } * Debug.Log($"Moved From {movedFrom} => {assetPath} : {versionControlStatus.movedFrom}"); * }*/ XmlElement commit = wcStatus["commit"]; if (commit != null) { if (commit.Attributes["revision"] != null) { versionControlStatus.lastModifiedRevision = Int32.Parse(commit.Attributes["revision"].InnerText); } if (commit["author"] != null) { versionControlStatus.user = commit["author"].InnerText; } } XmlElement lockStatus = wcStatus["lock"]; if (lockStatus != null) { if (lockStatus["owner"] != null) { versionControlStatus.owner = lockStatus["owner"].InnerText; } if (lockStatus["token"] != null) { versionControlStatus.lockToken = lockStatus["token"].InnerText; } versionControlStatus.lockStatus = VCLockStatus.LockedHere; } } return(versionControlStatus); }
private static GUIContent GetFileStatusContent(VersionControlStatus assetStatus) { if (assetStatus.treeConflictStatus != VCTreeConflictStatus.Normal) return new GUIContent(assetStatus.treeConflictStatus.ToString(), IconUtils.squareIcon.GetTexture(AssetStatusUtils.GetStatusColor(assetStatus, true))); return new GUIContent(AssetStatusUtils.GetStatusText(assetStatus), IconUtils.circleIcon.GetTexture(AssetStatusUtils.GetStatusColor(assetStatus, true))); }
public static bool ModifiedWithoutRights(this VersionControlStatus vcs) { return(ModifiedWithoutLock(vcs) && !LocalEditAllowed(vcs)); }
public static bool LocalEditAllowed(this VersionControlStatus vcs) { return(vcs.allowLocalEdit); }
public bool GetStatus(StatusLevel statusLevel, string fstatArgs, string path) { //D.Log( "Processing " + path ); string arguments = "status -aedf \"" + path + "\""; CommandLineOutput statusCommandLineOutput = null; if (statusLevel == StatusLevel.Local) { using (var p4StatusTask = P4Util.Instance.CreateP4CommandLine(arguments)) { statusCommandLineOutput = P4Util.Instance.ExecuteOperation(p4StatusTask); } } arguments = fstatArgs + " \"" + path + "\""; CommandLineOutput fstatCommandLineOutput = null; using (var p4FstatTask = P4Util.Instance.CreateP4CommandLine(arguments)) { fstatCommandLineOutput = P4Util.Instance.ExecuteOperation(p4FstatTask); } if (statusCommandLineOutput == null || statusCommandLineOutput.Failed || string.IsNullOrEmpty(statusCommandLineOutput.OutputStr) || !active) { return(false); } if (fstatCommandLineOutput == null || fstatCommandLineOutput.Failed || string.IsNullOrEmpty(fstatCommandLineOutput.OutputStr) || !active) { return(false); } try { var statusDB = statusCommandLineOutput != null?P4StatusParser.P4ParseStatus(statusCommandLineOutput.OutputStr, P4Util.Instance.Vars.userName) : null; var fstatDB = P4StatusParser.P4ParseFstat(fstatCommandLineOutput.OutputStr, P4Util.Instance.Vars.workingDirectory); lock (statusDatabaseLockToken) { if (statusDB != null) { foreach (var statusIt in statusDB) { var status = statusIt.Value; status.reflectionLevel = statusLevel == StatusLevel.Remote ? VCReflectionLevel.Repository : VCReflectionLevel.Local; statusDatabase[new ComposedString(statusIt.Key.Compose().Replace(P4Util.Instance.Vars.workingDirectory + "/", ""))] = status; } } foreach (var statusIt in fstatDB) { VersionControlStatus status = null; ComposedString aPath = new ComposedString(statusIt.Key.Compose().Replace(P4Util.Instance.Vars.workingDirectory + "/", "")); statusDatabase.TryGetValue(aPath, out status); if (status == null || status.reflectionLevel == VCReflectionLevel.Pending) { // no previous status or previous status is pending, so set it here status = statusIt.Value; } else { // probably got this status from the "status -a -e -d" command, merge it with whatever we got back from fstat if (status.fileStatus == VCFileStatus.Modified && statusIt.Value.remoteStatus == VCRemoteFileStatus.Modified) { // we have modified locally and file is out of date with server - mark as a conflict (might not be, but at // least this will raise a flag with the user to make sure they get up to date before going any further) status.fileStatus = VCFileStatus.Conflicted; status.treeConflictStatus = VCTreeConflictStatus.TreeConflict; } } status.reflectionLevel = statusLevel == StatusLevel.Remote ? VCReflectionLevel.Repository : VCReflectionLevel.Local; statusDatabase[aPath] = status; } } lock (requestQueueLockToken) { if (statusDB != null) { foreach (var assetIt in statusDB.Keys) { if (statusLevel == StatusLevel.Remote) { remoteRequestQueue.Remove(assetIt.Compose()); } localRequestQueue.Remove(assetIt.Compose()); } } foreach (var assetIt in fstatDB.Keys) { if (statusLevel == StatusLevel.Remote) { remoteRequestQueue.Remove(assetIt.Compose()); } localRequestQueue.Remove(assetIt.Compose()); } } OnStatusCompleted(); } catch (Exception e) { DebugLog.ThrowException(e); return(false); } return(true); }
private static VersionControlStatus PopulateFromFstatData(P4FStatData fileData) { var versionControlStatus = new VersionControlStatus(); versionControlStatus.remoteStatus = fileData.haveRev == fileData.headRev ? VCRemoteFileStatus.None : VCRemoteFileStatus.Modified; versionControlStatus.lastModifiedRevision = fileData.headRev == -1 ? 1 : fileData.headRev; versionControlStatus.revision = fileData.haveRev == -1 ? 1 : fileData.haveRev; versionControlStatus.repositoryStatus = VCRepositoryStatus.NotLocked; // this is only regarding the local copy versionControlStatus.user = ""; // supposed to be the last person who checked the file in - don't have that info in p4 fstat // we could do another p4 call, but that would not be performant for most cases versionControlStatus.changelist = fileData.change; if (fileData.otherLock) { versionControlStatus.lockStatus = VCLockStatus.LockedOther; versionControlStatus.owner = fileData.otherOwner; } else if (fileData.ourLock) { versionControlStatus.lockStatus = VCLockStatus.LockedHere; versionControlStatus.repositoryStatus = VCRepositoryStatus.Locked; versionControlStatus.owner = fileData.actionOwner; } else { versionControlStatus.lockStatus = VCLockStatus.NoLock; } if (!String.IsNullOrEmpty(fileData.action)) { switch (fileData.action) { case "add": versionControlStatus.fileStatus = VCFileStatus.Added; versionControlStatus.owner = fileData.actionOwner; break; case "edit": // if we have it checked out and this is a "+l" type file, it must be locked if (fileData.type.IndexOf("+l") != -1) { versionControlStatus.lockStatus = VCLockStatus.LockedHere; versionControlStatus.repositoryStatus = VCRepositoryStatus.Locked; } else if (versionControlStatus.lockStatus == VCLockStatus.NoLock) { versionControlStatus.allowLocalEdit = true; } versionControlStatus.owner = fileData.actionOwner; break; case "delete": versionControlStatus.fileStatus = VCFileStatus.Deleted; versionControlStatus.owner = fileData.actionOwner; break; default: D.LogError(String.Format("Unexpected action type: {0} for file {1} - status may be incorrect.", fileData.action, fileData.clientFile)); break; } } versionControlStatus.treeConflictStatus = VCTreeConflictStatus.Normal; // if (wcStatus.Attributes["tree-conflicted"] != null) versionControlStatus.treeConflictStatus = (wcStatus.Attributes["tree-conflicted"].InnerText == "true") ? VCTreeConflictStatus.TreeConflict : VCTreeConflictStatus.Normal; return(versionControlStatus); }
private static VersionControlStatus ParseStatusLine(String line, String username) { // typical p4 status return lines: // "path\to\readme.txt - reconcile to add //depot/path/to/readme#1" // "path\to\readme.txt - reconcile to edit //depot/path/to/readme#2" // "path\to\readme.txt - reconcile to delete //depot/path/to/readme#2" var versionControlStatus = new VersionControlStatus(); versionControlStatus.revision = versionControlStatus.lastModifiedRevision = Int32.Parse(line.Substring(line.LastIndexOf("#") + 1)); versionControlStatus.repositoryStatus = VCRepositoryStatus.NotLocked; // versionControlStatus.treeConflictStatus = VCTreeConflictStatus.Normal; versionControlStatus.user = ""; if (line.Contains("reconcile to add")) { // file is unversioned versionControlStatus.remoteStatus = VCRemoteFileStatus.None; versionControlStatus.fileStatus = VCFileStatus.Unversioned; versionControlStatus.user = username; } else if (line.Contains("reconcile to edit")) { // file is edited locally, but not checked out - bad user! // versionControlStatus.remoteStatus = VCRemoteFileStatus.Modified; versionControlStatus.fileStatus = VCFileStatus.Modified; // versionControlStatus.treeConflictStatus = VCTreeConflictStatus.TreeConflict; } else if (line.Contains("reconcile to delete")) { // file is versioned, but has been deleted locally // versionControlStatus.remoteStatus = VCRemoteFileStatus.Modified; versionControlStatus.fileStatus = VCFileStatus.Deleted; } /* XmlElement reposStatus = entryIt["repos-status"]; if (reposStatus != null) { if (reposStatus.Attributes["item"] != null && reposStatus.Attributes["item"].InnerText != "normal") versionControlStatus.remoteStatus = VCRemoteFileStatus.Modified; XmlElement lockStatus = reposStatus["lock"]; if (lockStatus != null) { if (lockStatus["owner"] != null) versionControlStatus.owner = lockStatus["owner"].InnerText; versionControlStatus.lockStatus = VCLockStatus.LockedOther; } } XmlElement wcStatus = entryIt["wc-status"]; if (wcStatus != null) { if (wcStatus.Attributes["item"] == null || !P4ToVersionControlStatusMap.fileStatusMap.TryGetValue(wcStatus.Attributes["item"].InnerText, out versionControlStatus.fileStatus)) D.Log("P4: Unknown file status: " + wcStatus.Attributes["item"].InnerText); if (wcStatus.Attributes["props"] == null || !P4ToVersionControlStatusMap.propertyMap.TryGetValue(wcStatus.Attributes["props"].InnerText, out versionControlStatus.property)) D.Log("P4: Unknown property: " + wcStatus.Attributes["props"].InnerText); if (wcStatus.Attributes["revision"] != null) versionControlStatus.revision = Int32.Parse(wcStatus.Attributes["revision"].InnerText); if (wcStatus.Attributes["wc-locked"] != null && wcStatus.Attributes["wc-locked"].InnerText == "true") versionControlStatus.repositoryStatus = VCRepositoryStatus.Locked; if (wcStatus.Attributes["tree-conflicted"] != null) versionControlStatus.treeConflictStatus = (wcStatus.Attributes["tree-conflicted"].InnerText == "true") ? VCTreeConflictStatus.TreeConflict : VCTreeConflictStatus.Normal; XmlElement commit = wcStatus["commit"]; if (commit != null) { if (commit.Attributes["revision"] != null) versionControlStatus.lastModifiedRevision = Int32.Parse(commit.Attributes["revision"].InnerText); if (commit["author"] != null) versionControlStatus.user = commit["author"].InnerText; } XmlElement lockStatus = wcStatus["lock"]; if (lockStatus != null) { if (lockStatus["owner"] != null) versionControlStatus.owner = lockStatus["owner"].InnerText; if (lockStatus["token"] != null) versionControlStatus.lockToken = lockStatus["token"].InnerText; versionControlStatus.lockStatus = VCLockStatus.LockedHere; } } */ return versionControlStatus; }
private static VersionControlStatus PopulateFromFstatData(P4FStatData fileData) { var versionControlStatus = new VersionControlStatus(); versionControlStatus.remoteStatus = fileData.haveRev == fileData.headRev ? VCRemoteFileStatus.None : VCRemoteFileStatus.Modified; versionControlStatus.lastModifiedRevision = fileData.headRev == -1 ? 1 : fileData.headRev; versionControlStatus.revision = fileData.haveRev == -1 ? 1 : fileData.haveRev; versionControlStatus.repositoryStatus = VCRepositoryStatus.NotLocked; // this is only regarding the local copy versionControlStatus.user = ""; // supposed to be the last person who checked the file in - don't have that info in p4 fstat // we could do another p4 call, but that would not be performant for most cases versionControlStatus.changelist = fileData.change; if (fileData.otherLock) { versionControlStatus.lockStatus = VCLockStatus.LockedOther; versionControlStatus.owner = fileData.otherOwner; } else if (fileData.ourLock) { versionControlStatus.lockStatus = VCLockStatus.LockedHere; versionControlStatus.repositoryStatus = VCRepositoryStatus.Locked; versionControlStatus.owner = fileData.actionOwner; } else { versionControlStatus.lockStatus = VCLockStatus.NoLock; } if (!String.IsNullOrEmpty(fileData.action)) { switch (fileData.action) { case "add": versionControlStatus.fileStatus = VCFileStatus.Added; versionControlStatus.owner = fileData.actionOwner; break; case "edit": // if we have it checked out and this is a "+l" type file, it must be locked if (fileData.type.IndexOf("+l") != -1) { versionControlStatus.lockStatus = VCLockStatus.LockedHere; versionControlStatus.repositoryStatus = VCRepositoryStatus.Locked; } else if (versionControlStatus.lockStatus == VCLockStatus.NoLock) { versionControlStatus.allowLocalEdit = true; } versionControlStatus.owner = fileData.actionOwner; break; case "delete": versionControlStatus.fileStatus = VCFileStatus.Deleted; versionControlStatus.owner = fileData.actionOwner; break; default: D.LogError(String.Format("Unexpected action type: {0} for file {1} - status may be incorrect.", fileData.action, fileData.clientFile)); break; } } versionControlStatus.treeConflictStatus = VCTreeConflictStatus.Normal; // if (wcStatus.Attributes["tree-conflicted"] != null) versionControlStatus.treeConflictStatus = (wcStatus.Attributes["tree-conflicted"].InnerText == "true") ? VCTreeConflictStatus.TreeConflict : VCTreeConflictStatus.Normal; return versionControlStatus; }
public static string GetStatusText(VersionControlStatus assetStatus) { if (assetStatus.reflectionLevel == VCReflectionLevel.Pending) { return("Pending"); } if (assetStatus.fileStatus == VCFileStatus.Conflicted) { return("Conflicted"); } if (assetStatus.fileStatus == VCFileStatus.Deleted) { return("Deleted"); } if (assetStatus.lockStatus == VCLockStatus.LockedHere) { return(Terminology.getlock + (assetStatus.fileStatus == VCFileStatus.Modified?"*":"")); } if (assetStatus.localOnly) { return("Local Only!"); } if (assetStatus.LocalEditAllowed()) { return(Terminology.allowLocalEdit + (assetStatus.fileStatus == VCFileStatus.Modified ? "*" : "")); } if (assetStatus.ModifiedWithoutLock()) { return("Modified!"); } if (assetStatus.lockStatus == VCLockStatus.LockedOther) { return(Terminology.lockedBy + "'" + assetStatus.owner + "'"); } if (assetStatus.fileStatus == VCFileStatus.Modified) { return("Modified"); } if (assetStatus.fileStatus == VCFileStatus.Unversioned) { return(Terminology.unversioned); } if (assetStatus.fileStatus == VCFileStatus.Added) { return("Added"); } if (assetStatus.property == VCProperty.Modified) { return("[Merge Info]"); } if (assetStatus.fileStatus == VCFileStatus.Replaced) { return("Replaced"); } if (assetStatus.fileStatus == VCFileStatus.Ignored) { return("Ignored"); } if (assetStatus.remoteStatus == VCRemoteFileStatus.Modified) { return("Modified on server"); } if (assetStatus.fileStatus == VCFileStatus.Normal) { return("Normal"); } return("-"); }
public static Color GetStatusColor(VersionControlStatus assetStatus, bool includeLockStatus) { if (assetStatus.treeConflictStatus == VCTreeConflictStatus.TreeConflict) { return(conflictedColor); } if (assetStatus.fileStatus == VCFileStatus.Conflicted) { return(conflictedColor); } if (assetStatus.fileStatus == VCFileStatus.Missing) { return(missingColor); } if (assetStatus.fileStatus == VCFileStatus.Ignored) { return(ignoreColor); } if (assetStatus.LocalEditAllowed()) { return(localEditColor); } if (assetStatus.ModifiedWithoutLock()) { return(modifiedNoLockColor); } if (assetStatus.fileStatus == VCFileStatus.Deleted) { return(deletedColor); } if (assetStatus.fileStatus == VCFileStatus.Added) { return(addedColor); } if (includeLockStatus) { if (assetStatus.lockStatus == VCLockStatus.LockedHere) { return(lockedColor); } if (assetStatus.lockStatus == VCLockStatus.LockedOther) { return(lockedOtherColor); } } if (assetStatus.fileStatus == VCFileStatus.Modified) { return(modifiedColor); } if (assetStatus.reflectionLevel == VCReflectionLevel.Pending) { return(pendingColor); } if (assetStatus.fileStatus == VCFileStatus.Unversioned) { return(unversionedColor); } if (assetStatus.remoteStatus == VCRemoteFileStatus.Modified) { return(remoteModifiedColor); } if (assetStatus.fileStatus == VCFileStatus.Normal) { return(normalColor); } return(pink); }
private static VersionControlStatus ParseStatusLine(String line, String username) { // typical p4 status return lines: // "path\to\readme.txt - reconcile to add //depot/path/to/readme#1" // "path\to\readme.txt - reconcile to edit //depot/path/to/readme#2" // "path\to\readme.txt - reconcile to delete //depot/path/to/readme#2" var versionControlStatus = new VersionControlStatus(); versionControlStatus.revision = versionControlStatus.lastModifiedRevision = Int32.Parse(line.Substring(line.LastIndexOf("#") + 1)); versionControlStatus.repositoryStatus = VCRepositoryStatus.NotLocked; // versionControlStatus.treeConflictStatus = VCTreeConflictStatus.Normal; versionControlStatus.user = ""; if (line.Contains("reconcile to add")) { // file is unversioned versionControlStatus.remoteStatus = VCRemoteFileStatus.None; versionControlStatus.fileStatus = VCFileStatus.Unversioned; versionControlStatus.user = username; } else if (line.Contains("reconcile to edit")) { // file is edited locally, but not checked out - bad user! // versionControlStatus.remoteStatus = VCRemoteFileStatus.Modified; versionControlStatus.fileStatus = VCFileStatus.Modified; // versionControlStatus.treeConflictStatus = VCTreeConflictStatus.TreeConflict; } else if (line.Contains("reconcile to delete")) { // file is versioned, but has been deleted locally // versionControlStatus.remoteStatus = VCRemoteFileStatus.Modified; versionControlStatus.fileStatus = VCFileStatus.Deleted; } /* * XmlElement reposStatus = entryIt["repos-status"]; * if (reposStatus != null) * { * if (reposStatus.Attributes["item"] != null && reposStatus.Attributes["item"].InnerText != "normal") versionControlStatus.remoteStatus = VCRemoteFileStatus.Modified; * * XmlElement lockStatus = reposStatus["lock"]; * if (lockStatus != null) * { * if (lockStatus["owner"] != null) versionControlStatus.owner = lockStatus["owner"].InnerText; * versionControlStatus.lockStatus = VCLockStatus.LockedOther; * } * } * * XmlElement wcStatus = entryIt["wc-status"]; * if (wcStatus != null) * { * if (wcStatus.Attributes["item"] == null || !P4ToVersionControlStatusMap.fileStatusMap.TryGetValue(wcStatus.Attributes["item"].InnerText, out versionControlStatus.fileStatus)) D.Log("P4: Unknown file status: " + wcStatus.Attributes["item"].InnerText); * if (wcStatus.Attributes["props"] == null || !P4ToVersionControlStatusMap.propertyMap.TryGetValue(wcStatus.Attributes["props"].InnerText, out versionControlStatus.property)) D.Log("P4: Unknown property: " + wcStatus.Attributes["props"].InnerText); * * if (wcStatus.Attributes["revision"] != null) versionControlStatus.revision = Int32.Parse(wcStatus.Attributes["revision"].InnerText); * if (wcStatus.Attributes["wc-locked"] != null && wcStatus.Attributes["wc-locked"].InnerText == "true") versionControlStatus.repositoryStatus = VCRepositoryStatus.Locked; * if (wcStatus.Attributes["tree-conflicted"] != null) versionControlStatus.treeConflictStatus = (wcStatus.Attributes["tree-conflicted"].InnerText == "true") ? VCTreeConflictStatus.TreeConflict : VCTreeConflictStatus.Normal; * * XmlElement commit = wcStatus["commit"]; * if (commit != null) * { * if (commit.Attributes["revision"] != null) versionControlStatus.lastModifiedRevision = Int32.Parse(commit.Attributes["revision"].InnerText); * if (commit["author"] != null) versionControlStatus.user = commit["author"].InnerText; * } * * XmlElement lockStatus = wcStatus["lock"]; * if (lockStatus != null) * { * if (lockStatus["owner"] != null) versionControlStatus.owner = lockStatus["owner"].InnerText; * if (lockStatus["token"] != null) versionControlStatus.lockToken = lockStatus["token"].InnerText; * versionControlStatus.lockStatus = VCLockStatus.LockedHere; * } * } */ return(versionControlStatus); }
public static bool ModifiedWithoutLock(this VersionControlStatus vcs) { return(vcs.fileStatus == VCFileStatus.Modified && vcs.lockStatus != VCLockStatus.LockedHere && !MergeHandler.IsMergableAsset(vcs.assetPath)); }
public static GUIStyle GetVCBox(VersionControlStatus assetStatus) { return new GUIStyle(GUI.skin.box) { border = new RectOffset(2, 2, 2, 2), padding = new RectOffset(1, 1, 1, 1), normal = { background = IconUtils.boxIcon.GetTexture(AssetStatusUtils.GetStatusColor(assetStatus, true)) } }; }
public static bool HaveAssetControl(this VersionControlStatus vcs) { return(VCUtility.HaveAssetControl(vcs)); }
public static void VersionControlStatusGUI(GUIStyle style, VersionControlStatus assetStatus, Object obj, bool showAddCommit, bool showLockAndAllowLocalEdit, bool showRevert, bool confirmRevert = false) { using (new PushState<bool>(GUI.enabled, VCCommands.Instance.Ready, v => GUI.enabled = v)) { if (assetStatus.lockStatus == VCLockStatus.LockedHere || assetStatus.ModifiedOrLocalEditAllowed() || !VCUtility.ManagedByRepository(assetStatus)) { if (!assetStatus.ModifiedOrLocalEditAllowed() && obj.GetAssetPath() != "" && showAddCommit) { if (GUILayout.Button((VCUtility.ManagedByRepository(assetStatus) ? Terminology.commit : Terminology.add), GetPrefabToolbarStyle(style, true))) { VCUtility.ApplyAndCommit(obj, Terminology.commit + " from Inspector"); } } } if (!VCUtility.HaveVCLock(assetStatus) && VCUtility.ManagedByRepository(assetStatus) && showLockAndAllowLocalEdit) { if (assetStatus.fileStatus == VCFileStatus.Added) { if (GUILayout.Button(Terminology.commit, GetPrefabToolbarStyle(style, true))) { VCUtility.ApplyAndCommit(obj, Terminology.commit + " from Inspector"); } } else if (assetStatus.lockStatus != VCLockStatus.LockedOther) { if (GUILayout.Button(Terminology.getlock, GetPrefabToolbarStyle(style, true))) { VCCommands.Instance.GetLockTask(obj.ToAssetPaths()); } } if (!assetStatus.LocalEditAllowed()) { if (GUILayout.Button(Terminology.allowLocalEdit, GetPrefabToolbarStyle(style, true))) { VCCommands.Instance.AllowLocalEdit(obj.ToAssetPaths()); } } } if (showRevert) { if (GUILayout.Button(Terminology.revert, GetPrefabToolbarStyle(style, VCUtility.ShouldVCRevert(obj)))) { if ((!confirmRevert || Event.current.shift) || VCUtility.VCDialog(Terminology.revert, obj)) { var seletedGo = Selection.activeGameObject; var revertedObj = VCUtility.Revert(obj); OnNextUpdate.Do(() => Selection.activeObject = ((obj is GameObject) ? revertedObj : seletedGo)); } } } } }
public static VersionControlStatus MetaStatus(this VersionControlStatus vcs) { return(vcs.assetPath.EndsWith(VCCAddMetaFiles.meta) ? vcs : VCCommands.Instance.GetAssetStatus(vcs.assetPath + VCCAddMetaFiles.meta)); }
private static VersionControlStatus ParseXMLNode(XmlNode entryIt) { var versionControlStatus = new VersionControlStatus(); XmlElement reposStatus = entryIt["repos-status"]; if (reposStatus != null) { if (reposStatus.Attributes["item"] != null && reposStatus.Attributes["item"].InnerText != "normal") { versionControlStatus.remoteStatus = VCRemoteFileStatus.Modified; } XmlElement lockStatus = reposStatus["lock"]; if (lockStatus != null) { if (lockStatus["owner"] != null) { versionControlStatus.owner = lockStatus["owner"].InnerText; } versionControlStatus.lockStatus = VCLockStatus.LockedOther; } } XmlElement wcStatus = entryIt["wc-status"]; if (wcStatus != null) { if (wcStatus.Attributes["item"] == null || !SVNToVersionControlStatusMap.fileStatusMap.TryGetValue(wcStatus.Attributes["item"].InnerText, out versionControlStatus.fileStatus)) { D.Log("SVN: Unknown file status: " + wcStatus.Attributes["item"].InnerText); } if (wcStatus.Attributes["props"] == null || !SVNToVersionControlStatusMap.propertyMap.TryGetValue(wcStatus.Attributes["props"].InnerText, out versionControlStatus.property)) { D.Log("SVN: Unknown property: " + wcStatus.Attributes["props"].InnerText); } if (wcStatus.Attributes["revision"] != null) { versionControlStatus.revision = Int32.Parse(wcStatus.Attributes["revision"].InnerText); } if (wcStatus.Attributes["wc-locked"] != null && wcStatus.Attributes["wc-locked"].InnerText == "true") { versionControlStatus.repositoryStatus = VCRepositoryStatus.Locked; } if (wcStatus.Attributes["tree-conflicted"] != null) { versionControlStatus.treeConflictStatus = (wcStatus.Attributes["tree-conflicted"].InnerText == "true") ? VCTreeConflictStatus.TreeConflict : VCTreeConflictStatus.Normal; } XmlElement commit = wcStatus["commit"]; if (commit != null) { if (commit.Attributes["revision"] != null) { versionControlStatus.lastModifiedRevision = Int32.Parse(commit.Attributes["revision"].InnerText); } if (commit["author"] != null) { versionControlStatus.user = commit["author"].InnerText; } } XmlElement lockStatus = wcStatus["lock"]; if (lockStatus != null) { if (lockStatus["owner"] != null) { versionControlStatus.owner = lockStatus["owner"].InnerText; } if (lockStatus["token"] != null) { versionControlStatus.lockToken = lockStatus["token"].InnerText; } versionControlStatus.lockStatus = VCLockStatus.LockedHere; } } return(versionControlStatus); }
public void SetMasterSelection(VersionControlStatus status, bool selected) { if (selected) masterSelection.Add(status); else masterSelection.Remove(status); }
static void SceneViewUpdate(SceneView sceneView) { EditorUpdate(); if (!shouldDraw) { return; } if (Event.current.type == EventType.Layout) { string assetPath = selectionPath; VCUtility.RequestStatus(assetPath, VCSettings.HierarchyReflectionMode); vcSceneStatus = VCCommands.Instance.GetAssetStatus(assetPath); validActions = VCGUIControls.GetValidActions(assetPath); } buttonStyle = new GUIStyle(EditorStyles.miniButton) { margin = new RectOffset(0, 0, 0, 0), fixedWidth = 80 }; backgroundGuiStyle = VCGUIControls.GetVCBox(vcSceneStatus); backgroundGuiStyle.padding = new RectOffset(4, 8, 1, 1); backgroundGuiStyle.margin = new RectOffset(1, 1, 1, 1); backgroundGuiStyle.border = new RectOffset(1, 1, 1, 1); backgroundGuiStyle.alignment = TextAnchor.MiddleCenter; var rect = new Rect(5, 5, 800, 100); Handles.BeginGUI(); GUILayout.BeginArea(new Rect(0, 0, rect.width, rect.height)); GUILayout.BeginHorizontal(); GUILayout.TextField(AssetStatusUtils.GetLockStatusMessage(vcSceneStatus), backgroundGuiStyle); GUILayout.Label(selectionPath.Substring(selectionPath.LastIndexOf('/') + 1)); GUILayout.EndHorizontal(); int numberOfButtons = 0; const int maxButtons = 4; using (GUILayoutHelper.Vertical()) { using (new PushState <bool>(GUI.enabled, VCCommands.Instance.Ready, v => GUI.enabled = v)) { if (validActions.showAdd) { numberOfButtons++; if (GUILayout.Button(Terminology.add, buttonStyle)) { SceneManagerUtilities.SaveActiveScene(); OnNextUpdate.Do(() => VCCommands.Instance.CommitDialog(new[] { selectionPath })); } } if (validActions.showOpen) { numberOfButtons++; if (GUILayout.Button(Terminology.getlock, buttonStyle)) { VCCommands.Instance.GetLockTask(new[] { selectionPath }); } } if (validActions.showCommit) { numberOfButtons++; if (GUILayout.Button(Terminology.commit, buttonStyle)) { OnNextUpdate.Do(() => VCCommands.Instance.CommitDialog(new[] { selectionPath })); } } if (validActions.showRevert) { numberOfButtons++; if (GUILayout.Button(new GUIContent(Terminology.revert, "Shift-click to " + Terminology.revert + " without confirmation"), buttonStyle)) { var sceneAssetPath = new[] { selectionPath }; if (Event.current.shift || VCUtility.VCDialog(Terminology.revert, sceneAssetPath)) { VCCommands.Instance.Revert(sceneAssetPath); } } } if (validActions.showOpenLocal) { numberOfButtons++; if (GUILayout.Button(Terminology.allowLocalEdit, buttonStyle)) { VCCommands.Instance.AllowLocalEdit(new[] { selectionPath }); } } if (validActions.showUnlock) { numberOfButtons++; if (GUILayout.Button(Terminology.unlock, buttonStyle)) { OnNextUpdate.Do(() => VCCommands.Instance.ReleaseLock(new[] { selectionPath })); } } if (validActions.showForceOpen) { numberOfButtons++; if (GUILayout.Button("Force Open", buttonStyle)) { OnNextUpdate.Do(() => VCUtility.GetLock(selectionPath, OperationMode.Force)); } } // bug: Workaround for a bug in Unity to avoid Tools getting stuck when number of GUI elements change while right mouse is down. using (GUILayoutHelper.Enabled(false)) { for (int i = numberOfButtons; i <= maxButtons; ++i) { GUI.Button(new Rect(0, 0, 0, 0), "", EditorStyles.label); } } } } GUILayout.EndArea(); Handles.EndGUI(); }
public void RefreshGUIFilter() { ProfilerUtilities.BeginSample("MultiColumnAssetList::RefreshGUIFilter"); //showBoldLabels = multiColumnState.Ascending && multiColumnState.SelectedColumnIndex == 2; if (m_MultiColumnView.bShowAdditionalFolders) { List <VersionControlStatus> dataWithLabels = interrestingStatus.Where(status => guiFilter(status)).ToList(); foreach (VersionControlStatus item in dataWithLabels.ToList()) { string strPath = System.IO.Path.GetDirectoryName(item.assetPath.Compose()).Replace('\\', '/'); VersionControlStatus itemCurrent = item; while (strPath != "") { int index = dataWithLabels.IndexOf(itemCurrent) + 1; VersionControlStatus status = new VersionControlStatus(); status.assetPath = strPath; status.allowLocalEdit = false; status.isFolderLabel = true; if (!dataWithLabels.Any(x => x.assetPath == status.assetPath)) { dataWithLabels.Insert(index, status); } itemCurrent = status; strPath = System.IO.Path.GetDirectoryName(itemCurrent.assetPath.Compose()).Replace('\\', '/'); } } m_MultiColumnView.setItems(dataWithLabels); } else { //if (showBoldLabels) //{ // // HACK: We want to display bold folder labels above our rows like the old Unity Asset Server window. // // Therefore, for each folder path we add an additional asset which only displays the path. // // Used in MultiColumnView.ListViewRow to draw bold labels without any meta information when isFolderLabel is true. // List<VersionControlStatus> dataWithLabels = interrestingStatus.Where(status => guiFilter(status)).ToList(); // foreach (VersionControlStatus item in dataWithLabels.ToList()) // { // int index = dataWithLabels.IndexOf(item) + 1; // VersionControlStatus status = new VersionControlStatus(); // status.assetPath = System.IO.Path.GetDirectoryName(item.assetPath.Compose()); // status.allowLocalEdit = false; // status.isFolderLabel = true; // if (!dataWithLabels.Any(x => x.assetPath == status.assetPath)) // dataWithLabels.Insert(index, status); // } // multiColumnState.Refresh(dataWithLabels); //} //else //{ m_MultiColumnView.setItems(interrestingStatus.Where(status => guiFilter(status))); } //} // End Hack. ProfilerUtilities.EndSample(); }
private static StatusDatabase ParseStatusResult(XmlDocument xmlDoc) { if (!xmlDoc.HasChildNodes) return null; var statusDatabase = new StatusDatabase(); XmlNodeList entries = xmlDoc.GetElementsByTagName("entry"); foreach (XmlNode entryIt in entries) { ComposedString assetPath = new ComposedString((entryIt.Attributes["path"].InnerText.Replace('\\', '/')).Trim()); var status = ParseXMLNode(entryIt); status.assetPath = assetPath; statusDatabase[assetPath] = status; } XmlNodeList changelists = xmlDoc.GetElementsByTagName("changelist"); foreach (XmlNode changelistIt in changelists) { string changelist = changelistIt.Attributes["name"].InnerText; foreach (XmlNode entryIt in changelistIt.ChildNodes) { ComposedString assetPath = new ComposedString((entryIt.Attributes["path"].InnerText.Replace('\\', '/')).Trim()); if (statusDatabase.ContainsKey(assetPath)) { statusDatabase[assetPath].changelist = changelist; if (changelist == SVNCommands.localEditChangeList) { statusDatabase[assetPath].allowLocalEdit = true; } } } } foreach (var assetPathIt in new List<ComposedString>(statusDatabase.Keys)) { string assetPathStr = assetPathIt.Compose(); if (Directory.Exists(assetPathStr)) { var status = statusDatabase[assetPathIt]; if (status.fileStatus == VCFileStatus.Unversioned) { foreach (var unversionedIt in GetFilesInFolder(assetPathStr)) { var fileStatus = new VersionControlStatus { assetPath = unversionedIt, fileStatus = VCFileStatus.Unversioned, }; statusDatabase[unversionedIt] = fileStatus; } } } } return statusDatabase; }
private static StatusDatabase ParseStatusResult(XmlDocument xmlDoc) { if (!xmlDoc.HasChildNodes) { return(null); } var statusDatabase = new StatusDatabase(); XmlNodeList entries = xmlDoc.GetElementsByTagName("entry"); foreach (XmlNode entryIt in entries) { ComposedString assetPath = new ComposedString((entryIt.Attributes["path"].InnerText.Replace('\\', '/')).Trim()); var status = ParseXMLNode(entryIt, assetPath); status.assetPath = assetPath; statusDatabase[assetPath] = status; } XmlNodeList changelists = xmlDoc.GetElementsByTagName("changelist"); foreach (XmlNode changelistIt in changelists) { string changelist = changelistIt.Attributes["name"].InnerText; foreach (XmlNode entryIt in changelistIt.ChildNodes) { ComposedString assetPath = new ComposedString((entryIt.Attributes["path"].InnerText.Replace('\\', '/')).Trim()); if (statusDatabase.ContainsKey(assetPath)) { statusDatabase[assetPath].changelist = changelist; if (changelist == SVNCommands.localEditChangeList) { statusDatabase[assetPath].allowLocalEdit = true; } if (changelist == SVNCommands.localOnlyChangeList) { statusDatabase[assetPath].localOnly = true; } } } } foreach (var assetPathIt in new List <ComposedString>(statusDatabase.Keys)) { string assetPathStr = assetPathIt.Compose(); if (Directory.Exists(assetPathStr)) { var status = statusDatabase[assetPathIt]; if (status.fileStatus == VCFileStatus.Unversioned) { foreach (var unversionedIt in GetFilesInFolder(assetPathStr)) { var fileStatus = new VersionControlStatus { assetPath = unversionedIt, fileStatus = VCFileStatus.Unversioned, }; statusDatabase[unversionedIt] = fileStatus; } } } } return(statusDatabase); }
private static VersionControlStatus ParseXMLNode(XmlNode entryIt) { var versionControlStatus = new VersionControlStatus(); XmlElement reposStatus = entryIt["repos-status"]; if (reposStatus != null) { if (reposStatus.Attributes["item"] != null && reposStatus.Attributes["item"].InnerText != "normal") versionControlStatus.remoteStatus = VCRemoteFileStatus.Modified; XmlElement lockStatus = reposStatus["lock"]; if (lockStatus != null) { if (lockStatus["owner"] != null) versionControlStatus.owner = lockStatus["owner"].InnerText; versionControlStatus.lockStatus = VCLockStatus.LockedOther; } } XmlElement wcStatus = entryIt["wc-status"]; if (wcStatus != null) { if (wcStatus.Attributes["item"] == null || !SVNToVersionControlStatusMap.fileStatusMap.TryGetValue(wcStatus.Attributes["item"].InnerText, out versionControlStatus.fileStatus)) D.Log("SVN: Unknown file status: " + wcStatus.Attributes["item"].InnerText); if (wcStatus.Attributes["props"] == null || !SVNToVersionControlStatusMap.propertyMap.TryGetValue(wcStatus.Attributes["props"].InnerText, out versionControlStatus.property)) D.Log("SVN: Unknown property: " + wcStatus.Attributes["props"].InnerText); if (wcStatus.Attributes["revision"] != null) versionControlStatus.revision = Int32.Parse(wcStatus.Attributes["revision"].InnerText); if (wcStatus.Attributes["wc-locked"] != null && wcStatus.Attributes["wc-locked"].InnerText == "true") versionControlStatus.repositoryStatus = VCRepositoryStatus.Locked; if (wcStatus.Attributes["tree-conflicted"] != null) versionControlStatus.treeConflictStatus = (wcStatus.Attributes["tree-conflicted"].InnerText == "true") ? VCTreeConflictStatus.TreeConflict : VCTreeConflictStatus.Normal; XmlElement commit = wcStatus["commit"]; if (commit != null) { if (commit.Attributes["revision"] != null) versionControlStatus.lastModifiedRevision = Int32.Parse(commit.Attributes["revision"].InnerText); if (commit["author"] != null) versionControlStatus.user = commit["author"].InnerText; } XmlElement lockStatus = wcStatus["lock"]; if (lockStatus != null) { if (lockStatus["owner"] != null) versionControlStatus.owner = lockStatus["owner"].InnerText; if (lockStatus["token"] != null) versionControlStatus.lockToken = lockStatus["token"].InnerText; versionControlStatus.lockStatus = VCLockStatus.LockedHere; } } return versionControlStatus; }