DownloadRepositoryOperation.cs 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. using System;
  2. using System.Threading;
  3. using UnityEditor;
  4. using Codice.Client.BaseCommands;
  5. using Codice.Client.Commands;
  6. using Codice.CM.Common;
  7. using Codice.LogWrapper;
  8. using PlasticGui;
  9. using PlasticGui.WebApi;
  10. using PlasticGui.WorkspaceWindow;
  11. using PlasticGui.WorkspaceWindow.Update;
  12. using Unity.PlasticSCM.Editor.AssetUtils;
  13. using Unity.PlasticSCM.Editor.UI;
  14. using Unity.PlasticSCM.Editor.WebApi;
  15. using Unity.PlasticSCM.Editor.Configuration;
  16. namespace Unity.PlasticSCM.Editor.ProjectDownloader
  17. {
  18. internal class DownloadRepositoryOperation
  19. {
  20. internal void DownloadRepositoryToPathIfNeeded(
  21. string cloudRepository,
  22. string cloudOrganization,
  23. string projectPath,
  24. string unityAccessToken)
  25. {
  26. AssetDatabase.DisallowAutoRefresh();
  27. try
  28. {
  29. BuildProgressSpeedAndRemainingTime.ProgressData progressData =
  30. new BuildProgressSpeedAndRemainingTime.ProgressData(DateTime.Now);
  31. ThreadPool.QueueUserWorkItem(
  32. DownloadRepository,
  33. new DownloadRepositoryParameters()
  34. {
  35. CloudOrganization = cloudOrganization,
  36. CloudRepository = cloudRepository,
  37. ProjectPath = projectPath,
  38. AccessToken = unityAccessToken
  39. });
  40. while (!mOperationFinished)
  41. {
  42. if (mDisplayProgress)
  43. {
  44. DisplayProgress(
  45. mUpdateNotifier.GetUpdateStatus(),
  46. progressData,
  47. cloudRepository);
  48. }
  49. Thread.Sleep(150);
  50. }
  51. }
  52. finally
  53. {
  54. EditorUtility.ClearProgressBar();
  55. AssetDatabase.AllowAutoRefresh();
  56. RefreshAsset.UnityAssetDatabase();
  57. if (!mOperationFailed)
  58. {
  59. PlasticPlugin.Enable();
  60. ShowWindow.PlasticAfterDownloadingProject();
  61. }
  62. }
  63. }
  64. void DownloadRepository(object state)
  65. {
  66. DownloadRepositoryParameters parameters = (DownloadRepositoryParameters)state;
  67. try
  68. {
  69. if (FindWorkspace.HasWorkspace(parameters.ProjectPath))
  70. {
  71. // each domain reload, the package is reloaded.
  72. // way need to check if we already downloaded it
  73. return;
  74. }
  75. mDisplayProgress = true;
  76. IPlasticWebRestApi restApi = new PlasticWebRestApi();
  77. string defaultCloudAlias = restApi.GetDefaultCloudAlias();
  78. RepositorySpec repSpec = BuildRepSpec(
  79. parameters.CloudRepository,
  80. parameters.CloudOrganization,
  81. defaultCloudAlias);
  82. TokenExchangeResponse tokenExchangeResponse =
  83. AutoConfig.PlasticCredentials(
  84. parameters.AccessToken,
  85. repSpec.Server,
  86. parameters.ProjectPath);
  87. if (tokenExchangeResponse.Error != null)
  88. {
  89. mOperationFailed = true;
  90. UnityEngine.Debug.LogErrorFormat(
  91. PlasticLocalization.GetString(PlasticLocalization.Name.ErrorDownloadingCloudProject),
  92. string.Format("Unable to get TokenExchangeResponse: {0} [code {1}]",
  93. tokenExchangeResponse.Error.Message,
  94. tokenExchangeResponse.Error.ErrorCode));
  95. return;
  96. }
  97. WorkspaceInfo wkInfo = CreateWorkspace(
  98. repSpec, parameters.ProjectPath);
  99. mLog.DebugFormat("Created workspace {0} on {1}",
  100. wkInfo.Name,
  101. wkInfo.ClientPath);
  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. UnityEngine.Debug.LogErrorFormat(
  112. PlasticLocalization.GetString(PlasticLocalization.Name.ErrorDownloadingCloudProject),
  113. ex.Message);
  114. mOperationFailed = true;
  115. }
  116. finally
  117. {
  118. mOperationFinished = true;
  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. float totalProgressPercent = GetProgressBarPercent.
  129. ForTransfer(status.UpdatedSize, status.TotalSize) / 100f;
  130. EditorUtility.DisplayProgressBar(
  131. string.Format("{0} {1}",
  132. PlasticLocalization.GetString(PlasticLocalization.Name.DownloadingProgress),
  133. cloudRepository),
  134. totalProgressMessage, totalProgressPercent);
  135. }
  136. static WorkspaceInfo CreateWorkspace(
  137. RepositorySpec repositorySpec,
  138. string projectPath)
  139. {
  140. CreateWorkspaceDialogUserAssistant assistant = new CreateWorkspaceDialogUserAssistant(
  141. PlasticGuiConfig.Get().Configuration.DefaultWorkspaceRoot,
  142. PlasticGui.Plastic.API.GetAllWorkspacesArray());
  143. assistant.RepositoryChanged(
  144. repositorySpec.ToString(),
  145. string.Empty,
  146. string.Empty);
  147. return PlasticGui.Plastic.API.CreateWorkspace(
  148. projectPath,
  149. assistant.GetProposedWorkspaceName(),
  150. repositorySpec.ToString());
  151. }
  152. static RepositorySpec BuildRepSpec(
  153. string cloudRepository,
  154. string cloudOrganization,
  155. string defaultCloudAlias)
  156. {
  157. return new RepositorySpec()
  158. {
  159. Name = cloudRepository,
  160. Server = CloudServer.BuildFullyQualifiedName(
  161. cloudOrganization, defaultCloudAlias)
  162. };
  163. }
  164. static void LogException(Exception ex)
  165. {
  166. mLog.WarnFormat("Message: {0}", ex.Message);
  167. mLog.DebugFormat(
  168. "StackTrace:{0}{1}",
  169. Environment.NewLine, ex.StackTrace);
  170. }
  171. class DownloadRepositoryParameters
  172. {
  173. internal string CloudRepository;
  174. internal string CloudOrganization;
  175. internal string ProjectPath;
  176. internal string AccessToken;
  177. }
  178. volatile bool mOperationFinished = false;
  179. volatile bool mOperationFailed = false;
  180. volatile bool mDisplayProgress;
  181. UpdateNotifier mUpdateNotifier = new UpdateNotifier();
  182. static readonly ILog mLog = LogManager.GetLogger("DownloadRepositoryOperation");
  183. }
  184. }