No Description
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

DownloadRepositoryOperation.cs 7.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  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. RefreshAsset.BeforeLongAssetOperation();
  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. RefreshAsset.AfterLongAssetOperation();
  56. if (!mOperationFailed)
  57. {
  58. PlasticPlugin.Enable();
  59. ShowWindow.PlasticAfterDownloadingProject();
  60. }
  61. }
  62. }
  63. void DownloadRepository(object state)
  64. {
  65. DownloadRepositoryParameters parameters = (DownloadRepositoryParameters)state;
  66. try
  67. {
  68. if (FindWorkspace.HasWorkspace(parameters.ProjectPath))
  69. {
  70. // each domain reload, the package is reloaded.
  71. // way need to check if we already downloaded it
  72. return;
  73. }
  74. mDisplayProgress = true;
  75. IPlasticWebRestApi restApi = new PlasticWebRestApi();
  76. string defaultCloudAlias = restApi.GetDefaultCloudAlias();
  77. RepositorySpec repSpec = BuildRepSpec(
  78. parameters.CloudRepository,
  79. parameters.CloudOrganization,
  80. defaultCloudAlias);
  81. TokenExchangeResponse tokenExchangeResponse =
  82. AutoConfig.PlasticCredentials(
  83. parameters.AccessToken,
  84. repSpec.Server,
  85. parameters.ProjectPath);
  86. if (tokenExchangeResponse.Error != null)
  87. {
  88. mOperationFailed = true;
  89. UnityEngine.Debug.LogErrorFormat(
  90. PlasticLocalization.GetString(PlasticLocalization.Name.ErrorDownloadingCloudProject),
  91. string.Format("Unable to get TokenExchangeResponse: {0} [code {1}]",
  92. tokenExchangeResponse.Error.Message,
  93. tokenExchangeResponse.Error.ErrorCode));
  94. return;
  95. }
  96. WorkspaceInfo wkInfo = CreateWorkspace(
  97. repSpec, parameters.ProjectPath);
  98. mLog.DebugFormat("Created workspace {0} on {1}",
  99. wkInfo.Name,
  100. wkInfo.ClientPath);
  101. PlasticGui.Plastic.API.Update(
  102. wkInfo.ClientPath,
  103. UpdateFlags.None,
  104. null,
  105. mUpdateNotifier);
  106. }
  107. catch (Exception ex)
  108. {
  109. LogException(ex);
  110. UnityEngine.Debug.LogErrorFormat(
  111. PlasticLocalization.GetString(PlasticLocalization.Name.ErrorDownloadingCloudProject),
  112. ex.Message);
  113. mOperationFailed = true;
  114. }
  115. finally
  116. {
  117. mOperationFinished = true;
  118. }
  119. }
  120. static void DisplayProgress(
  121. UpdateOperationStatus status,
  122. BuildProgressSpeedAndRemainingTime.ProgressData progressData,
  123. string cloudRepository)
  124. {
  125. string totalProgressMessage = UpdateProgressRender.
  126. GetProgressString(status, progressData);
  127. float totalProgressPercent = GetProgressBarPercent.
  128. ForTransfer(status.UpdatedSize, status.TotalSize) / 100f;
  129. EditorUtility.DisplayProgressBar(
  130. string.Format("{0} {1}",
  131. PlasticLocalization.GetString(PlasticLocalization.Name.DownloadingProgress),
  132. cloudRepository),
  133. totalProgressMessage, totalProgressPercent);
  134. }
  135. static WorkspaceInfo CreateWorkspace(
  136. RepositorySpec repositorySpec,
  137. string projectPath)
  138. {
  139. CreateWorkspaceDialogUserAssistant assistant = new CreateWorkspaceDialogUserAssistant(
  140. PlasticGuiConfig.Get().Configuration.DefaultWorkspaceRoot,
  141. PlasticGui.Plastic.API.GetAllWorkspacesArray());
  142. assistant.RepositoryChanged(
  143. repositorySpec.ToString(),
  144. string.Empty,
  145. string.Empty);
  146. return PlasticGui.Plastic.API.CreateWorkspace(
  147. projectPath,
  148. assistant.GetProposedWorkspaceName(),
  149. repositorySpec.ToString());
  150. }
  151. static RepositorySpec BuildRepSpec(
  152. string cloudRepository,
  153. string cloudOrganization,
  154. string defaultCloudAlias)
  155. {
  156. return new RepositorySpec()
  157. {
  158. Name = cloudRepository,
  159. Server = CloudServer.BuildFullyQualifiedName(
  160. cloudOrganization, defaultCloudAlias)
  161. };
  162. }
  163. static void LogException(Exception ex)
  164. {
  165. mLog.WarnFormat("Message: {0}", ex.Message);
  166. mLog.DebugFormat(
  167. "StackTrace:{0}{1}",
  168. Environment.NewLine, ex.StackTrace);
  169. }
  170. class DownloadRepositoryParameters
  171. {
  172. internal string CloudRepository;
  173. internal string CloudOrganization;
  174. internal string ProjectPath;
  175. internal string AccessToken;
  176. }
  177. volatile bool mOperationFinished = false;
  178. volatile bool mOperationFailed = false;
  179. volatile bool mDisplayProgress;
  180. UpdateNotifier mUpdateNotifier = new UpdateNotifier();
  181. static readonly ILog mLog = LogManager.GetLogger("DownloadRepositoryOperation");
  182. }
  183. }