A game about forced loneliness, made by TACStudios
1using System;
2using System.Threading;
3
4using UnityEditor;
5
6using Codice.Client.Common.EventTracking;
7using Codice.CM.Common;
8using Codice.LogWrapper;
9using PlasticGui;
10using PlasticGui.Help.Conditions;
11using PlasticGui.WebApi.Responses;
12using Unity.PlasticSCM.Editor.AssetUtils;
13using Unity.PlasticSCM.Editor.Configuration;
14using Unity.PlasticSCM.Editor.UI;
15using Unity.PlasticSCM.Editor.Views.CreateWorkspace;
16using Unity.PlasticSCM.Editor.WebApi;
17
18namespace Unity.PlasticSCM.Editor.Hub.Operations
19{
20 internal class CreateWorkspace
21 {
22 internal static void LaunchOperation(OperationParams parameters)
23 {
24 CreateWorkspace createWorkspaceOperation = new CreateWorkspace();
25
26 createWorkspaceOperation.CreateWorkspaceOperation(parameters);
27 }
28
29 internal static WorkspaceInfo CreateWorkspaceForRepSpec(
30 RepositorySpec repositorySpec,
31 string wkPath,
32 ILog log)
33 {
34 CreateWorkspaceDialogUserAssistant assistant =
35 CreateWorkspaceDialogUserAssistant.ForWkPathAndName(
36 PlasticGuiConfig.Get().Configuration.DefaultWorkspaceRoot,
37 PlasticGui.Plastic.API.GetAllWorkspacesArray());
38
39 assistant.RepositoryChanged(
40 repositorySpec.ToString(),
41 string.Empty,
42 string.Empty);
43
44 WorkspaceInfo wkInfo = PlasticGui.Plastic.API.CreateWorkspace(
45 wkPath,
46 assistant.GetProposedWorkspaceName(),
47 repositorySpec.ToString());
48
49 log.DebugFormat("Created workspace '{0}' on '{1}'",
50 wkInfo.Name,
51 wkInfo.ClientPath);
52
53 return wkInfo;
54 }
55
56 void CreateWorkspaceOperation(OperationParams parameters)
57 {
58 RefreshAsset.BeforeLongAssetOperation();
59
60 try
61 {
62 ThreadPool.QueueUserWorkItem(
63 CreateWorkspaceIfNeeded,
64 parameters);
65
66 while (mStatus != Status.Finished)
67 {
68 if (mDisplayProgress)
69 {
70 DisplayProgress(mStatus, parameters.Repository);
71 }
72
73 Thread.Sleep(150);
74 }
75 }
76 finally
77 {
78 EditorUtility.ClearProgressBar();
79
80 RefreshAsset.AfterLongAssetOperation();
81
82 if (!mOperationFailed)
83 {
84 PlasticPlugin.Enable();
85 ShowWindow.Plastic();
86 }
87 }
88 }
89
90 void CreateWorkspaceIfNeeded(object state)
91 {
92 OperationParams parameters = (OperationParams)state;
93
94 try
95 {
96 mDisplayProgress = true;
97
98 mStatus = Status.ConfiguringCredentials;
99
100 TokenExchangeResponse tokenExchangeResponse =
101 AutoConfig.PlasticCredentials(
102 parameters.AccessToken,
103 parameters.RepositorySpec.Server);
104
105 if (tokenExchangeResponse.Error != null)
106 {
107 mOperationFailed = true;
108
109 LogTokenExchangeErrorInConsole(tokenExchangeResponse.Error);
110 return;
111 }
112
113 mStatus = Status.CreatingWorkspace;
114
115 TrackFeatureUseEvent.For(
116 parameters.RepositorySpec, TrackFeatureUseEvent.
117 Features.UnityPackage.CreateWorkspaceFromHub);
118
119 WorkspaceInfo wkInfo = CreateWorkspaceForRepSpec(
120 parameters.RepositorySpec,
121 parameters.WorkspaceFullPath,
122 mLog);
123
124 mStatus = Status.PerformingInitialCheckin;
125
126 PerformInitialCheckinIfRepositoryIsEmpty(
127 wkInfo, parameters.RepositorySpec,
128 PlasticGui.Plastic.API, mLog);
129 }
130 catch (Exception ex)
131 {
132 LogException(ex);
133 LogExceptionErrorInConsole(ex);
134
135 mOperationFailed = true;
136 }
137 finally
138 {
139 mStatus = Status.Finished;
140 }
141 }
142
143 static void PerformInitialCheckinIfRepositoryIsEmpty(
144 WorkspaceInfo wkInfo,
145 RepositorySpec repositorySpec,
146 IPlasticAPI plasticApi,
147 ILog log)
148 {
149 try
150 {
151 bool isEmptyRepository = IsEmptyRepositoryCondition.
152 Evaluate(wkInfo, repositorySpec, plasticApi);
153
154 if (!isEmptyRepository)
155 return;
156
157 PerformInitialCheckin.PerformCheckinPackagesAndProjectSettingsFolders(
158 wkInfo, false, plasticApi);
159
160 log.DebugFormat("Created initial checkin on repository '{0}'",
161 repositorySpec.ToString());
162 }
163 catch (Exception ex)
164 {
165 // create the initial checkin if it's possible, otherwise
166 // just log the exception (no error shown for the user)
167 LogException(ex);
168 }
169 }
170
171 static void DisplayProgress(
172 Status status,
173 string repository)
174 {
175 string progressMessage = GetProgressString(status);
176
177 float progressPercent = (int)status / (float)Status.Finished;
178
179 EditorUtility.DisplayProgressBar(
180 string.Format("{0} {1}",
181 PlasticLocalization.Name.CreatingWorkspaceProgress.GetString(),
182 repository),
183 progressMessage, progressPercent);
184 }
185
186 static void LogTokenExchangeErrorInConsole(ErrorResponse.ErrorFields error)
187 {
188 UnityEngine.Debug.LogErrorFormat(
189 PlasticLocalization.Name.ErrorCreatingWorkspaceForProject.GetString(),
190 string.Format("Unable to get TokenExchangeResponse: {0} [code {1}]",
191 error.Message, error.ErrorCode));
192 }
193
194 static void LogExceptionErrorInConsole(Exception ex)
195 {
196 UnityEngine.Debug.LogErrorFormat(
197 PlasticLocalization.Name.ErrorCreatingWorkspaceForProject.GetString(),
198 ex.Message);
199 }
200
201 static void LogException(Exception ex)
202 {
203 mLog.WarnFormat("Message: {0}", ex.Message);
204
205 mLog.DebugFormat("StackTrace:{0}{1}", Environment.NewLine, ex.StackTrace);
206 }
207
208 static string GetProgressString(Status status)
209 {
210 switch (status)
211 {
212 case Status.Starting:
213 return PlasticLocalization.GetString(
214 PlasticLocalization.Name.CreateWorkspaceProgressStarting);
215 case Status.ConfiguringCredentials:
216 return PlasticLocalization.GetString(
217 PlasticLocalization.Name.CreateWorkspaceProgressConfiguringCredentials);
218 case Status.CreatingWorkspace:
219 return PlasticLocalization.GetString(
220 PlasticLocalization.Name.CreateWorkspaceProgressCreatingWorkspace);
221 case Status.PerformingInitialCheckin:
222 return PlasticLocalization.GetString(
223 PlasticLocalization.Name.CreateWorkspaceProgressPerformingInitialCheckin);
224 case Status.Finished:
225 return PlasticLocalization.GetString(
226 PlasticLocalization.Name.CreateWorkspaceProgressFinished);
227 }
228
229 return string.Empty;
230 }
231
232 CreateWorkspace()
233 {
234 }
235
236 enum Status : int
237 {
238 Starting = 1,
239 ConfiguringCredentials = 2,
240 CreatingWorkspace = 3,
241 PerformingInitialCheckin = 4,
242 Finished = 5
243 };
244
245 volatile Status mStatus = Status.Starting;
246 volatile bool mOperationFailed = false;
247 volatile bool mDisplayProgress;
248
249 static readonly ILog mLog = PlasticApp.GetLogger("CreateWorkspace");
250 }
251}