Implemented the ability to install from a remote source in \ncc\Managers > PackageManager

https://git.n64.cc/nosial/ncc/-/issues/28
This commit is contained in:
Netkas 2022-12-15 01:02:54 -05:00
parent 1f64a39f33
commit 13e3834fc7

View file

@ -5,11 +5,15 @@
namespace ncc\Managers; namespace ncc\Managers;
use Exception; use Exception;
use ncc\Abstracts\BuiltinRemoteSourceType;
use ncc\Abstracts\CompilerExtensions; use ncc\Abstracts\CompilerExtensions;
use ncc\Abstracts\ConstantReferences; use ncc\Abstracts\ConstantReferences;
use ncc\Abstracts\DependencySourceType; use ncc\Abstracts\DependencySourceType;
use ncc\Abstracts\LogLevel; use ncc\Abstracts\LogLevel;
use ncc\Abstracts\RemoteSourceType;
use ncc\Abstracts\Scopes; use ncc\Abstracts\Scopes;
use ncc\Abstracts\Versions;
use ncc\Classes\ComposerExtension\ComposerSourceBuiltin;
use ncc\Classes\NccExtension\PackageCompiler; use ncc\Classes\NccExtension\PackageCompiler;
use ncc\Classes\PhpExtension\PhpInstaller; use ncc\Classes\PhpExtension\PhpInstaller;
use ncc\CLI\Main; use ncc\CLI\Main;
@ -32,6 +36,7 @@
use ncc\Objects\PackageLock\PackageEntry; use ncc\Objects\PackageLock\PackageEntry;
use ncc\Objects\PackageLock\VersionEntry; use ncc\Objects\PackageLock\VersionEntry;
use ncc\Objects\ProjectConfiguration\Dependency; use ncc\Objects\ProjectConfiguration\Dependency;
use ncc\Objects\RemotePackageInput;
use ncc\ThirdParty\Symfony\Filesystem\Filesystem; use ncc\ThirdParty\Symfony\Filesystem\Filesystem;
use ncc\ThirdParty\theseer\DirectoryScanner\DirectoryScanner; use ncc\ThirdParty\theseer\DirectoryScanner\DirectoryScanner;
use ncc\Utilities\Console; use ncc\Utilities\Console;
@ -308,6 +313,83 @@
return $package->Assembly->Package; return $package->Assembly->Package;
} }
/**
* @param string $source
* @return string
* @throws InstallationException
*/
public function fetchFromSource(string $source): string
{
$parsed_source = new RemotePackageInput($source);
if($parsed_source->Source == null)
throw new InstallationException('No source specified');
if($parsed_source->Package == null)
throw new InstallationException('No package specified');
if($parsed_source->Version == null)
$parsed_source->Version = Versions::Latest;
$remote_source_type = Resolver::detectRemoteSourceType($parsed_source->Source);
if($remote_source_type == RemoteSourceType::Builtin)
{
switch($parsed_source->Source)
{
case BuiltinRemoteSourceType::Composer:
try
{
return ComposerSourceBuiltin::fetch($parsed_source);
}
catch(Exception $e)
{
throw new InstallationException('Cannot fetch package from composer source, ' . $e->getMessage(), $e);
}
default:
throw new InstallationException('Builtin source type ' . $parsed_source->Source . ' is not implemented');
}
}
if($remote_source_type == RemoteSourceType::Defined)
{
$remote_source_manager = new RemoteSourcesManager();
$remote_source = $remote_source_manager->getRemoteSource($parsed_source->Source);
if($remote_source == null)
throw new InstallationException('Remote source ' . $parsed_source->Source . ' is not defined');
// TODO: Implement defined remote sources
}
throw new InstallationException(sprintf('Unknown remote source type %s', $remote_source_type));
}
/**
* Installs a package from a source syntax (vendor/package=version@source)
*
* @param string $source
* @return string
* @throws AccessDeniedException
* @throws FileNotFoundException
* @throws IOException
* @throws InstallationException
* @throws MissingDependencyException
* @throws NotImplementedException
* @throws PackageAlreadyInstalledException
* @throws PackageLockException
* @throws PackageNotFoundException
* @throws PackageParsingException
* @throws UnsupportedCompilerExtensionException
* @throws UnsupportedRunnerException
* @throws VersionNotFoundException
*/
public function installFromSource(string $source): string
{
$package_path = $this->fetchFromSource($source);
return $this->install($package_path);
}
/** /**
* @param Dependency $dependency * @param Dependency $dependency
* @param Package $package * @param Package $package
@ -379,7 +461,6 @@
* @param string $package * @param string $package
* @return PackageEntry|null * @return PackageEntry|null
* @throws PackageLockException * @throws PackageLockException
* @throws PackageLockException
*/ */
public function getPackage(string $package): ?PackageEntry public function getPackage(string $package): ?PackageEntry
{ {