DownloadRepositoryOperation.cs 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. using System;
  2. using System.IO;
  3. using System.Threading;
  4. using UnityEditor;
  5. using UnityEngine;
  6. using Codice.Client.BaseCommands;
  7. using Codice.Client.Commands;
  8. using Codice.Client.Common;
  9. using Codice.CM.Common;
  10. using Codice.LogWrapper;
  11. using Codice.Utils;
  12. using PlasticGui;
  13. using PlasticGui.WebApi;
  14. using PlasticGui.WorkspaceWindow;
  15. using PlasticGui.WorkspaceWindow.Update;
  16. using Unity.PlasticSCM.Editor.AssetUtils;
  17. using Unity.PlasticSCM.Editor.Tool;
  18. using Unity.PlasticSCM.Editor.UI;
  19. using Unity.PlasticSCM.Editor.Configuration.CloudEdition.Welcome;
  20. namespace Unity.PlasticSCM.Editor.ProjectDownloader
  21. {
  22. internal class DownloadRepositoryOperation
  23. {
  24. internal void DownloadRepositoryToPathIfNeeded(
  25. string cloudRepository,
  26. string cloudOrganization,
  27. string projectPath,
  28. string unityAccessToken)
  29. {
  30. AssetDatabase.DisallowAutoRefresh();
  31. try
  32. {
  33. BuildProgressSpeedAndRemainingTime.ProgressData progressData =
  34. new BuildProgressSpeedAndRemainingTime.ProgressData(DateTime.Now);
  35. ThreadPool.QueueUserWorkItem(
  36. DownloadRepository,
  37. new DownloadRepositoryParameters()
  38. {
  39. CloudOrganization = cloudOrganization,
  40. CloudRepository = cloudRepository,
  41. ProjectPath = projectPath,
  42. AccessToken = unityAccessToken
  43. });
  44. while (!mOperationFinished)
  45. {
  46. if (mDisplayProgress)
  47. {
  48. DisplayProgress(
  49. mUpdateNotifier.GetUpdateStatus(),
  50. progressData,
  51. cloudRepository);
  52. }
  53. Thread.Sleep(150);
  54. }
  55. }
  56. finally
  57. {
  58. EditorUtility.ClearProgressBar();
  59. AssetDatabase.AllowAutoRefresh();
  60. RefreshAsset.UnityAssetDatabase();
  61. if (!mOperationFailed)
  62. {
  63. ShowWindow.PlasticAfterDownloadingProject();
  64. }
  65. }
  66. }
  67. void DownloadRepository(object state)
  68. {
  69. DownloadRepositoryParameters parameters = (DownloadRepositoryParameters)state;
  70. try
  71. {
  72. IPlasticWebRestApi restApi = new PlasticWebRestApi();
  73. string defaultCloudAlias = restApi.GetDefaultCloudAlias();
  74. RepositorySpec repSpec = BuildRepSpec(
  75. parameters.CloudRepository,
  76. parameters.CloudOrganization,
  77. defaultCloudAlias);
  78. // we just download a cloud project,
  79. // so let's assume we're going to use Cloud Edition
  80. SetupUnityEditionToken.CreateCloudEditionTokenIfNeeded();
  81. if (!ClientConfig.IsConfigured())
  82. {
  83. AutoConfigClientConf.FromUnityAccessToken(
  84. parameters.AccessToken,
  85. repSpec,
  86. parameters.ProjectPath);
  87. }
  88. if (WorkspaceExists(parameters.ProjectPath))
  89. {
  90. // each domain reload, the package is reloaded.
  91. // way need to check if we already downloaded it
  92. return;
  93. }
  94. mDisplayProgress = true;
  95. WorkspaceInfo wkInfo = CreateWorkspace(
  96. repSpec, parameters.ProjectPath);
  97. mLog.DebugFormat("Created workspace {0} on {1}",
  98. wkInfo.Name,
  99. wkInfo.ClientPath);
  100. AutoLogin autoLogin = new AutoLogin();
  101. autoLogin.ExchangeTokens(parameters.AccessToken);
  102. CloudEditionWelcomeWindow.JoinOrganization(parameters.CloudOrganization, AutoLogin.sAccessToken, AutoLogin.sUserName);
  103. ClientConfigData clientConfigData = ClientConfig.Get().GetClientConfigData();
  104. clientConfigData.WorkspaceServer = parameters.CloudOrganization;
  105. ClientConfig.Get().Save(clientConfigData);
  106. PlasticGui.Plastic.API.Update(
  107. wkInfo.ClientPath,
  108. UpdateFlags.None,
  109. null,
  110. mUpdateNotifier);
  111. }
  112. catch (Exception ex)
  113. {
  114. LogException(ex);
  115. UnityEngine.Debug.LogErrorFormat(
  116. PlasticLocalization.GetString(PlasticLocalization.Name.ErrorDownloadingCloudProject),
  117. ex.Message);
  118. mOperationFailed = true;
  119. }
  120. finally
  121. {
  122. mOperationFinished = true;
  123. }
  124. }
  125. static void DisplayProgress(
  126. UpdateOperationStatus status,
  127. BuildProgressSpeedAndRemainingTime.ProgressData progressData,
  128. string cloudRepository)
  129. {
  130. string totalProgressMessage = UpdateProgressRender.
  131. GetProgressString(status, progressData);
  132. float totalProgressPercent = GetProgressBarPercent.
  133. ForTransfer(status.UpdatedSize, status.TotalSize) / 100f;
  134. EditorUtility.DisplayProgressBar(
  135. string.Format("{0} {1}",
  136. PlasticLocalization.GetString(PlasticLocalization.Name.DownloadingProgress),
  137. cloudRepository),
  138. totalProgressMessage, totalProgressPercent);
  139. }
  140. static WorkspaceInfo CreateWorkspace(
  141. RepositorySpec repositorySpec,
  142. string projectPath)
  143. {
  144. CreateWorkspaceDialogUserAssistant assistant = new CreateWorkspaceDialogUserAssistant(
  145. PlasticGuiConfig.Get().Configuration.DefaultWorkspaceRoot,
  146. PlasticGui.Plastic.API.GetAllWorkspacesArray());
  147. assistant.RepositoryChanged(
  148. repositorySpec.ToString(),
  149. string.Empty,
  150. string.Empty);
  151. return PlasticGui.Plastic.API.CreateWorkspace(
  152. projectPath,
  153. assistant.GetProposedWorkspaceName(),
  154. repositorySpec.ToString());
  155. }
  156. static RepositorySpec BuildRepSpec(
  157. string cloudRepository,
  158. string cloudOrganization,
  159. string defaultCloudAlias)
  160. {
  161. return new RepositorySpec()
  162. {
  163. Name = cloudRepository,
  164. Server = CloudServer.BuildFullyQualifiedName(
  165. cloudOrganization, defaultCloudAlias)
  166. };
  167. }
  168. static void LogException(Exception ex)
  169. {
  170. mLog.WarnFormat("Message: {0}", ex.Message);
  171. mLog.DebugFormat(
  172. "StackTrace:{0}{1}",
  173. Environment.NewLine, ex.StackTrace);
  174. }
  175. static bool WorkspaceExists(string projectPath)
  176. {
  177. return PlasticGui.Plastic.API.GetWorkspaceFromPath(projectPath) != null;
  178. }
  179. class DownloadRepositoryParameters
  180. {
  181. internal string CloudRepository;
  182. internal string CloudOrganization;
  183. internal string ProjectPath;
  184. internal string AccessToken;
  185. }
  186. volatile bool mOperationFinished = false;
  187. volatile bool mOperationFailed = false;
  188. volatile bool mDisplayProgress;
  189. UpdateNotifier mUpdateNotifier = new UpdateNotifier();
  190. static readonly ILog mLog = LogManager.GetLogger("DownloadRepositoryOperation");
  191. }
  192. }