A game about forced loneliness, made by TACStudios
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}