UnityGame/Library/PackageCache/com.unity.collab-proxy/Editor/PlasticSCM/Hub/ParseArguments.cs
2024-10-27 10:53:47 +03:00

211 lines
6.9 KiB
C#

using System.Collections.Generic;
namespace Unity.PlasticSCM.Editor.Hub
{
internal static class ParseArguments
{
internal class Command
{
internal enum Operation
{
None,
DownloadRepository,
CreateWorkspace
}
internal readonly string ProjectPath;
internal readonly string WorkspacePath;
internal readonly string Organization;
internal readonly string Repository;
internal readonly Operation OperationType;
internal Command(
string projectPath,
string workspacePath,
string organization,
string repository,
Operation operationType)
{
ProjectPath = projectPath;
WorkspacePath = workspacePath;
Organization = organization;
Repository = repository;
OperationType = operationType;
}
internal bool IsValid()
{
return !string.IsNullOrEmpty(ProjectPath)
&& !string.IsNullOrEmpty(Organization)
&& !string.IsNullOrEmpty(Repository)
&& OperationType != Operation.None;
}
internal bool HasWorkspacePath()
{
return !string.IsNullOrEmpty(WorkspacePath);
}
}
internal static Command GetCommand(Dictionary<string, string> args)
{
return new Command(
GetProjectPath(args),
GetWorkspacePath(args),
GetOrganization(args),
GetRepository(args),
GetOperation(args));
}
internal static string GetProjectPath(Dictionary<string, string> args)
{
string data;
if (args.TryGetValue(CREATE_PROJECT, out data))
return data;
if (args.TryGetValue(OPEN_PROJECT, out data))
return data;
return null;
}
internal static string GetOrganization(Dictionary<string, string> args)
{
string data;
if (args.TryGetValue(UVCSArguments.ORGANIZATION_ARG, out data))
return data;
// -cloudOrganization 151d73c7-38cb-4eec-b11e-34764e707226-{plastic-org-name}
if (args.TryGetValue(CloudArguments.ORGANIZATION_ARG, out data))
return GetOrganizationNameFromData(
data, CloudArguments.PLASTIC_ORG_PREFIX_VALUE);
return null;
}
internal static string GetRepository(Dictionary<string, string> args)
{
string data;
if (args.TryGetValue(UVCSArguments.REPOSITORY_ARG, out data))
return data;
if (args.TryGetValue(CloudArguments.PROJECT_ARG, out data))
return data;
return null;
}
internal static string GetWorkspacePath(Dictionary<string, string> args)
{
string data;
if (args.TryGetValue(UVCSArguments.WORKSPACE_PATH_ARG, out data))
return data;
return null;
}
static Command.Operation GetOperation(Dictionary<string, string> args)
{
if (IsCreateWorkspaceCommand(args))
return Command.Operation.CreateWorkspace;
if (IsDownloadRepositoryCommand(args))
return Command.Operation.DownloadRepository;
return Command.Operation.None;
}
static string GetOrganizationNameFromData(string data, string plasticOrgPrefix)
{
if (data == null)
return null;
if (!data.StartsWith(plasticOrgPrefix))
return null;
if (data.Length <= plasticOrgPrefix.Length)
return null;
return data.Substring(plasticOrgPrefix.Length);
}
static bool IsCreateWorkspaceCommand(Dictionary<string, string> args)
{
// Connect UVCS to new project or existing project commands:
// -createProject/-projectPath {project_path}
// -uvcsRepository {plastic_repo}
// -uvcsOrganization {plastic_org}
// -uvcsCreateWorkspace
if (!args.ContainsKey(CREATE_PROJECT) &&
!args.ContainsKey(OPEN_PROJECT))
return false;
return args.ContainsKey(UVCSArguments.ORGANIZATION_ARG)
&& args.ContainsKey(UVCSArguments.REPOSITORY_ARG)
&& args.ContainsKey(UVCSArguments.CREATE_WORKSPACE_FLAG);
}
static bool IsDownloadRepositoryCommand(Dictionary<string, string> args)
{
return IsDownloadRepositoryCommandUsingLegacyArgs(args)
|| IsDownloadRepositoryCommandUsingUVCSArgs(args);
}
static bool IsDownloadRepositoryCommandUsingLegacyArgs(Dictionary<string, string> args)
{
// Open remote project command using legacy args:
// -createProject {project_path}
// -cloudProject {plastic_repo}
// -cloudOrganization 151d73c7-38cb-4eec-b11e-34764e707226-{plastic_org}
if (!args.ContainsKey(CREATE_PROJECT) ||
!args.ContainsKey(CloudArguments.PROJECT_ARG))
return false;
string data;
if (!args.TryGetValue(CloudArguments.ORGANIZATION_ARG, out data))
return false;
return data != null && data.StartsWith(
CloudArguments.PLASTIC_ORG_PREFIX_VALUE);
}
static bool IsDownloadRepositoryCommandUsingUVCSArgs(Dictionary<string, string> args)
{
// Open remote project command using UVCS args:
// -createProject {project_path}
// -uvcsRepository {plastic_repo}
// -uvcsOrganization {plastic_org_name}
if (!args.ContainsKey(CREATE_PROJECT))
return false;
return args.ContainsKey(UVCSArguments.ORGANIZATION_ARG)
&& args.ContainsKey(UVCSArguments.REPOSITORY_ARG);
}
static class UVCSArguments
{
internal const string ORGANIZATION_ARG = "-uvcsOrganization";
internal const string REPOSITORY_ARG = "-uvcsRepository";
internal const string WORKSPACE_PATH_ARG = "-uvcsWorkspacePath";
internal const string CREATE_WORKSPACE_FLAG = "-uvcsCreateWorkspace";
}
static class CloudArguments
{
internal const string ORGANIZATION_ARG = "-cloudOrganization";
internal const string PLASTIC_ORG_PREFIX_VALUE = "151d73c7-38cb-4eec-b11e-34764e707226-";
internal const string PROJECT_ARG = "-cloudProject";
}
const string CREATE_PROJECT = "-createProject";
const string OPEN_PROJECT = "-projectPath";
}
}