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.
417 lines
13 KiB
417 lines
13 KiB
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"); |
|
} |
|
}
|
|
|