A game about forced loneliness, made by TACStudios
at master 251 lines 8.3 kB view raw
1using System; 2using System.Threading; 3 4using UnityEditor; 5 6using Codice.Client.Common.EventTracking; 7using Codice.CM.Common; 8using Codice.LogWrapper; 9using PlasticGui; 10using PlasticGui.Help.Conditions; 11using PlasticGui.WebApi.Responses; 12using Unity.PlasticSCM.Editor.AssetUtils; 13using Unity.PlasticSCM.Editor.Configuration; 14using Unity.PlasticSCM.Editor.UI; 15using Unity.PlasticSCM.Editor.Views.CreateWorkspace; 16using Unity.PlasticSCM.Editor.WebApi; 17 18namespace Unity.PlasticSCM.Editor.Hub.Operations 19{ 20 internal class CreateWorkspace 21 { 22 internal static void LaunchOperation(OperationParams parameters) 23 { 24 CreateWorkspace createWorkspaceOperation = new CreateWorkspace(); 25 26 createWorkspaceOperation.CreateWorkspaceOperation(parameters); 27 } 28 29 internal static WorkspaceInfo CreateWorkspaceForRepSpec( 30 RepositorySpec repositorySpec, 31 string wkPath, 32 ILog log) 33 { 34 CreateWorkspaceDialogUserAssistant assistant = 35 CreateWorkspaceDialogUserAssistant.ForWkPathAndName( 36 PlasticGuiConfig.Get().Configuration.DefaultWorkspaceRoot, 37 PlasticGui.Plastic.API.GetAllWorkspacesArray()); 38 39 assistant.RepositoryChanged( 40 repositorySpec.ToString(), 41 string.Empty, 42 string.Empty); 43 44 WorkspaceInfo wkInfo = PlasticGui.Plastic.API.CreateWorkspace( 45 wkPath, 46 assistant.GetProposedWorkspaceName(), 47 repositorySpec.ToString()); 48 49 log.DebugFormat("Created workspace '{0}' on '{1}'", 50 wkInfo.Name, 51 wkInfo.ClientPath); 52 53 return wkInfo; 54 } 55 56 void CreateWorkspaceOperation(OperationParams parameters) 57 { 58 RefreshAsset.BeforeLongAssetOperation(); 59 60 try 61 { 62 ThreadPool.QueueUserWorkItem( 63 CreateWorkspaceIfNeeded, 64 parameters); 65 66 while (mStatus != Status.Finished) 67 { 68 if (mDisplayProgress) 69 { 70 DisplayProgress(mStatus, parameters.Repository); 71 } 72 73 Thread.Sleep(150); 74 } 75 } 76 finally 77 { 78 EditorUtility.ClearProgressBar(); 79 80 RefreshAsset.AfterLongAssetOperation(); 81 82 if (!mOperationFailed) 83 { 84 PlasticPlugin.Enable(); 85 ShowWindow.Plastic(); 86 } 87 } 88 } 89 90 void CreateWorkspaceIfNeeded(object state) 91 { 92 OperationParams parameters = (OperationParams)state; 93 94 try 95 { 96 mDisplayProgress = true; 97 98 mStatus = Status.ConfiguringCredentials; 99 100 TokenExchangeResponse tokenExchangeResponse = 101 AutoConfig.PlasticCredentials( 102 parameters.AccessToken, 103 parameters.RepositorySpec.Server); 104 105 if (tokenExchangeResponse.Error != null) 106 { 107 mOperationFailed = true; 108 109 LogTokenExchangeErrorInConsole(tokenExchangeResponse.Error); 110 return; 111 } 112 113 mStatus = Status.CreatingWorkspace; 114 115 TrackFeatureUseEvent.For( 116 parameters.RepositorySpec, TrackFeatureUseEvent. 117 Features.UnityPackage.CreateWorkspaceFromHub); 118 119 WorkspaceInfo wkInfo = CreateWorkspaceForRepSpec( 120 parameters.RepositorySpec, 121 parameters.WorkspaceFullPath, 122 mLog); 123 124 mStatus = Status.PerformingInitialCheckin; 125 126 PerformInitialCheckinIfRepositoryIsEmpty( 127 wkInfo, parameters.RepositorySpec, 128 PlasticGui.Plastic.API, mLog); 129 } 130 catch (Exception ex) 131 { 132 LogException(ex); 133 LogExceptionErrorInConsole(ex); 134 135 mOperationFailed = true; 136 } 137 finally 138 { 139 mStatus = Status.Finished; 140 } 141 } 142 143 static void PerformInitialCheckinIfRepositoryIsEmpty( 144 WorkspaceInfo wkInfo, 145 RepositorySpec repositorySpec, 146 IPlasticAPI plasticApi, 147 ILog log) 148 { 149 try 150 { 151 bool isEmptyRepository = IsEmptyRepositoryCondition. 152 Evaluate(wkInfo, repositorySpec, plasticApi); 153 154 if (!isEmptyRepository) 155 return; 156 157 PerformInitialCheckin.PerformCheckinPackagesAndProjectSettingsFolders( 158 wkInfo, false, plasticApi); 159 160 log.DebugFormat("Created initial checkin on repository '{0}'", 161 repositorySpec.ToString()); 162 } 163 catch (Exception ex) 164 { 165 // create the initial checkin if it's possible, otherwise 166 // just log the exception (no error shown for the user) 167 LogException(ex); 168 } 169 } 170 171 static void DisplayProgress( 172 Status status, 173 string repository) 174 { 175 string progressMessage = GetProgressString(status); 176 177 float progressPercent = (int)status / (float)Status.Finished; 178 179 EditorUtility.DisplayProgressBar( 180 string.Format("{0} {1}", 181 PlasticLocalization.Name.CreatingWorkspaceProgress.GetString(), 182 repository), 183 progressMessage, progressPercent); 184 } 185 186 static void LogTokenExchangeErrorInConsole(ErrorResponse.ErrorFields error) 187 { 188 UnityEngine.Debug.LogErrorFormat( 189 PlasticLocalization.Name.ErrorCreatingWorkspaceForProject.GetString(), 190 string.Format("Unable to get TokenExchangeResponse: {0} [code {1}]", 191 error.Message, error.ErrorCode)); 192 } 193 194 static void LogExceptionErrorInConsole(Exception ex) 195 { 196 UnityEngine.Debug.LogErrorFormat( 197 PlasticLocalization.Name.ErrorCreatingWorkspaceForProject.GetString(), 198 ex.Message); 199 } 200 201 static void LogException(Exception ex) 202 { 203 mLog.WarnFormat("Message: {0}", ex.Message); 204 205 mLog.DebugFormat("StackTrace:{0}{1}", Environment.NewLine, ex.StackTrace); 206 } 207 208 static string GetProgressString(Status status) 209 { 210 switch (status) 211 { 212 case Status.Starting: 213 return PlasticLocalization.GetString( 214 PlasticLocalization.Name.CreateWorkspaceProgressStarting); 215 case Status.ConfiguringCredentials: 216 return PlasticLocalization.GetString( 217 PlasticLocalization.Name.CreateWorkspaceProgressConfiguringCredentials); 218 case Status.CreatingWorkspace: 219 return PlasticLocalization.GetString( 220 PlasticLocalization.Name.CreateWorkspaceProgressCreatingWorkspace); 221 case Status.PerformingInitialCheckin: 222 return PlasticLocalization.GetString( 223 PlasticLocalization.Name.CreateWorkspaceProgressPerformingInitialCheckin); 224 case Status.Finished: 225 return PlasticLocalization.GetString( 226 PlasticLocalization.Name.CreateWorkspaceProgressFinished); 227 } 228 229 return string.Empty; 230 } 231 232 CreateWorkspace() 233 { 234 } 235 236 enum Status : int 237 { 238 Starting = 1, 239 ConfiguringCredentials = 2, 240 CreatingWorkspace = 3, 241 PerformingInitialCheckin = 4, 242 Finished = 5 243 }; 244 245 volatile Status mStatus = Status.Starting; 246 volatile bool mOperationFailed = false; 247 volatile bool mDisplayProgress; 248 249 static readonly ILog mLog = PlasticApp.GetLogger("CreateWorkspace"); 250 } 251}