A game about forced loneliness, made by TACStudios
at master 175 lines 5.6 kB view raw
1using System; 2using System.Threading; 3 4using UnityEditor; 5 6using Codice.Client.BaseCommands; 7using Codice.Client.Commands; 8using Codice.Client.Common.EventTracking; 9using Codice.CM.Common; 10using Codice.LogWrapper; 11using PlasticGui; 12using PlasticGui.WebApi.Responses; 13using PlasticGui.WorkspaceWindow; 14using PlasticGui.WorkspaceWindow.Update; 15using Unity.PlasticSCM.Editor.AssetUtils; 16using Unity.PlasticSCM.Editor.UI; 17using Unity.PlasticSCM.Editor.WebApi; 18using Unity.PlasticSCM.Editor.Configuration; 19 20namespace Unity.PlasticSCM.Editor.Hub.Operations 21{ 22 internal class DownloadRepository 23 { 24 internal static void LaunchOperation(OperationParams parameters) 25 { 26 DownloadRepository downloadOperation = new DownloadRepository(); 27 28 downloadOperation.DownloadRepositoryOperation(parameters); 29 } 30 31 void DownloadRepositoryOperation(OperationParams parameters) 32 { 33 RefreshAsset.BeforeLongAssetOperation(); 34 35 try 36 { 37 BuildProgressSpeedAndRemainingTime.ProgressData progressData = 38 new BuildProgressSpeedAndRemainingTime.ProgressData(DateTime.Now); 39 40 ThreadPool.QueueUserWorkItem( 41 DownloadRepositoryToPathIfNeeded, 42 parameters); 43 44 while (!mOperationFinished) 45 { 46 if (mDisplayProgress) 47 { 48 DisplayProgress( 49 mUpdateNotifier.GetUpdateStatus(), 50 progressData, 51 parameters.Repository); 52 } 53 54 Thread.Sleep(150); 55 } 56 } 57 finally 58 { 59 EditorUtility.ClearProgressBar(); 60 61 RefreshAsset.AfterLongAssetOperation(); 62 63 if (!mOperationFailed) 64 { 65 PlasticPlugin.Enable(); 66 ShowWindow.Plastic(); 67 } 68 } 69 } 70 71 void DownloadRepositoryToPathIfNeeded(object state) 72 { 73 OperationParams parameters = (OperationParams)state; 74 75 try 76 { 77 mDisplayProgress = true; 78 79 TokenExchangeResponse tokenExchangeResponse = 80 AutoConfig.PlasticCredentials( 81 parameters.AccessToken, 82 parameters.RepositorySpec.Server); 83 84 if (tokenExchangeResponse.Error != null) 85 { 86 mOperationFailed = true; 87 88 LogTokenExchangeErrorInConsole(tokenExchangeResponse.Error); 89 return; 90 } 91 92 TrackFeatureUseEvent.For( 93 parameters.RepositorySpec, TrackFeatureUseEvent. 94 Features.UnityPackage.DownloadRepositoryFromHub); 95 96 WorkspaceInfo wkInfo = CreateWorkspace. 97 CreateWorkspaceForRepSpec( 98 parameters.RepositorySpec, 99 parameters.WorkspaceFullPath, 100 mLog); 101 102 PlasticGui.Plastic.API.Update( 103 wkInfo.ClientPath, 104 UpdateFlags.None, 105 null, 106 mUpdateNotifier); 107 } 108 catch (Exception ex) 109 { 110 LogException(ex); 111 LogExceptionErrorInConsole(ex); 112 113 mOperationFailed = true; 114 } 115 finally 116 { 117 mOperationFinished = true; 118 } 119 } 120 121 static void DisplayProgress( 122 UpdateOperationStatus status, 123 BuildProgressSpeedAndRemainingTime.ProgressData progressData, 124 string cloudRepository) 125 { 126 string totalProgressMessage = UpdateProgressRender. 127 GetProgressString(status, progressData); 128 129 float totalProgressPercent = GetProgressBarPercent. 130 ForTransfer(status.UpdatedSize, status.TotalSize) / 100f; 131 132 EditorUtility.DisplayProgressBar( 133 string.Format("{0} {1}", 134 PlasticLocalization.Name.DownloadingProgress.GetString(), 135 cloudRepository), 136 totalProgressMessage, totalProgressPercent); 137 } 138 139 static void LogTokenExchangeErrorInConsole(ErrorResponse.ErrorFields error) 140 { 141 UnityEngine.Debug.LogErrorFormat( 142 PlasticLocalization.Name.ErrorDownloadingProjectFromRepository.GetString(), 143 string.Format("Unable to get TokenExchangeResponse: {0} [code {1}]", 144 error.Message, error.ErrorCode)); 145 } 146 147 static void LogExceptionErrorInConsole(Exception ex) 148 { 149 UnityEngine.Debug.LogErrorFormat( 150 PlasticLocalization.Name.ErrorDownloadingProjectFromRepository.GetString(), 151 ex.Message); 152 } 153 154 static void LogException(Exception ex) 155 { 156 mLog.WarnFormat("Message: {0}", ex.Message); 157 158 mLog.DebugFormat( 159 "StackTrace:{0}{1}", 160 Environment.NewLine, ex.StackTrace); 161 } 162 163 DownloadRepository() 164 { 165 } 166 167 volatile bool mOperationFinished = false; 168 volatile bool mOperationFailed = false; 169 volatile bool mDisplayProgress; 170 171 UpdateNotifier mUpdateNotifier = new UpdateNotifier(); 172 173 static readonly ILog mLog = PlasticApp.GetLogger("DownloadRepository"); 174 } 175}