418 lines
13 KiB
C#
418 lines
13 KiB
C#
|
using System;
|
|||
|
|
|||
|
using UnityEditor;
|
|||
|
using UnityEngine;
|
|||
|
|
|||
|
using Codice.Client.BaseCommands;
|
|||
|
using Codice.Client.BaseCommands.EventTracking;
|
|||
|
using Codice.Client.BaseCommands.Sync;
|
|||
|
using Codice.Client.Common.Threading;
|
|||
|
using Codice.CM.Common;
|
|||
|
using Codice.LogWrapper;
|
|||
|
using CodiceApp.EventTracking;
|
|||
|
using PlasticGui;
|
|||
|
using PlasticGui.WorkspaceWindow;
|
|||
|
using Unity.PlasticSCM.Editor.UI;
|
|||
|
using Unity.PlasticSCM.Editor.UI.Progress;
|
|||
|
using Unity.PlasticSCM.Editor.WebApi;
|
|||
|
using Unity.PlasticSCM.Editor.Configuration;
|
|||
|
|
|||
|
namespace Unity.PlasticSCM.Editor.CollabMigration
|
|||
|
{
|
|||
|
internal class MigrationDialog : PlasticDialog
|
|||
|
{
|
|||
|
protected override Rect DefaultRect
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
var baseRect = base.DefaultRect;
|
|||
|
return new Rect(baseRect.x, baseRect.y, 710, 260);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
protected override string GetTitle()
|
|||
|
{
|
|||
|
return "Upgrade your Collaborate project to Plastic SCM";
|
|||
|
}
|
|||
|
|
|||
|
//TODO: localize the strings
|
|||
|
protected override void OnModalGUI()
|
|||
|
{
|
|||
|
GUILayout.BeginHorizontal();
|
|||
|
|
|||
|
DoIconArea();
|
|||
|
|
|||
|
GUILayout.Space(20);
|
|||
|
|
|||
|
DoContentArea();
|
|||
|
|
|||
|
GUILayout.EndHorizontal();
|
|||
|
|
|||
|
DoButtonsArea();
|
|||
|
|
|||
|
mProgressControls.UpdateDeterminateProgress(this);
|
|||
|
}
|
|||
|
|
|||
|
internal static bool Show(
|
|||
|
EditorWindow parentWindow,
|
|||
|
string unityAccessToken,
|
|||
|
string projectPath,
|
|||
|
string user,
|
|||
|
string organizationName,
|
|||
|
RepId repId,
|
|||
|
long changesetId,
|
|||
|
long branchId,
|
|||
|
Action afterWorkspaceMigratedAction)
|
|||
|
{
|
|||
|
MigrationDialog dialog = Create(
|
|||
|
unityAccessToken,
|
|||
|
projectPath,
|
|||
|
user,
|
|||
|
organizationName,
|
|||
|
repId,
|
|||
|
changesetId,
|
|||
|
branchId,
|
|||
|
afterWorkspaceMigratedAction,
|
|||
|
new ProgressControlsForMigration());
|
|||
|
|
|||
|
return dialog.RunModal(parentWindow) == ResponseType.Ok;
|
|||
|
}
|
|||
|
|
|||
|
void DoIconArea()
|
|||
|
{
|
|||
|
GUILayout.BeginVertical();
|
|||
|
|
|||
|
GUILayout.Space(30);
|
|||
|
|
|||
|
Rect iconRect = GUILayoutUtility.GetRect(
|
|||
|
GUIContent.none, EditorStyles.label,
|
|||
|
GUILayout.Width(60), GUILayout.Height(60));
|
|||
|
|
|||
|
GUI.DrawTexture(
|
|||
|
iconRect,
|
|||
|
Images.GetPlasticIcon(),
|
|||
|
ScaleMode.ScaleToFit);
|
|||
|
|
|||
|
GUILayout.EndVertical();
|
|||
|
}
|
|||
|
|
|||
|
void DoContentArea()
|
|||
|
{
|
|||
|
GUILayout.BeginVertical();
|
|||
|
|
|||
|
Title("Upgrade your Collaborate project to Plastic SCM");
|
|||
|
|
|||
|
GUILayout.Space(20);
|
|||
|
|
|||
|
Paragraph("Your Unity project has been upgraded (from Collaborate) to Plastic SCM free" +
|
|||
|
" of charge by your administrator. Your local workspace will now be converted to a" +
|
|||
|
" Plastic SCM workspace in just a few minutes. Select “Migrate” to start the conversion process.");
|
|||
|
|
|||
|
DrawProgressForMigration.For(
|
|||
|
mProgressControls.ProgressData);
|
|||
|
|
|||
|
GUILayout.Space(40);
|
|||
|
|
|||
|
GUILayout.EndVertical();
|
|||
|
}
|
|||
|
|
|||
|
//TODO: localize the strings
|
|||
|
void DoButtonsArea()
|
|||
|
{
|
|||
|
using (new EditorGUILayout.HorizontalScope())
|
|||
|
{
|
|||
|
GUILayout.FlexibleSpace();
|
|||
|
|
|||
|
if (Application.platform == RuntimePlatform.WindowsEditor)
|
|||
|
{
|
|||
|
DoOkButton();
|
|||
|
DoCloseButton();
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
DoCloseButton();
|
|||
|
DoOkButton();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
void DoOkButton()
|
|||
|
{
|
|||
|
if (mIsMigrationCompleted)
|
|||
|
{
|
|||
|
DoOpenPlasticButton();
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
DoMigrateButton();
|
|||
|
}
|
|||
|
|
|||
|
void DoCloseButton()
|
|||
|
{
|
|||
|
GUI.enabled = !mProgressControls.ProgressData.IsOperationRunning;
|
|||
|
|
|||
|
if (NormalButton(PlasticLocalization.GetString(
|
|||
|
PlasticLocalization.Name.CloseButton)))
|
|||
|
{
|
|||
|
if (mIsMigrationCompleted)
|
|||
|
TrackFeatureUseEvent.For(
|
|||
|
PlasticGui.Plastic.API.GetRepositorySpec(mWorkspaceInfo),
|
|||
|
TrackFeatureUseEvent.Features.CloseDialogAfterWorkspaceMigration);
|
|||
|
else
|
|||
|
TrackFeatureUseEvent.For(
|
|||
|
GetEventCloudOrganizationInfo(),
|
|||
|
TrackFeatureUseEvent.Features.DoNotMigrateWorkspace);
|
|||
|
|
|||
|
CloseButtonAction();
|
|||
|
}
|
|||
|
|
|||
|
GUI.enabled = true;
|
|||
|
}
|
|||
|
|
|||
|
void DoOpenPlasticButton()
|
|||
|
{
|
|||
|
if (!NormalButton("Open Plastic SCM"))
|
|||
|
return;
|
|||
|
|
|||
|
TrackFeatureUseEvent.For(
|
|||
|
PlasticGui.Plastic.API.GetRepositorySpec(mWorkspaceInfo),
|
|||
|
TrackFeatureUseEvent.Features.OpenPlasticAfterWorkspaceMigration);
|
|||
|
|
|||
|
((IPlasticDialogCloser)this).CloseDialog();
|
|||
|
ShowWindow.Plastic();
|
|||
|
}
|
|||
|
|
|||
|
EventCloudOrganizationInfo GetEventCloudOrganizationInfo()
|
|||
|
{
|
|||
|
return new EventCloudOrganizationInfo()
|
|||
|
{
|
|||
|
Name = mOrganizationName,
|
|||
|
ServerType = EventCloudOrganizationInfo.GetServerType(true),
|
|||
|
User = mUser
|
|||
|
};
|
|||
|
}
|
|||
|
|
|||
|
void DoMigrateButton()
|
|||
|
{
|
|||
|
GUI.enabled = !mProgressControls.ProgressData.IsOperationRunning;
|
|||
|
|
|||
|
if (NormalButton("Migrate"))
|
|||
|
{
|
|||
|
if (EditorUtility.DisplayDialog(
|
|||
|
"Collab migration to Plastic SCM",
|
|||
|
"Are you sure to start the migration process?",
|
|||
|
PlasticLocalization.GetString(PlasticLocalization.Name.YesButton),
|
|||
|
PlasticLocalization.GetString(PlasticLocalization.Name.NoButton)))
|
|||
|
{
|
|||
|
TrackFeatureUseEvent.For(
|
|||
|
GetEventCloudOrganizationInfo(),
|
|||
|
TrackFeatureUseEvent.Features.MigrateWorkspace);
|
|||
|
|
|||
|
LaunchMigration(
|
|||
|
mUnityAccessToken, mProjectPath,
|
|||
|
mOrganizationName, mRepId,
|
|||
|
mChangesetId, mBranchId,
|
|||
|
mAfterWorkspaceMigratedAction,
|
|||
|
mProgressControls);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
TrackFeatureUseEvent.For(
|
|||
|
GetEventCloudOrganizationInfo(),
|
|||
|
TrackFeatureUseEvent.Features.DoNotMigrateWorkspace);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
GUI.enabled = true;
|
|||
|
}
|
|||
|
|
|||
|
static void UpdateProgress(string wkPath,
|
|||
|
CreateWorkspaceFromCollab.Progress progress,
|
|||
|
ProgressControlsForMigration progressControls,
|
|||
|
BuildProgressSpeedAndRemainingTime.ProgressData progressData)
|
|||
|
{
|
|||
|
string header = MigrationProgressRender.FixNotificationPath(
|
|||
|
wkPath, progress.CurrentFile);
|
|||
|
|
|||
|
string message = MigrationProgressRender.GetProgressString(
|
|||
|
progress,
|
|||
|
progressData,
|
|||
|
DateTime.Now,
|
|||
|
0.05,
|
|||
|
"Calculating...",
|
|||
|
"Converted {0} of {1}bytes ({2} of 1 file){4}",
|
|||
|
"Converted {0} of {1}bytes ({2} of {3} files {4})",
|
|||
|
"remaining");
|
|||
|
|
|||
|
float percent = GetProgressBarPercent.ForTransfer(
|
|||
|
progress.ProcessedSize, progress.TotalSize) / 100f;
|
|||
|
|
|||
|
progressControls.ShowProgress(header, message, percent);
|
|||
|
}
|
|||
|
|
|||
|
void LaunchMigration(
|
|||
|
string unityAccessToken,
|
|||
|
string projectPath,
|
|||
|
string organizationName,
|
|||
|
RepId repId,
|
|||
|
long changesetId,
|
|||
|
long branchId,
|
|||
|
Action afterWorkspaceMigratedAction,
|
|||
|
ProgressControlsForMigration progressControls)
|
|||
|
{
|
|||
|
string serverName = string.Format(
|
|||
|
"{0}@cloud", organizationName);
|
|||
|
|
|||
|
TokenExchangeResponse tokenExchangeResponse = null;
|
|||
|
mWorkspaceInfo = null;
|
|||
|
|
|||
|
CreateWorkspaceFromCollab.Progress progress = new CreateWorkspaceFromCollab.Progress();
|
|||
|
|
|||
|
BuildProgressSpeedAndRemainingTime.ProgressData progressData =
|
|||
|
new BuildProgressSpeedAndRemainingTime.ProgressData(DateTime.Now);
|
|||
|
|
|||
|
IThreadWaiter waiter = ThreadWaiter.GetWaiter(10);
|
|||
|
waiter.Execute(
|
|||
|
/*threadOperationDelegate*/
|
|||
|
delegate
|
|||
|
{
|
|||
|
tokenExchangeResponse = AutoConfig.PlasticCredentials(
|
|||
|
unityAccessToken,
|
|||
|
serverName,
|
|||
|
projectPath);
|
|||
|
|
|||
|
if (tokenExchangeResponse.Error != null)
|
|||
|
{
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
RepositoryInfo repInfo = new BaseCommandsImpl().
|
|||
|
GetRepositoryInfo(repId, serverName);
|
|||
|
|
|||
|
if (repInfo == null)
|
|||
|
{
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
repInfo.SetExplicitServer(serverName);
|
|||
|
|
|||
|
mWorkspaceInfo = CreateWorkspaceFromCollab.Create(
|
|||
|
projectPath, repInfo.Name, repInfo,
|
|||
|
changesetId, branchId,
|
|||
|
progress);
|
|||
|
},
|
|||
|
/*afterOperationDelegate*/
|
|||
|
delegate
|
|||
|
{
|
|||
|
progressControls.HideProgress();
|
|||
|
|
|||
|
if (waiter.Exception != null)
|
|||
|
{
|
|||
|
DisplayException(progressControls, waiter.Exception);
|
|||
|
TrackWorkspaceMigrationFinishedFailureEvent(mWorkspaceInfo);
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
if (tokenExchangeResponse.Error != null)
|
|||
|
{
|
|||
|
mLog.ErrorFormat(
|
|||
|
"Unable to get TokenExchangeResponse: {0} [code {1}]",
|
|||
|
tokenExchangeResponse.Error.Message,
|
|||
|
tokenExchangeResponse.Error.ErrorCode);
|
|||
|
}
|
|||
|
|
|||
|
if (tokenExchangeResponse.Error != null ||
|
|||
|
mWorkspaceInfo == null)
|
|||
|
{
|
|||
|
progressControls.ShowError(
|
|||
|
"Failed to convert your workspace to Plastic SCM");
|
|||
|
TrackWorkspaceMigrationFinishedFailureEvent(mWorkspaceInfo);
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
progressControls.ShowSuccess(
|
|||
|
"Your workspace has been successfully converted to Plastic SCM");
|
|||
|
|
|||
|
mIsMigrationCompleted = true;
|
|||
|
|
|||
|
TrackFeatureUseEvent.For(
|
|||
|
PlasticGui.Plastic.API.GetRepositorySpec(mWorkspaceInfo),
|
|||
|
TrackFeatureUseEvent.Features.WorkspaceMigrationFinishedSuccess);
|
|||
|
|
|||
|
afterWorkspaceMigratedAction();
|
|||
|
},
|
|||
|
/*timerTickDelegate*/
|
|||
|
delegate
|
|||
|
{
|
|||
|
UpdateProgress(projectPath, progress, progressControls, progressData);
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
void TrackWorkspaceMigrationFinishedFailureEvent(WorkspaceInfo wkInfo)
|
|||
|
{
|
|||
|
if (wkInfo == null)
|
|||
|
{
|
|||
|
TrackFeatureUseEvent.For(
|
|||
|
GetEventCloudOrganizationInfo(),
|
|||
|
TrackFeatureUseEvent.Features.WorkspaceMigrationFinishedFailure);
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
TrackFeatureUseEvent.For(
|
|||
|
PlasticGui.Plastic.API.GetRepositorySpec(wkInfo),
|
|||
|
TrackFeatureUseEvent.Features.WorkspaceMigrationFinishedFailure);
|
|||
|
}
|
|||
|
|
|||
|
static void DisplayException(
|
|||
|
ProgressControlsForMigration progressControls,
|
|||
|
Exception ex)
|
|||
|
{
|
|||
|
ExceptionsHandler.LogException(
|
|||
|
"MigrationDialog", ex);
|
|||
|
|
|||
|
progressControls.ShowError(
|
|||
|
ExceptionsHandler.GetCorrectExceptionMessage(ex));
|
|||
|
}
|
|||
|
|
|||
|
static MigrationDialog Create(
|
|||
|
string unityAccessToken,
|
|||
|
string projectPath,
|
|||
|
string user,
|
|||
|
string organizationName,
|
|||
|
RepId repId,
|
|||
|
long changesetId,
|
|||
|
long branchId,
|
|||
|
Action afterWorkspaceMigratedAction,
|
|||
|
ProgressControlsForMigration progressControls)
|
|||
|
{
|
|||
|
var instance = CreateInstance<MigrationDialog>();
|
|||
|
instance.IsResizable = false;
|
|||
|
instance.mUnityAccessToken = unityAccessToken;
|
|||
|
instance.mProjectPath = projectPath;
|
|||
|
instance.mUser = user;
|
|||
|
instance.mOrganizationName = organizationName;
|
|||
|
instance.mRepId = repId;
|
|||
|
instance.mChangesetId = changesetId;
|
|||
|
instance.mBranchId = branchId;
|
|||
|
instance.mAfterWorkspaceMigratedAction = afterWorkspaceMigratedAction;
|
|||
|
instance.mProgressControls = progressControls;
|
|||
|
instance.mEscapeKeyAction = instance.CloseButtonAction;
|
|||
|
return instance;
|
|||
|
}
|
|||
|
|
|||
|
bool mIsMigrationCompleted;
|
|||
|
|
|||
|
ProgressControlsForMigration mProgressControls;
|
|||
|
Action mAfterWorkspaceMigratedAction;
|
|||
|
long mChangesetId;
|
|||
|
long mBranchId;
|
|||
|
RepId mRepId;
|
|||
|
string mOrganizationName;
|
|||
|
string mUser;
|
|||
|
string mProjectPath;
|
|||
|
string mUnityAccessToken;
|
|||
|
WorkspaceInfo mWorkspaceInfo;
|
|||
|
|
|||
|
static readonly ILog mLog = LogManager.GetLogger("MigrationDialog");
|
|||
|
}
|
|||
|
}
|