- Corrected code-smell and code style issues in \ncc\Utilities > IO

- Corrected code-smell and code style issues in `\ncc > ncc`
 - Corrected code-smell and code style issues in `\ncc\CLI > Main`
 - Removed unused exception `FileNotFoundException` in `\ncc\CLI > HelpMenu`
 - Corrected code-smell and code style issues in `\ncc\Managers > ProjectManager`
 - Corrected code-smell and code style issues in `\ncc\Objects\NccVersionInformation > Component`
 - Corrected code-smell and code style issues in `\ncc\Objects\Package > Component`
 - Corrected code-smell and code style issues in `\ncc\Managers > ConfigurationManager`
 - Corrected code-smell and code style issues in `\ncc\Managers > CredentialManager`
 - Refactored `\ncc\Utilities > PathFinder` to remove all Win32 references
 - Corrected code-smell and code style issues in `\ncc\Objects > ExecutionPointers`
 - Corrected code-smell and code style issues in `\ncc\Managers > ExecutionPointerManager`
 - Corrected code-smell and code style issues in `\ncc\Utilities > Functions`
 - Corrected code-smell and code style issues in `\ncc\Managers > PackageManager`
 - Removed `FileNotFoundException` and `DirectoryNotFoundException` from `\ncc\Exceptions`
 - Removed the use of `InvalidScopeException` across the project
 - Removed references of Win32 from the project as Windows is not going supported
 - Added new exception `PathNotFoundException` and implemented it in replacement for `DirectoryNotFoundException` and
   `FileNotFoundException` in `\ncc\Exceptions`
 - Corrected code-smell and code style issues in `src/installer/hash_check.php`
 - Renamed `Abstracts` namespace to `Enums`
 - Updated class type to "final class" in `\ncc\Enums\Options > BuildConfigurationValues`
 - Updated class type to "final class" in `\ncc\Enums\Options > InitializeProjectOptions`
 - Updated class type to "final class" in `\ncc\Enums\Options > InstallPackageOptions`
 - Updated class type to "final class" in `\ncc\Enums\SpecialConstants > AssemblyConstants`
 - Updated class type to "final class" in `\ncc\Enums\SpecialConstants > BuildConstants`
 - Updated class type to "final class" in `\ncc\Enums\SpecialConstants > DateTimeConstants`
 - Updated class type to "final class" in `\ncc\Enums\SpecialConstants > InstallConstants`
 - Updated class type to "final class" in `\ncc\Enums\SpecialConstants > RuntimeConstants`
 - Updated class type to "final class" in `\ncc\Enums > AuthenticationType`
 - Updated class type to "final class" in `\ncc\Enums > CompilerExtensionDefaultVersions`
 - Updated class type to "final class" in `\ncc\Enums > CompilerExtensions`
 - Updated class type to "final class" in `\ncc\Enums > CompilerExtensionSupportedVersions`
 - Updated class type to "final class" in `\ncc\Enums > ComponentDataType`
 - Updated class type to "final class" in `\ncc\Enums > ComponentFileExtensions`
 - Updated class type to "final class" in `\ncc\Enums > ComposerPackageTypes`
 - Updated class type to "final class" in `\ncc\Enums > ComposerStabilityTypes`
 - Updated class type to "final class" in `\ncc\Enums > EncoderType`
 - Updated class type to "final class" in `\ncc\Enums > ExceptionCodes`
 - Updated class type to "final class" in `\ncc\Enums > HttpRequestType`
 - Updated class type to "final class" in `\ncc\Enums > HttpStatusCodes`
 - Updated class type to "final class" in `\ncc\Enums > LogLevel`
 - Updated class type to "final class" in `\ncc\Enums > NccBuildFlags`
 - Updated class type to "final class" in `\ncc\Enums > PackageStandardVersions`
 - Updated class type to "final class" in `\ncc\Enums > PackageStructureVersions`
 - Updated class type to "final class" in `\ncc\Enums > ProjectType`
 - Updated class type to "final class" in `\ncc\Enums > RegexPattern`
 - Updated class type to "final class" in `\ncc\Enums > RemoteSourceType`
 - Updated class type to "final class" in `\ncc\Enums > Runners`
 - Updated class type to "final class" in `\ncc\Enums > Scopes`
 - Updated class type to "final class" in `\ncc\Enums > Versions`
 - Corrected code-smell and code style issues in `\ncc\Classes > NccExtension > ConstantCompiler`
 - Corrected code-smell and code style issues in `\ncc\Classes > GitlabExtension > GitlabService`
 - Corrected code-smell and code style issues in `\ncc\Classes > GithubExtension > GithubService`
This commit is contained in:
Netkas 2023-08-17 14:40:49 -04:00
parent 983e34f58e
commit 0820cd3c32
No known key found for this signature in database
GPG key ID: 5DAF58535614062B
44 changed files with 1476 additions and 1198 deletions

View file

@ -1,6 +1,78 @@
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="DuplicatedCode" enabled="true" level="WEAK WARNING" enabled_by_default="true">
<Languages>
<language minSize="133" name="PHP" />
</Languages>
</inspection_tool>
<inspection_tool class="ForgottenDebugOutputInspection" enabled="true" level="ERROR" enabled_by_default="true">
<option name="configuration">
<list>
<option value="\Codeception\Util\Debug::debug" />
<option value="\Codeception\Util\Debug::pause" />
<option value="\Doctrine\Common\Util\Debug::dump" />
<option value="\Doctrine\Common\Util\Debug::export" />
<option value="\Illuminate\Support\Debug\Dumper::dump" />
<option value="\Symfony\Component\Debug\Debug::enable" />
<option value="\Symfony\Component\Debug\DebugClassLoader::enable" />
<option value="\Symfony\Component\Debug\ErrorHandler::register" />
<option value="\Symfony\Component\Debug\ExceptionHandler::register" />
<option value="\TYPO3\CMS\Core\Utility\DebugUtility::debug" />
<option value="\Zend\Debug\Debug::dump" />
<option value="\Zend\Di\Display\Console::export" />
<option value="dd" />
<option value="debug_print_backtrace" />
<option value="debug_zval_dump" />
<option value="dpm" />
<option value="dpq" />
<option value="dsm" />
<option value="dump" />
<option value="dvm" />
<option value="error_log" />
<option value="kpr" />
<option value="phpinfo" />
<option value="print_r" />
<option value="var_dump" />
<option value="var_export" />
<option value="wp_die" />
<option value="xdebug_break" />
<option value="xdebug_call_class" />
<option value="xdebug_call_file" />
<option value="xdebug_call_function" />
<option value="xdebug_call_line" />
<option value="xdebug_code_coverage_started" />
<option value="xdebug_debug_zval" />
<option value="xdebug_debug_zval_stdout" />
<option value="xdebug_dump_superglobals" />
<option value="xdebug_enable" />
<option value="xdebug_get_code_coverage" />
<option value="xdebug_get_collected_errors" />
<option value="xdebug_get_declared_vars" />
<option value="xdebug_get_function_stack" />
<option value="xdebug_get_headers" />
<option value="xdebug_get_monitored_functions" />
<option value="xdebug_get_profiler_filename" />
<option value="xdebug_get_stack_depth" />
<option value="xdebug_get_tracefile_name" />
<option value="xdebug_is_enabled" />
<option value="xdebug_memory_usage" />
<option value="xdebug_peak_memory_usage" />
<option value="xdebug_print_function_stack" />
<option value="xdebug_start_code_coverage" />
<option value="xdebug_start_error_collection" />
<option value="xdebug_start_function_monitor" />
<option value="xdebug_start_trace" />
<option value="xdebug_stop_code_coverage" />
<option value="xdebug_stop_error_collection" />
<option value="xdebug_stop_function_monitor" />
<option value="xdebug_stop_trace" />
<option value="xdebug_time_index" />
<option value="xdebug_var_dump" />
</list>
</option>
<option name="migratedIntoUserSpace" value="true" />
</inspection_tool>
<inspection_tool class="IncorrectHttpHeaderInspection" enabled="true" level="WARNING" enabled_by_default="true">
<option name="customHeaders">
<set>
@ -25,5 +97,61 @@
</set>
</option>
</inspection_tool>
<inspection_tool class="SecurityAdvisoriesInspection" enabled="true" level="WARNING" enabled_by_default="true">
<option name="optionConfiguration">
<list>
<option value="barryvdh/laravel-debugbar" />
<option value="behat/behat" />
<option value="brianium/paratest" />
<option value="codeception/codeception" />
<option value="codedungeon/phpunit-result-printer" />
<option value="composer/composer" />
<option value="doctrine/coding-standard" />
<option value="filp/whoops" />
<option value="friendsofphp/php-cs-fixer" />
<option value="humbug/humbug" />
<option value="infection/infection" />
<option value="jakub-onderka/php-parallel-lint" />
<option value="johnkary/phpunit-speedtrap" />
<option value="kalessil/production-dependencies-guard" />
<option value="mikey179/vfsStream" />
<option value="mockery/mockery" />
<option value="mybuilder/phpunit-accelerator" />
<option value="orchestra/testbench" />
<option value="pdepend/pdepend" />
<option value="phan/phan" />
<option value="phing/phing" />
<option value="phpcompatibility/php-compatibility" />
<option value="phpmd/phpmd" />
<option value="phpro/grumphp" />
<option value="phpspec/phpspec" />
<option value="phpspec/prophecy" />
<option value="phpstan/phpstan" />
<option value="phpunit/phpunit" />
<option value="povils/phpmnd" />
<option value="roave/security-advisories" />
<option value="satooshi/php-coveralls" />
<option value="sebastian/phpcpd" />
<option value="slevomat/coding-standard" />
<option value="spatie/phpunit-watcher" />
<option value="squizlabs/php_codesniffer" />
<option value="sstalle/php7cc" />
<option value="symfony/debug" />
<option value="symfony/maker-bundle" />
<option value="symfony/phpunit-bridge" />
<option value="symfony/var-dumper" />
<option value="vimeo/psalm" />
<option value="wimg/php-compatibility" />
<option value="wp-coding-standards/wpcs" />
<option value="yiisoft/yii2-coding-standards" />
<option value="yiisoft/yii2-debug" />
<option value="yiisoft/yii2-gii" />
<option value="zendframework/zend-coding-standard" />
<option value="zendframework/zend-debug" />
<option value="zendframework/zend-test" />
</list>
</option>
</inspection_tool>
<inspection_tool class="UnknownInspectionInspection" enabled="false" level="WEAK WARNING" enabled_by_default="false" />
</profile>
</component>

View file

@ -9,6 +9,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## Added
- `LICENSE.md` & `license.md` are now detected as license files in `\ncc\Classes\ComposerExtension > ComposerSourceBuiltin > convertProject()`
- Added new exception `PathNotFoundException` and implemented it in replacement for `DirectoryNotFoundException` and
`FileNotFoundException` in `\ncc\Exceptions`
### Fixed
- Fixed MITM attack vector in `\ncc\Classes > HttpClient > prepareCurl()`
@ -52,6 +54,25 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Updated class type to "final class" in `\ncc\Enums > Scopes`
- Updated class type to "final class" in `\ncc\Enums > Versions`
- Corrected code-smell and code style issues in `src/installer/hash_check.php`
- Corrected code-smell and code style issues in `\ncc\Managers > ProjectManager`
- Corrected code-smell and code style issues in `\ncc\Objects\NccVersionInformation > Component`
- Corrected code-smell and code style issues in `\ncc\Objects\Package > Component`
- Corrected code-smell and code style issues in `\ncc\Managers > ConfigurationManager`
- Corrected code-smell and code style issues in `\ncc\Managers > CredentialManager`
- Refactored `\ncc\Utilities > PathFinder` to remove all Win32 references
- Corrected code-smell and code style issues in `\ncc\Objects > ExecutionPointers`
- Corrected code-smell and code style issues in `\ncc\Managers > ExecutionPointerManager`
- Corrected code-smell and code style issues in `\ncc\Utilities > Functions`
- Corrected code-smell and code style issues in `\ncc\Managers > PackageManager`
- Corrected code-smell and code style issues in `\ncc\Utilities > IO`
- Corrected code-smell and code style issues in `\ncc > ncc`
- Corrected code-smell and code style issues in `\ncc\CLI > Main`
## Removed
- Removed `FileNotFoundException` and `DirectoryNotFoundException` from `\ncc\Exceptions`
- Removed the use of `InvalidScopeException` across the project
- Removed references of Win32 from the project as Windows is not going supported
- Removed unused exception `FileNotFoundException` in `\ncc\CLI > HelpMenu`

View file

@ -1,5 +1,7 @@
# ![NCC](assets/icon/ncc@32px.png "NCC") NCC
[![wakatime](https://wakatime.com/badge/user/bc15cc8e-c9b9-4c11-bad9-3e3cfacf01e4/project/273bc06f-12e7-43d7-824d-40a78b02aada.svg)](https://wakatime.com/badge/user/bc15cc8e-c9b9-4c11-bad9-3e3cfacf01e4/project/273bc06f-12e7-43d7-824d-40a78b02aada)
Nosial Code Compiler is a program written in PHP designed to be a multi-purpose compiler, package manager and toolkit.
This program is a complete re-write of the now defunct [PHP Package Manager (PPM)](https://git.n64.cc/intellivoid/ppm)
toolkit offering more features, security and proper code licensing and copyrighting for the components used for the project.

View file

@ -291,7 +291,7 @@
foreach($VersionInformation->Components as $component)
{
$full_name = $component->Vendor . '/' . $component->PackageName;
$full_name = $component->vendor . '/' . $component->package_name;
try
{

View file

@ -1,29 +1,28 @@
<?php
/*
* Copyright (c) Nosial 2022-2023, all rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
* associated documentation files (the "Software"), to deal in the Software without restriction, including without
* limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
* Software, and to permit persons to whom the Software is furnished to do so, subject to the following
* conditions:
*
* The above copyright notice and this permission notice shall be included in all copies or substantial portions
* of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
* PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*
*/
/*
* Copyright (c) Nosial 2022-2023, all rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
* associated documentation files (the "Software"), to deal in the Software without restriction, including without
* limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
* Software, and to permit persons to whom the Software is furnished to do so, subject to the following
* conditions:
*
* The above copyright notice and this permission notice shall be included in all copies or substantial portions
* of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
* PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*
*/
namespace ncc\CLI;
namespace ncc\CLI;
use ncc\Exceptions\AccessDeniedException;
use ncc\Exceptions\FileNotFoundException;
use ncc\Exceptions\IOException;
use ncc\Objects\CliHelpSection;
use ncc\Utilities\Console;
@ -37,7 +36,6 @@ namespace ncc\CLI;
* @param $args
* @return void
* @throws AccessDeniedException
* @throws FileNotFoundException
* @throws IOException
*/
public static function start($args): void

View file

@ -1,24 +1,24 @@
<?php
/*
* Copyright (c) Nosial 2022-2023, all rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
* associated documentation files (the "Software"), to deal in the Software without restriction, including without
* limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
* Software, and to permit persons to whom the Software is furnished to do so, subject to the following
* conditions:
*
* The above copyright notice and this permission notice shall be included in all copies or substantial portions
* of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
* PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*
*/
/*
* Copyright (c) Nosial 2022-2023, all rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
* associated documentation files (the "Software"), to deal in the Software without restriction, including without
* limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
* Software, and to permit persons to whom the Software is furnished to do so, subject to the following
* conditions:
*
* The above copyright notice and this permission notice shall be included in all copies or substantial portions
* of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
* PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*
*/
/** @noinspection PhpMissingFieldTypeInspection */
@ -34,10 +34,7 @@
use ncc\CLI\Management\PackageManagerMenu;
use ncc\CLI\Management\ProjectMenu;
use ncc\CLI\Management\SourcesMenu;
use ncc\Exceptions\AccessDeniedException;
use ncc\Exceptions\FileNotFoundException;
use ncc\Exceptions\IOException;
use ncc\Exceptions\RuntimeException;
use ncc\Exceptions\PathNotFoundException;
use ncc\ncc;
use ncc\Utilities\Console;
use ncc\Utilities\Functions;
@ -61,9 +58,6 @@
*
* @param $argv
* @return void
* @throws RuntimeException
* @throws AccessDeniedException
* @throws IOException
*/
public static function start($argv): void
{
@ -76,13 +70,13 @@
{
ncc::initialize();
}
catch (FileNotFoundException $e)
catch (PathNotFoundException $e)
{
Console::outException('Cannot initialize NCC, one or more files were not found.', $e, 1);
}
catch (RuntimeException $e)
catch (Exception $e)
{
Console::outException('Cannot initialize NCC due to a runtime error.', $e, 1);
Console::outException('Cannot initialize NCC due to an unexpected error.', $e, 1);
}
define('NCC_CLI_MODE', 1);
@ -116,11 +110,13 @@
if(Resolver::checkLogLevel(self::$log_level, LogLevel::DEBUG))
{
Console::outDebug('Debug logging enabled');
/** @noinspection JsonEncodingApiUsageInspection */
Console::outDebug(sprintf('const: %s', json_encode(ncc::getConstants(), JSON_UNESCAPED_SLASHES)));
/** @noinspection JsonEncodingApiUsageInspection */
Console::outDebug(sprintf('args: %s', json_encode(self::$args, JSON_UNESCAPED_SLASHES)));
}
if(in_array(NccBuildFlags::UNSTABLE, NCC_VERSION_FLAGS))
if(in_array(NccBuildFlags::UNSTABLE, NCC_VERSION_FLAGS, true))
{
Console::outWarning('This is an unstable build of NCC, expect some features to not work as expected');
}
@ -187,18 +183,26 @@
}
}
private static function displayVersion()
/**
* Displays the current version of NCC
*
* @return void
*/
private static function displayVersion(): void
{
Console::out(sprintf('NCC version %s (%s)', NCC_VERSION_NUMBER, NCC_VERSION_BRANCH));
}
/**
* Returns the arguments passed to NCC
*
* @return array
*/
public static function getArgs(): array
{
if (self::$args == null)
if (self::$args === null)
{
/** @noinspection IssetArgumentExistenceInspection */
if(isset($argv))
{
self::$args = Resolver::parseArguments(implode(' ', $argv));
@ -217,8 +221,11 @@
*/
public static function getLogLevel(): string
{
if(self::$log_level == null)
if(self::$log_level === null)
{
self::$log_level = LogLevel::INFO;
}
return self::$log_level;
}

View file

@ -225,7 +225,7 @@ namespace ncc\CLI\Management;
Console::out('components:');
foreach($package->Components as $component)
{
Console::out(' - ' . sprintf('#%s %s - %s', $component->DataType, $component->Name, json_encode(($component->Flags ?? []), JSON_UNESCAPED_SLASHES)));
Console::out(' - ' . sprintf('#%s %s - %s', $component->data_types, $component->name, json_encode(($component->flags ?? []), JSON_UNESCAPED_SLASHES)));
}
}
else
@ -363,7 +363,7 @@ namespace ncc\CLI\Management;
$path = $package;
$parsed_source = new RemotePackageInput($path);
if($parsed_source->Vendor !== null && $parsed_source->Package !== null && $parsed_source->Source !== null)
if($parsed_source->vendor !== null && $parsed_source->package !== null && $parsed_source->source !== null)
{
try
{

View file

@ -1,38 +1,37 @@
<?php
/*
* Copyright (c) Nosial 2022-2023, all rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
* associated documentation files (the "Software"), to deal in the Software without restriction, including without
* limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
* Software, and to permit persons to whom the Software is furnished to do so, subject to the following
* conditions:
*
* The above copyright notice and this permission notice shall be included in all copies or substantial portions
* of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
* PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*
*/
/*
* Copyright (c) Nosial 2022-2023, all rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
* associated documentation files (the "Software"), to deal in the Software without restriction, including without
* limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
* Software, and to permit persons to whom the Software is furnished to do so, subject to the following
* conditions:
*
* The above copyright notice and this permission notice shall be included in all copies or substantial portions
* of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
* PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*
*/
namespace ncc\CLI\Management;
namespace ncc\CLI\Management;
use Exception;
use ncc\Enums\CompilerExtensionDefaultVersions;
use ncc\Enums\CompilerExtensions;
use ncc\Enums\CompilerExtensionSupportedVersions;
use ncc\Exceptions\AccessDeniedException;
use ncc\Exceptions\DirectoryNotFoundException;
use ncc\Exceptions\FileNotFoundException;
use ncc\Exceptions\InvalidPackageNameException;
use ncc\Exceptions\InvalidProjectNameException;
use ncc\Exceptions\IOException;
use ncc\Exceptions\MalformedJsonException;
use ncc\Exceptions\PathNotFoundException;
use ncc\Exceptions\ProjectAlreadyExistsException;
use ncc\Exceptions\ProjectConfigurationNotFoundException;
use ncc\Managers\ProjectManager;
@ -49,10 +48,9 @@ namespace ncc\CLI\Management;
* @param $args
* @return void
* @throws AccessDeniedException
* @throws DirectoryNotFoundException
* @throws FileNotFoundException
* @throws IOException
* @throws MalformedJsonException
* @throws PathNotFoundException
* @throws ProjectConfigurationNotFoundException
*/
public static function start($args): void
@ -69,11 +67,10 @@ namespace ncc\CLI\Management;
* @param $args
* @return void
* @throws AccessDeniedException
* @throws DirectoryNotFoundException
* @throws FileNotFoundException
* @throws IOException
* @throws MalformedJsonException
* @throws ProjectConfigurationNotFoundException
* @throws PathNotFoundException
*/
public static function createProject($args): void
{

View file

@ -22,7 +22,7 @@
namespace ncc\Classes\BashExtension;
use ncc\Exceptions\FileNotFoundException;
use ncc\Exceptions\PathNotFoundException;
use ncc\Interfaces\RunnerInterface;
use ncc\Objects\Package\ExecutionUnit;
use ncc\Objects\ProjectConfiguration\ExecutionPolicy;
@ -33,16 +33,17 @@ namespace ncc\Classes\BashExtension;
/**
* @inheritDoc
* @throws PathNotFoundException
*/
public static function processUnit(string $path, ExecutionPolicy $policy): ExecutionUnit
{
if(!file_exists($path) && !is_file($path))
{
throw new FileNotFoundException($path);
throw new PathNotFoundException($path);
}
$execution_unit = new ExecutionUnit();
$execution_unit->ExecutionPolicy = $policy;
$execution_unit->execution_policy = $policy;
$execution_unit->Data = IO::fread($path);
$policy->Execute->Target = null;

View file

@ -38,8 +38,7 @@ namespace ncc\Classes\ComposerExtension;
use ncc\Exceptions\ComposerDisabledException;
use ncc\Exceptions\ComposerException;
use ncc\Exceptions\ComposerNotAvailableException;
use ncc\Exceptions\DirectoryNotFoundException;
use ncc\Exceptions\FileNotFoundException;
use ncc\Exceptions\PathNotFoundException;
use ncc\Exceptions\InternalComposerNotAvailableException;
use ncc\Exceptions\InvalidScopeException;
use ncc\Exceptions\IOException;
@ -88,14 +87,13 @@ namespace ncc\Classes\ComposerExtension;
* @throws ComposerDisabledException
* @throws ComposerException
* @throws ComposerNotAvailableException
* @throws DirectoryNotFoundException
* @throws FileNotFoundException
* @throws IOException
* @throws InternalComposerNotAvailableException
* @throws InvalidScopeException
* @throws MalformedJsonException
* @throws PackageNotFoundException
* @throws PackagePreparationFailedException
* @throws PathNotFoundException
* @throws ProjectConfigurationNotFoundException
* @throws RuntimeException
* @throws UnsupportedCompilerExtensionException
@ -103,7 +101,7 @@ namespace ncc\Classes\ComposerExtension;
*/
public static function fetch(RemotePackageInput $packageInput): string
{
$package_path = self::require($packageInput->Vendor, $packageInput->Package, $packageInput->Version);
$package_path = self::require($packageInput->vendor, $packageInput->package, $packageInput->version);
$packages = self::compilePackages($package_path . DIRECTORY_SEPARATOR . 'composer.lock');
$real_package_name = explode('=', $packageInput->toStandard(false))[0];
@ -131,13 +129,12 @@ namespace ncc\Classes\ComposerExtension;
* @throws ComposerDisabledException
* @throws ComposerException
* @throws ComposerNotAvailableException
* @throws DirectoryNotFoundException
* @throws FileNotFoundException
* @throws IOException
* @throws InternalComposerNotAvailableException
* @throws MalformedJsonException
* @throws PackageNotFoundException
* @throws PackagePreparationFailedException
* @throws PathNotFoundException
* @throws ProjectConfigurationNotFoundException
* @throws UnsupportedCompilerExtensionException
* @throws UserAbortedOperationException
@ -147,7 +144,7 @@ namespace ncc\Classes\ComposerExtension;
// Check if the file composer.json exists
if (!file_exists($path . DIRECTORY_SEPARATOR . 'composer.json'))
{
throw new FileNotFoundException(sprintf('File "%s" not found', $path . DIRECTORY_SEPARATOR . 'composer.json'));
throw new PathNotFoundException(sprintf('File "%s" not found', $path . DIRECTORY_SEPARATOR . 'composer.json'));
}
// Execute composer with options
@ -205,12 +202,11 @@ namespace ncc\Classes\ComposerExtension;
* @throws AccessDeniedException
* @throws BuildConfigurationNotFoundException
* @throws BuildException
* @throws DirectoryNotFoundException
* @throws FileNotFoundException
* @throws IOException
* @throws MalformedJsonException
* @throws PackageNotFoundException
* @throws PackagePreparationFailedException
* @throws PathNotFoundException
* @throws ProjectConfigurationNotFoundException
* @throws UnsupportedCompilerExtensionException
*/
@ -218,7 +214,7 @@ namespace ncc\Classes\ComposerExtension;
{
if (!file_exists($composer_lock_path))
{
throw new FileNotFoundException($composer_lock_path);
throw new PathNotFoundException($composer_lock_path);
}
$base_dir = dirname($composer_lock_path);
@ -537,7 +533,7 @@ namespace ncc\Classes\ComposerExtension;
* @throws ComposerDisabledException
* @throws ComposerException
* @throws ComposerNotAvailableException
* @throws FileNotFoundException
* @throws PathNotFoundException
* @throws IOException
* @throws InternalComposerNotAvailableException
* @throws InvalidScopeException
@ -564,7 +560,7 @@ namespace ncc\Classes\ComposerExtension;
if (!file_exists($tpl_file))
{
throw new FileNotFoundException($tpl_file);
throw new PathNotFoundException($tpl_file);
}
$composer_exec = self::getComposerPath();
@ -698,7 +694,6 @@ namespace ncc\Classes\ComposerExtension;
* @param mixed $composer_package
* @return ProjectConfiguration
* @throws AccessDeniedException
* @throws FileNotFoundException
* @throws IOException
* @throws MalformedJsonException
* @throws PackagePreparationFailedException
@ -707,7 +702,7 @@ namespace ncc\Classes\ComposerExtension;
{
if($composer_package === null)
{
$composer_package = ComposerJson::fromArray(Functions::loadJsonFile($package_path . DIRECTORY_SEPARATOR . 'composer.json', Functions::FORCE_ARRAY));
$composer_package = Functions::loadComposerJson($package_path . DIRECTORY_SEPARATOR . 'composer.json');
}
$project_configuration = self::generateProjectConfiguration($composer_package, $version_map);

View file

@ -59,9 +59,9 @@ namespace ncc\Classes\GithubExtension;
{
$httpRequest = new HttpRequest();
$protocol = ($definedRemoteSource->SSL ? "https" : "http");
$owner_f = str_ireplace("/", "%2F", $packageInput->Vendor);
$owner_f = str_ireplace("/", "%2F", $packageInput->vendor);
$owner_f = str_ireplace(".", "%2F", $owner_f);
$repository = urlencode($packageInput->Package);
$repository = urlencode($packageInput->package);
$httpRequest->Url = $protocol . '://' . $definedRemoteSource->Host . "/repos/$owner_f/$repository";
$response_decoded = self::getJsonResponse($httpRequest, $entry);
@ -128,9 +128,9 @@ namespace ncc\Classes\GithubExtension;
{
$httpRequest = new HttpRequest();
$protocol = ($definedRemoteSource->SSL ? "https" : "http");
$owner_f = str_ireplace("/", "%2F", $packageInput->Vendor);
$owner_f = str_ireplace("/", "%2F", $packageInput->vendor);
$owner_f = str_ireplace(".", "%2F", $owner_f);
$repository = urlencode($packageInput->Package);
$repository = urlencode($packageInput->package);
$httpRequest->Url = $protocol . '://' . $definedRemoteSource->Host . "/repos/$owner_f/$repository/releases";
$response_decoded = self::getJsonResponse($httpRequest, $entry);
@ -235,7 +235,7 @@ namespace ncc\Classes\GithubExtension;
throw new VersionNotFoundException('No releases found for the given repository.');
}
if ($packageInput->Version === Versions::LATEST)
if ($packageInput->version === Versions::LATEST)
{
$latest_version = null;
foreach ($releases as $release)
@ -256,7 +256,7 @@ namespace ncc\Classes\GithubExtension;
}
// Query a specific version
if (!isset($releases[$packageInput->Version]))
if (!isset($releases[$packageInput->version]))
{
// Find the closest thing to the requested version
$selected_version = null;
@ -268,7 +268,7 @@ namespace ncc\Classes\GithubExtension;
continue;
}
if (VersionComparator::compareVersion($version, $packageInput->Version) === 1)
if (VersionComparator::compareVersion($version, $packageInput->version) === 1)
{
$selected_version = $version;
}
@ -281,7 +281,7 @@ namespace ncc\Classes\GithubExtension;
}
else
{
$selected_version = $packageInput->Version;
$selected_version = $packageInput->version;
}
if (!isset($releases[$selected_version]))

View file

@ -58,9 +58,9 @@
{
$httpRequest = new HttpRequest();
$protocol = ($definedRemoteSource->SSL ? "https" : "http");
$owner_f = str_ireplace("/", "%2F", $packageInput->Vendor);
$owner_f = str_ireplace("/", "%2F", $packageInput->vendor);
$owner_f = str_ireplace(".", "%2F", $owner_f);
$project_f = str_ireplace("/", "%2F", $packageInput->Package);
$project_f = str_ireplace("/", "%2F", $packageInput->package);
$project_f = str_ireplace(".", "%2F", $project_f);
$httpRequest->Url = $protocol . '://' . $definedRemoteSource->Host . "/api/v4/projects/$owner_f%2F$project_f";
$httpRequest = Functions::prepareGitServiceRequest($httpRequest, $entry);
@ -100,7 +100,7 @@
*/
public static function getRelease(RemotePackageInput $packageInput, DefinedRemoteSource $definedRemoteSource, ?Entry $entry = null): RepositoryQueryResults
{
$releases = self::getReleases($packageInput->Vendor, $packageInput->Package, $definedRemoteSource, $entry);
$releases = self::getReleases($packageInput->vendor, $packageInput->package, $definedRemoteSource, $entry);
if(count($releases) === 0)
{
@ -108,7 +108,7 @@
}
// Query the latest package only
if($packageInput->Version === Versions::LATEST)
if($packageInput->version === Versions::LATEST)
{
$latest_version = null;
foreach($releases as $release)
@ -129,7 +129,7 @@
}
// Query a specific version
if(!isset($releases[$packageInput->Version]))
if(!isset($releases[$packageInput->version]))
{
// Find the closest thing to the requested version
$selected_version = null;
@ -141,7 +141,7 @@
continue;
}
if(VersionComparator::compareVersion($version, $packageInput->Version) === 1)
if(VersionComparator::compareVersion($version, $packageInput->version) === 1)
{
$selected_version = $version;
}
@ -154,7 +154,7 @@
}
else
{
$selected_version = $packageInput->Version;
$selected_version = $packageInput->version;
}
if(!isset($releases[$selected_version]))

View file

@ -37,7 +37,7 @@ namespace ncc\Classes\LuaExtension;
{
$execution_unit = new ExecutionUnit();
$policy->Execute->Target = null;
$execution_unit->ExecutionPolicy = $policy;
$execution_unit->execution_policy = $policy;
$execution_unit->Data = IO::fread($path);
return $execution_unit;

View file

@ -266,7 +266,7 @@ namespace ncc\Classes\NccExtension;
$units = [];
foreach($package->ExecutionUnits as $executionUnit)
{
Console::outDebug(sprintf('compiling execution unit consts %s (%s)', $executionUnit->ExecutionPolicy->Name, implode(', ', array_keys($refs))));
Console::outDebug(sprintf('compiling execution unit consts %s (%s)', $executionUnit->execution_policy->Name, implode(', ', array_keys($refs))));
$units[] = self::compileExecutionUnitConstants($executionUnit, $refs);
}
$package->ExecutionUnits = $units;
@ -315,46 +315,46 @@ namespace ncc\Classes\NccExtension;
*/
public static function compileExecutionUnitConstants(Package\ExecutionUnit $unit, array $refs): Package\ExecutionUnit
{
$unit->ExecutionPolicy->Message = self::compileConstants($unit->ExecutionPolicy->Message, $refs);
$unit->execution_policy->Message = self::compileConstants($unit->execution_policy->Message, $refs);
if($unit->ExecutionPolicy->ExitHandlers !== null)
if($unit->execution_policy->ExitHandlers !== null)
{
if($unit->ExecutionPolicy->ExitHandlers->Success !== null)
if($unit->execution_policy->ExitHandlers->Success !== null)
{
$unit->ExecutionPolicy->ExitHandlers->Success->Message = self::compileConstants($unit->ExecutionPolicy->ExitHandlers->Success->Message, $refs);
$unit->execution_policy->ExitHandlers->Success->Message = self::compileConstants($unit->execution_policy->ExitHandlers->Success->Message, $refs);
}
if($unit->ExecutionPolicy->ExitHandlers->Error !== null)
if($unit->execution_policy->ExitHandlers->Error !== null)
{
$unit->ExecutionPolicy->ExitHandlers->Error->Message = self::compileConstants($unit->ExecutionPolicy->ExitHandlers->Error->Message, $refs);
$unit->execution_policy->ExitHandlers->Error->Message = self::compileConstants($unit->execution_policy->ExitHandlers->Error->Message, $refs);
}
if($unit->ExecutionPolicy->ExitHandlers->Warning !== null)
if($unit->execution_policy->ExitHandlers->Warning !== null)
{
$unit->ExecutionPolicy->ExitHandlers->Warning->Message = self::compileConstants($unit->ExecutionPolicy->ExitHandlers->Warning->Message, $refs);
$unit->execution_policy->ExitHandlers->Warning->Message = self::compileConstants($unit->execution_policy->ExitHandlers->Warning->Message, $refs);
}
}
if($unit->ExecutionPolicy->Execute !== null)
if($unit->execution_policy->Execute !== null)
{
if($unit->ExecutionPolicy->Execute->Target !== null)
if($unit->execution_policy->Execute->Target !== null)
{
$unit->ExecutionPolicy->Execute->Target = self::compileConstants($unit->ExecutionPolicy->Execute->Target, $refs);
$unit->execution_policy->Execute->Target = self::compileConstants($unit->execution_policy->Execute->Target, $refs);
}
if($unit->ExecutionPolicy->Execute->WorkingDirectory !== null)
if($unit->execution_policy->Execute->WorkingDirectory !== null)
{
$unit->ExecutionPolicy->Execute->WorkingDirectory = self::compileConstants($unit->ExecutionPolicy->Execute->WorkingDirectory, $refs);
$unit->execution_policy->Execute->WorkingDirectory = self::compileConstants($unit->execution_policy->Execute->WorkingDirectory, $refs);
}
if($unit->ExecutionPolicy->Execute->Options !== null && count($unit->ExecutionPolicy->Execute->Options) > 0)
if($unit->execution_policy->Execute->Options !== null && count($unit->execution_policy->Execute->Options) > 0)
{
$options = [];
foreach($unit->ExecutionPolicy->Execute->Options as $key=>$value)
foreach($unit->execution_policy->Execute->Options as $key=> $value)
{
$options[self::compileConstants($key, $refs)] = self::compileConstants($value, $refs);
}
$unit->ExecutionPolicy->Execute->Options = $options;
$unit->execution_policy->Execute->Options = $options;
}
}

View file

@ -54,7 +54,7 @@ namespace ncc\Classes\NccExtension;
$ExecutionPointerManager = new ExecutionPointerManager();
$ExecutionPointerManager->addUnit($package, $version, $unit, true);
$ExecutionPointerManager->executeUnit($package, $version, $unit->ExecutionPolicy->Name);
$ExecutionPointerManager->executeUnit($package, $version, $unit->execution_policy->Name);
$ExecutionPointerManager->cleanTemporaryUnits();
}
}

View file

@ -40,7 +40,7 @@ namespace ncc\Classes\PerlExtension;
$policy->Execute->Target = null;
if(!file_exists($path) && !is_file($path))
throw new FileNotFoundException($path);
$execution_unit->ExecutionPolicy = $policy;
$execution_unit->execution_policy = $policy;
$execution_unit->Data = IO::fread($path);
return $execution_unit;

View file

@ -169,10 +169,10 @@
continue;
$Component = new Package\Component();
$Component->Name = Functions::removeBasename($item->getPathname(), $this->path);
$Component->name = Functions::removeBasename($item->getPathname(), $this->path);
$this->package->Components[] = $Component;
Console::outVerbose(sprintf('Found component %s', $Component->Name));
Console::outVerbose(sprintf('Found component %s', $Component->name));
}
if(count($this->package->Components) > 0)
@ -396,7 +396,7 @@
Console::inlineProgressBar($processed_items, $total_items);
}
$content = IO::fread(Functions::correctDirectorySeparator($this->path . $component->Name));
$content = IO::fread(Functions::correctDirectorySeparator($this->path . $component->name));
$parser = (new ParserFactory())->create(ParserFactory::PREFER_PHP7);
try
@ -407,30 +407,30 @@
if($encoded === false)
{
$component->DataType = ComponentDataType::BASE64_ENCODED;
$component->Data = Base64::encode($content);
$component->data_types = ComponentDataType::BASE64_ENCODED;
$component->data = Base64::encode($content);
}
else
{
$component->DataType = ComponentDataType::AST;
$component->Data = json_decode($encoded, true);
$component->data_types = ComponentDataType::AST;
$component->data = json_decode($encoded, true);
}
}
catch(Exception $e)
{
$component->DataType = ComponentDataType::BASE64_ENCODED;
$component->Data = Base64::encode($content);
$component->data_types = ComponentDataType::BASE64_ENCODED;
$component->data = Base64::encode($content);
unset($e);
}
unset($parser);
$component->Name = str_replace($this->project->Build->SourcePath, (string)null, $component->Name);
$component->name = str_replace($this->project->Build->SourcePath, (string)null, $component->name);
$component->updateChecksum();
$components[] = $component;
$processed_items += 1;
Console::outDebug(sprintf('processed component %s (%s)', $component->Name, $component->DataType));
Console::outDebug(sprintf('processed component %s (%s)', $component->name, $component->data_types));
}
// Update the components

View file

@ -89,35 +89,35 @@
*/
public function processComponent(Package\Component $component): ?string
{
if($component->Data == null)
if($component->data == null)
return null;
if(!$component->validateChecksum())
throw new ComponentChecksumException('Checksum validation failed for component ' . $component->Name . ', the package may be corrupted.');
if(!$component->validate_checksum())
throw new ComponentChecksumException('Checksum validation failed for component ' . $component->name . ', the package may be corrupted.');
switch($component->DataType)
switch($component->data_types)
{
case ComponentDataType::AST:
try
{
$stmts = $this->decodeRecursive($component->Data);
$stmts = $this->decodeRecursive($component->data);
}
catch (Exception $e)
{
throw new ComponentDecodeException('Cannot decode component: ' . $component->Name . ', ' . $e->getMessage(), $e);
throw new ComponentDecodeException('Cannot decode component: ' . $component->name . ', ' . $e->getMessage(), $e);
}
$prettyPrinter = new Standard();
return $prettyPrinter->prettyPrintFile($stmts);
case ComponentDataType::BASE64_ENCODED:
return Base64::decode($component->Data);
return Base64::decode($component->data);
case ComponentDataType::PLAIN:
return $component->Data;
return $component->data;
default:
throw new UnsupportedComponentTypeException('Unsupported component type \'' . $component->DataType . '\'');
throw new UnsupportedComponentTypeException('Unsupported component type \'' . $component->data_types . '\'');
}
}

View file

@ -46,7 +46,7 @@ namespace ncc\Classes\PhpExtension;
if(!file_exists($path) && !is_file($path))
throw new FileNotFoundException($path);
$policy->Execute->Target = null;
$execution_unit->ExecutionPolicy = $policy;
$execution_unit->execution_policy = $policy;
$execution_unit->Data = IO::fread($path);
return $execution_unit;

View file

@ -40,7 +40,7 @@ namespace ncc\Classes\PythonExtension;
if(!file_exists($path) && !is_file($path))
throw new FileNotFoundException($path);
$policy->Execute->Target = null;
$execution_unit->ExecutionPolicy = $policy;
$execution_unit->execution_policy = $policy;
$execution_unit->Data = IO::fread($path);
return $execution_unit;

View file

@ -40,7 +40,7 @@ namespace ncc\Classes\PythonExtension;
if(!file_exists($path) && !is_file($path))
throw new FileNotFoundException($path);
$policy->Execute->Target = null;
$execution_unit->ExecutionPolicy = $policy;
$execution_unit->execution_policy = $policy;
$execution_unit->Data = IO::fread($path);
return $execution_unit;

View file

@ -40,7 +40,7 @@ namespace ncc\Classes\PythonExtension;
if(!file_exists($path) && !is_file($path))
throw new FileNotFoundException($path);
$policy->Execute->Target = null;
$execution_unit->ExecutionPolicy = $policy;
$execution_unit->execution_policy = $policy;
$execution_unit->Data = IO::fread($path);
return $execution_unit;

View file

@ -23,6 +23,7 @@
namespace ncc\Enums;
use ncc\Exceptions\InvalidDependencyConfiguration;
use ncc\Exceptions\PathNotFoundException;
use ncc\Exceptions\SymlinkException;
use ncc\Exceptions\UnsupportedArchiveException;
@ -37,16 +38,6 @@ namespace ncc\Enums;
*/
public const INVALID_PROJECT_CONFIGURATION = -1700;
/**
* @see FileNotFoundException;
*/
public const FILE_NOT_FOUND = -1701;
/**
* @see DirectoryNotFoundException
*/
public const DIRECTORY_NOT_FOUND = -1702;
/**
* @see InvalidScopeException
*/
@ -367,13 +358,16 @@ namespace ncc\Enums;
*/
public const SYMLINK_EXCEPTION = -1768;
/**
* @see PathNotFoundException
*/
public const PATH_NOT_FOUND = -1769;
/**
* All the exception codes from NCC
*/
public const All = [
self::INVALID_PROJECT_CONFIGURATION,
self::FILE_NOT_FOUND,
self::DIRECTORY_NOT_FOUND,
self::INVALID_SCOPE,
self::ACCESS_DENIED,
self::MALFORMED_JSON,
@ -435,5 +429,6 @@ namespace ncc\Enums;
self::INVALID_BUILD_CONFIGURATION,
self::INVALID_DEPENDENCY_CONFIGURATION,
self::SYMLINK_EXCEPTION,
self::PATH_NOT_FOUND
];
}

View file

@ -1,41 +0,0 @@
<?php
/*
* Copyright (c) Nosial 2022-2023, all rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
* associated documentation files (the "Software"), to deal in the Software without restriction, including without
* limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
* Software, and to permit persons to whom the Software is furnished to do so, subject to the following
* conditions:
*
* The above copyright notice and this permission notice shall be included in all copies or substantial portions
* of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
* PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*
*/
namespace ncc\Exceptions;
use Exception;
use ncc\Enums\ExceptionCodes;
use Throwable;
class DirectoryNotFoundException extends Exception
{
/**
* Public Constructor
*
* @param string $path
* @param Throwable|null $previous
*/
public function __construct(string $path = "", ?Throwable $previous = null)
{
parent::__construct('The file \'' . realpath($path) . '\' was not found', ExceptionCodes::DIRECTORY_NOT_FOUND, $previous);
}
}

View file

@ -1,43 +0,0 @@
<?php
/*
* Copyright (c) Nosial 2022-2023, all rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
* associated documentation files (the "Software"), to deal in the Software without restriction, including without
* limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
* Software, and to permit persons to whom the Software is furnished to do so, subject to the following
* conditions:
*
* The above copyright notice and this permission notice shall be included in all copies or substantial portions
* of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
* PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*
*/
namespace ncc\Exceptions;
use Exception;
use ncc\Enums\ExceptionCodes;
use Throwable;
/**
* @author Zi Xing Narrakas
* @copyright Copyright (C) 2022-2022. Nosial - All Rights Reserved.
*/
class FileNotFoundException extends Exception
{
/**
* @param string $path
* @param Throwable|null $previous
*/
public function __construct(string $path = "", ?Throwable $previous = null)
{
parent::__construct('The file \'' . realpath($path) . '\' was not found', ExceptionCodes::FILE_NOT_FOUND, $previous);
}
}

View file

@ -0,0 +1,35 @@
<?php
/*
* Copyright (c) Nosial 2022-2023, all rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
* associated documentation files (the "Software"), to deal in the Software without restriction, including without
* limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
* Software, and to permit persons to whom the Software is furnished to do so, subject to the following
* conditions:
*
* The above copyright notice and this permission notice shall be included in all copies or substantial portions
* of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
* PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*
*/
namespace ncc\Exceptions;
use Exception;
use ncc\Enums\ExceptionCodes;
use Throwable;
class PathNotFoundException extends Exception
{
public function __construct(string $path, ?Throwable $previous = null)
{
parent::__construct(sprintf('Path "%s" not found', $path), ExceptionCodes::PATH_NOT_FOUND, $previous);
}
}

View file

@ -1,32 +1,32 @@
<?php
/*
* Copyright (c) Nosial 2022-2023, all rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
* associated documentation files (the "Software"), to deal in the Software without restriction, including without
* limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
* Software, and to permit persons to whom the Software is furnished to do so, subject to the following
* conditions:
*
* The above copyright notice and this permission notice shall be included in all copies or substantial portions
* of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
* PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*
*/
/*
* Copyright (c) Nosial 2022-2023, all rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
* associated documentation files (the "Software"), to deal in the Software without restriction, including without
* limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
* Software, and to permit persons to whom the Software is furnished to do so, subject to the following
* conditions:
*
* The above copyright notice and this permission notice shall be included in all copies or substantial portions
* of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
* PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*
*/
namespace ncc\Interfaces;
namespace ncc\Interfaces;
use ncc\Enums\Options\BuildConfigurationValues;
use ncc\Exceptions\AccessDeniedException;
use ncc\Exceptions\BuildException;
use ncc\Exceptions\FileNotFoundException;
use ncc\Exceptions\IOException;
use ncc\Exceptions\PathNotFoundException;
use ncc\Objects\Package;
use ncc\Objects\ProjectConfiguration;
@ -49,12 +49,12 @@ namespace ncc\Interfaces;
public function prepare(string $build_configuration=BuildConfigurationValues::DEFAULT): void;
/**
* Executes the compile process in the correct order and returns the finalized Package object
* Executes the compiler process in the correct order and returns the finalized Package object
*
* @return Package|null
* @throws AccessDeniedException
* @throws BuildException
* @throws FileNotFoundException
* @throws PathNotFoundException
* @throws IOException
*/
public function build(): ?Package;
@ -64,7 +64,7 @@ namespace ncc\Interfaces;
*
* @return void
* @throws AccessDeniedException
* @throws FileNotFoundException
* @throws PathNotFoundException
* @throws IOException
*/
public function compileComponents(): void;
@ -74,7 +74,7 @@ namespace ncc\Interfaces;
*
* @return void
* @throws AccessDeniedException
* @throws FileNotFoundException
* @throws PathNotFoundException
* @throws IOException
*/
public function compileResources(): void;
@ -84,7 +84,7 @@ namespace ncc\Interfaces;
*
* @return void
* @throws AccessDeniedException
* @throws FileNotFoundException
* @throws PathNotFoundException
* @throws IOException
*/
public function compileExecutionPolicies(): void;

View file

@ -1,24 +1,24 @@
<?php
/*
* Copyright (c) Nosial 2022-2023, all rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
* associated documentation files (the "Software"), to deal in the Software without restriction, including without
* limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
* Software, and to permit persons to whom the Software is furnished to do so, subject to the following
* conditions:
*
* The above copyright notice and this permission notice shall be included in all copies or substantial portions
* of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
* PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*
*/
/*
* Copyright (c) Nosial 2022-2023, all rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
* associated documentation files (the "Software"), to deal in the Software without restriction, including without
* limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
* Software, and to permit persons to whom the Software is furnished to do so, subject to the following
* conditions:
*
* The above copyright notice and this permission notice shall be included in all copies or substantial portions
* of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
* PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*
*/
/** @noinspection PhpMissingFieldTypeInspection */
@ -27,7 +27,6 @@
use Exception;
use ncc\Enums\Scopes;
use ncc\Exceptions\AccessDeniedException;
use ncc\Exceptions\FileNotFoundException;
use ncc\Exceptions\InvalidScopeException;
use ncc\Exceptions\IOException;
use ncc\ThirdParty\Symfony\Yaml\Yaml;
@ -45,11 +44,10 @@
*
* @var mixed
*/
private $Configuration;
private $configuration;
/**
* @throws AccessDeniedException
* @throws FileNotFoundException
* @throws IOException
* @throws InvalidScopeException
*/
@ -63,7 +61,6 @@
*
* @return void
* @throws AccessDeniedException
* @throws FileNotFoundException
* @throws IOException
* @throws InvalidScopeException
*/
@ -71,12 +68,16 @@
{
Console::outDebug(sprintf('loading configuration file from %s', PathFinder::getConfigurationFile()));
$this->Configuration = RuntimeCache::get('ncc.yaml');
if($this->Configuration !== null)
$this->configuration = RuntimeCache::get('ncc.yaml');
if($this->configuration !== null)
{
return;
}
$configuration_contents = IO::fread(PathFinder::getConfigurationFile());
$this->Configuration = Yaml::parse($configuration_contents);
RuntimeCache::set('ncc.yaml', $this->Configuration);
$this->configuration = Yaml::parse($configuration_contents);
RuntimeCache::set('ncc.yaml', $this->configuration);
}
/**
@ -92,13 +93,17 @@
Console::outDebug(sprintf('saving configuration file to %s', PathFinder::getConfigurationFile()));
if(Resolver::resolveScope() !== Scopes::SYSTEM)
{
throw new AccessDeniedException('Cannot save configuration file, insufficient permissions');
}
if($this->Configuration == null)
if($this->configuration === null)
{
return;
}
IO::fwrite(PathFinder::getConfigurationFile(), Yaml::dump($this->Configuration), 0755);
RuntimeCache::set('ncc.yaml', $this->Configuration);
IO::fwrite(PathFinder::getConfigurationFile(), Yaml::dump($this->configuration), 0755);
RuntimeCache::set('ncc.yaml', $this->configuration);
RuntimeCache::set('config_cache', []);
}
@ -108,20 +113,18 @@
*
* @param string $property
* @return mixed|null
* @noinspection PhpMissingReturnTypeInspection
*/
public function getProperty(string $property)
public function getProperty(string $property): mixed
{
Console::outDebug(sprintf('getting property %s', $property));
Console::outDebug($property);
$current_selection = $this->getConfiguration();
foreach(explode('.', strtolower($property)) as $property)
foreach(explode('.', strtolower($property)) as $property_value)
{
$value_found = false;
foreach($current_selection as $key => $value)
{
if($key == $property)
if($key === $property_value)
{
$current_selection = $value;
$value_found = true;
@ -130,7 +133,9 @@
}
if(!$value_found)
{
return null;
}
}
return $current_selection;
@ -149,15 +154,18 @@
Console::outDebug(sprintf('updating property %s', $property));
$keys = explode('.', $property);
$current = &$this->Configuration;
$current = &$this->configuration;
foreach ($keys as $k)
{
if (!array_key_exists($k, $current))
{
return false;
}
$current = &$current[$k];
}
$current = Functions::stringTypeCast($value);
$this->save();
@ -169,7 +177,7 @@
*/
private function getConfiguration(): mixed
{
if($this->Configuration == null)
if($this->configuration === null)
{
try
{
@ -177,11 +185,12 @@
}
catch(Exception $e)
{
$this->Configuration = [];
unset($e);
$this->configuration = [];
}
}
return $this->Configuration;
return $this->configuration;
}
}

View file

@ -1,24 +1,24 @@
<?php
/*
* Copyright (c) Nosial 2022-2023, all rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
* associated documentation files (the "Software"), to deal in the Software without restriction, including without
* limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
* Software, and to permit persons to whom the Software is furnished to do so, subject to the following
* conditions:
*
* The above copyright notice and this permission notice shall be included in all copies or substantial portions
* of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
* PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*
*/
/*
* Copyright (c) Nosial 2022-2023, all rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
* associated documentation files (the "Software"), to deal in the Software without restriction, including without
* limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
* Software, and to permit persons to whom the Software is furnished to do so, subject to the following
* conditions:
*
* The above copyright notice and this permission notice shall be included in all copies or substantial portions
* of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
* PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*
*/
/** @noinspection PhpMissingFieldTypeInspection */
@ -28,7 +28,6 @@
use ncc\Enums\Scopes;
use ncc\Enums\Versions;
use ncc\Exceptions\AccessDeniedException;
use ncc\Exceptions\FileNotFoundException;
use ncc\Exceptions\IOException;
use ncc\Exceptions\RuntimeException;
use ncc\Objects\Vault;
@ -43,22 +42,20 @@
/**
* @var string
*/
private $CredentialsPath;
private $store_path;
/**
* @var Vault
*/
private $Vault;
private $vault;
/**
* Public Constructor
*/
public function __construct()
{
/** @noinspection PhpUnhandledExceptionInspection */
$this->CredentialsPath = PathFinder::getDataPath(Scopes::SYSTEM) . DIRECTORY_SEPARATOR . 'credentials.store';
$this->Vault = null;
$this->store_path = PathFinder::getDataPath(Scopes::SYSTEM) . DIRECTORY_SEPARATOR . 'credentials.store';
try
{
@ -69,8 +66,10 @@
unset($e);
}
if($this->Vault == null)
$this->Vault = new Vault();
if($this->vault === null)
{
$this->vault = new Vault();
}
}
/**
@ -82,20 +81,24 @@
*/
public function constructStore(): void
{
Console::outDebug(sprintf('constructing credentials store at %s', $this->CredentialsPath));
Console::outDebug(sprintf('constructing credentials store at %s', $this->store_path));
// Do not continue the function if the file already exists, if the file is damaged a separate function
// is to be executed to fix the damaged file.
if(file_exists($this->CredentialsPath))
if(file_exists($this->store_path))
{
return;
}
if(Resolver::resolveScope() !== Scopes::SYSTEM)
{
throw new AccessDeniedException('Cannot construct credentials store without system permissions');
}
$VaultObject = new Vault();
$VaultObject->Version = Versions::CREDENTIALS_STORE_VERSION;
IO::fwrite($this->CredentialsPath, ZiProto::encode($VaultObject->toArray()), 0744);
IO::fwrite($this->store_path, ZiProto::encode($VaultObject->toArray()), 0744);
}
/**
@ -105,28 +108,31 @@
* @throws AccessDeniedException
* @throws IOException
* @throws RuntimeException
* @throws FileNotFoundException
*/
private function loadVault(): void
{
Console::outDebug(sprintf('loading credentials store from %s', $this->CredentialsPath));
Console::outDebug(sprintf('loading credentials store from %s', $this->store_path));
if($this->Vault !== null)
return;
if(!file_exists($this->CredentialsPath))
if($this->vault !== null)
{
$this->Vault = new Vault();
return;
}
$VaultArray = ZiProto::decode(IO::fread($this->CredentialsPath));
if(!file_exists($this->store_path))
{
$this->vault = new Vault();
return;
}
$VaultArray = ZiProto::decode(IO::fread($this->store_path));
$VaultObject = Vault::fromArray($VaultArray);
if($VaultObject->Version !== Versions::CREDENTIALS_STORE_VERSION)
{
throw new RuntimeException('Credentials store version mismatch');
}
$this->Vault = $VaultObject;
$this->vault = $VaultObject;
}
/**
@ -135,26 +141,17 @@
* @return void
* @throws AccessDeniedException
* @throws IOException
* @noinspection PhpUnused
*/
public function saveVault(): void
{
Console::outDebug(sprintf('saving credentials store to %s', $this->CredentialsPath));
Console::outDebug(sprintf('saving credentials store to %s', $this->store_path));
if(Resolver::resolveScope() !== Scopes::SYSTEM)
{
throw new AccessDeniedException('Cannot save credentials store without system permissions');
}
IO::fwrite($this->CredentialsPath, ZiProto::encode($this->Vault->toArray()), 0744);
}
/**
* @return string
* @noinspection PhpUnused
*/
public function getCredentialsPath(): string
{
return $this->CredentialsPath;
IO::fwrite($this->store_path, ZiProto::encode($this->vault->toArray()), 0744);
}
/**
@ -162,6 +159,6 @@
*/
public function getVault(): ?Vault
{
return $this->Vault;
return $this->vault;
}
}

View file

@ -1,24 +1,24 @@
<?php
/*
* Copyright (c) Nosial 2022-2023, all rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
* associated documentation files (the "Software"), to deal in the Software without restriction, including without
* limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
* Software, and to permit persons to whom the Software is furnished to do so, subject to the following
* conditions:
*
* The above copyright notice and this permission notice shall be included in all copies or substantial portions
* of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
* PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*
*/
/*
* Copyright (c) Nosial 2022-2023, all rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
* associated documentation files (the "Software"), to deal in the Software without restriction, including without
* limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
* Software, and to permit persons to whom the Software is furnished to do so, subject to the following
* conditions:
*
* The above copyright notice and this permission notice shall be included in all copies or substantial portions
* of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
* PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*
*/
/** @noinspection PhpMissingFieldTypeInspection */
@ -36,10 +36,9 @@
use ncc\Classes\PythonExtension\Python3Runner;
use ncc\Classes\PythonExtension\PythonRunner;
use ncc\Exceptions\AccessDeniedException;
use ncc\Exceptions\FileNotFoundException;
use ncc\Exceptions\InvalidScopeException;
use ncc\Exceptions\IOException;
use ncc\Exceptions\NoAvailableUnitsException;
use ncc\Exceptions\PathNotFoundException;
use ncc\Exceptions\RunnerExecutionException;
use ncc\Objects\ExecutionPointers;
use ncc\Objects\Package;
@ -53,6 +52,7 @@
use ncc\Utilities\PathFinder;
use ncc\Utilities\Resolver;
use ncc\ZiProto\ZiProto;
use RuntimeException;
class ExecutionPointerManager
{
@ -61,14 +61,14 @@
*
* @var string
*/
private $RunnerPath;
private $runner_path;
/**
* An array of temporary unit names to destroy once the object is destroyed
*
* @var string[]
*/
private $TemporaryUnits;
private $temporary_units;
/**
* Deletes all the temporary files on destruct
@ -86,12 +86,12 @@
}
/**
* @throws InvalidScopeException
* ExecutionPointerManager constructor.
*/
public function __construct()
{
$this->RunnerPath = PathFinder::getRunnerPath(Scopes::SYSTEM);
$this->TemporaryUnits = [];
$this->runner_path = PathFinder::getRunnerPath(Scopes::SYSTEM);
$this->temporary_units = [];
}
/**
@ -101,14 +101,16 @@
*/
public function cleanTemporaryUnits(): void
{
if(count($this->TemporaryUnits) == 0)
if(count($this->temporary_units) === 0)
{
return;
}
Console::outVerbose('Cleaning temporary units...');
try
{
foreach($this->TemporaryUnits as $datum)
foreach($this->temporary_units as $datum)
{
Console::outDebug(sprintf('deleting unit %s=%s.%s', $datum['package'], $datum['version'], $datum['name']));
$this->removeUnit($datum['package'], $datum['version'], $datum['name']);
@ -140,16 +142,17 @@
* @param string $version
* @param string $name
* @return string
* @throws FileNotFoundException
*/
public function getEntryPointPath(string $package, string $version, string $name): string
{
$package_id = $this->getPackageId($package, $version);
$package_bin_path = $this->RunnerPath . DIRECTORY_SEPARATOR . $package_id;
$package_bin_path = $this->runner_path . DIRECTORY_SEPARATOR . $package_id;
$entry_point_path = $package_bin_path . DIRECTORY_SEPARATOR . hash('haval128,4', $name) . '.entrypoint';
if(!file_exists($entry_point_path))
throw new FileNotFoundException('Cannot find entry point for ' . $package . '=' . $version . '.' . $name);
{
throw new RuntimeException('Cannot find entry point for ' . $package . '=' . $version . '.' . $name);
}
return $entry_point_path;
}
@ -163,22 +166,23 @@
* @param bool $temporary
* @return void
* @throws AccessDeniedException
* @throws FileNotFoundException
* @throws IOException
* @throws RunnerExecutionException
* @noinspection PhpUnused
* @throws PathNotFoundException
*/
public function addUnit(string $package, string $version, ExecutionUnit $unit, bool $temporary=false): void
{
if(Resolver::resolveScope() !== Scopes::SYSTEM)
throw new AccessDeniedException('Cannot add new ExecutionUnit \'' . $unit->ExecutionPolicy->Name .'\' for ' . $package . ', insufficient permissions');
{
throw new AccessDeniedException('Cannot add new ExecutionUnit \'' . $unit->execution_policy->Name .'\' for ' . $package . ', insufficient permissions');
}
Console::outVerbose(sprintf('Adding new ExecutionUnit \'%s\' for %s', $unit->ExecutionPolicy->Name, $package));
Console::outVerbose(sprintf('Adding new ExecutionUnit \'%s\' for %s', $unit->execution_policy->Name, $package));
$package_id = $this->getPackageId($package, $version);
$package_config_path = $this->RunnerPath . DIRECTORY_SEPARATOR . $package_id . '.inx';
$package_bin_path = $this->RunnerPath . DIRECTORY_SEPARATOR . $package_id;
$entry_point_path = $package_bin_path . DIRECTORY_SEPARATOR . hash('haval128,4', $unit->ExecutionPolicy->Name) . '.entrypoint';
$package_config_path = $this->runner_path . DIRECTORY_SEPARATOR . $package_id . '.inx';
$package_bin_path = $this->runner_path . DIRECTORY_SEPARATOR . $package_id;
$entry_point_path = $package_bin_path . DIRECTORY_SEPARATOR . hash('haval128,4', $unit->execution_policy->Name) . '.entrypoint';
Console::outDebug(sprintf('package_id=%s', $package_id));
Console::outDebug(sprintf('package_config_path=%s', $package_config_path));
@ -197,8 +201,8 @@
$execution_pointers = ExecutionPointers::fromArray(ZiProto::decode(IO::fread($package_config_path)));
}
$bin_file = $package_bin_path . DIRECTORY_SEPARATOR . hash('haval128,4', $unit->ExecutionPolicy->Name);
$bin_file .= match ($unit->ExecutionPolicy->Runner)
$bin_file = $package_bin_path . DIRECTORY_SEPARATOR . hash('haval128,4', $unit->execution_policy->Name);
$bin_file .= match ($unit->execution_policy->Runner)
{
Runners::BASH => BashRunner::getFileExtension(),
Runners::PHP => PhpRunner::getFileExtension(),
@ -206,20 +210,26 @@
Runners::PYTHON => PythonRunner::getFileExtension(),
Runners::PYTHON_2 => Python2Runner::getFileExtension(),
Runners::PYTHON_3 => Python3Runner::getFileExtension(),
Runners::lua => LuaRunner::getFileExtension(),
default => throw new RunnerExecutionException('The runner \'' . $unit->ExecutionPolicy->Runner . '\' is not supported'),
Runners::LUA => LuaRunner::getFileExtension(),
default => throw new RunnerExecutionException('The runner \'' . $unit->execution_policy->Runner . '\' is not supported'),
};
Console::outDebug(sprintf('bin_file=%s', $bin_file));
if($filesystem->exists($bin_file) && $temporary)
if($temporary && $filesystem->exists($bin_file))
{
return;
}
if(!$filesystem->exists($package_bin_path))
{
$filesystem->mkdir($package_bin_path);
}
if($filesystem->exists($bin_file))
{
$filesystem->remove($bin_file);
}
IO::fwrite($bin_file, $unit->Data);
$execution_pointers->addUnit($unit, $bin_file);
@ -227,21 +237,24 @@
$entry_point = sprintf("#!%s\nncc exec --package=\"%s\" --exec-version=\"%s\" --exec-unit=\"%s\" --exec-args \"$@\"",
'/bin/bash',
$package, $version, $unit->ExecutionPolicy->Name
$package, $version, $unit->execution_policy->Name
);
if(file_exists($entry_point_path))
{
$filesystem->remove($entry_point_path);
}
IO::fwrite($entry_point_path, $entry_point);
chmod($entry_point_path, 0755);
if($temporary)
{
Console::outVerbose(sprintf('Adding temporary ExecutionUnit \'%s\' for %s', $unit->ExecutionPolicy->Name, $package));
$this->TemporaryUnits[] = [
Console::outVerbose(sprintf('Adding temporary ExecutionUnit \'%s\' for %s', $unit->execution_policy->Name, $package));
$this->temporary_units[] = [
'package' => $package,
'version' => $version,
'unit' => $unit->ExecutionPolicy->Name
'unit' => $unit->execution_policy->Name
];
}
}
@ -254,35 +267,44 @@
* @param string $name
* @return bool
* @throws AccessDeniedException
* @throws FileNotFoundException
* @throws IOException
*/
public function removeUnit(string $package, string $version, string $name): bool
{
if(Resolver::resolveScope() !== Scopes::SYSTEM)
{
throw new AccessDeniedException('Cannot remove ExecutionUnit \'' . $name .'\' for ' . $package . ', insufficient permissions');
}
Console::outVerbose(sprintf('Removing ExecutionUnit \'%s\' for %s', $name, $package));
$package_id = $this->getPackageId($package, $version);
$package_config_path = $this->RunnerPath . DIRECTORY_SEPARATOR . $package_id . '.inx';
$package_bin_path = $this->RunnerPath . DIRECTORY_SEPARATOR . $package_id;
$package_config_path = $this->runner_path . DIRECTORY_SEPARATOR . $package_id . '.inx';
$package_bin_path = $this->runner_path . DIRECTORY_SEPARATOR . $package_id;
Console::outDebug(sprintf('package_id=%s', $package_id));
Console::outDebug(sprintf('package_config_path=%s', $package_config_path));
Console::outDebug(sprintf('package_bin_path=%s', $package_bin_path));
$filesystem = new Filesystem();
if(!$filesystem->exists($package_config_path))
{
return false;
}
$execution_pointers = ExecutionPointers::fromArray(ZiProto::decode(IO::fread($package_config_path)));
$unit = $execution_pointers->getUnit($name);
if($unit == null)
if($unit === null)
{
return false;
}
$results = $execution_pointers->deleteUnit($name);
// Delete everything if there are no execution pointers configured
if(count($execution_pointers->getPointers()) == 0)
if(count($execution_pointers->getPointers()) === 0)
{
$filesystem->remove($package_config_path);
$filesystem->remove($package_bin_path);
@ -291,8 +313,10 @@
}
// Delete the single execution pointer file
if($filesystem->exists($unit->FilePointer))
$filesystem->remove($unit->FilePointer);
if($filesystem->exists($unit->file_pointer))
{
$filesystem->remove($unit->file_pointer);
}
return $results;
}
@ -304,16 +328,14 @@
* @param string $version
* @return array
* @throws AccessDeniedException
* @throws FileNotFoundException
* @throws IOException
* @noinspection PhpUnused
*/
public function getUnits(string $package, string $version): array
{
Console::outVerbose(sprintf('getting execution units for %s', $package));
$package_id = $this->getPackageId($package, $version);
$package_config_path = $this->RunnerPath . DIRECTORY_SEPARATOR . $package_id . '.inx';
$package_config_path = $this->runner_path . DIRECTORY_SEPARATOR . $package_id . '.inx';
Console::outDebug(sprintf('package_id=%s', $package_id));
Console::outDebug(sprintf('package_config_path=%s', $package_config_path));
@ -328,8 +350,8 @@
$results = [];
foreach($execution_pointers->getPointers() as $pointer)
{
Console::outDebug(sprintf('unit %s', $pointer->ExecutionPolicy->Name));
$results[] = $pointer->ExecutionPolicy->Name;
Console::outDebug(sprintf('unit %s', $pointer->execution_policy->Name));
$results[] = $pointer->execution_policy->Name;
}
return $results;
@ -344,7 +366,6 @@
* @param array $args
* @return int
* @throws AccessDeniedException
* @throws FileNotFoundException
* @throws IOException
* @throws NoAvailableUnitsException
* @throws RunnerExecutionException
@ -354,45 +375,49 @@
Console::outVerbose(sprintf('executing unit %s for %s', $name, $package));
$package_id = $this->getPackageId($package, $version);
$package_config_path = $this->RunnerPath . DIRECTORY_SEPARATOR . $package_id . '.inx';
$package_config_path = $this->runner_path . DIRECTORY_SEPARATOR . $package_id . '.inx';
if(!file_exists($package_config_path))
{
throw new NoAvailableUnitsException('There is no available units for \'' . $package . '=' .$version .'\'');
}
$execution_pointers = ExecutionPointers::fromArray(ZiProto::decode(IO::fread($package_config_path)));
$unit = $execution_pointers->getUnit($name);
if($unit == null)
if($unit === null)
{
throw new RunnerExecutionException('The execution unit \'' . $name . '\' was not found for \'' . $package . '=' .$version .'\'');
}
Console::outDebug(sprintf('unit=%s', $unit->ExecutionPolicy->Name));
Console::outDebug(sprintf('runner=%s', $unit->ExecutionPolicy->Runner));
Console::outDebug(sprintf('file=%s', $unit->FilePointer));
Console::outDebug(sprintf('pass_thru_args=%s', json_encode($args, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE)));
Console::outDebug(sprintf('unit=%s', $unit->execution_policy->Name));
Console::outDebug(sprintf('runner=%s', $unit->execution_policy->Runner));
Console::outDebug(sprintf('file=%s', $unit->file_pointer));
Console::outDebug(sprintf('pass_thru_args=%s', implode(' ', $args)));
// Handle the arguments
if($unit->ExecutionPolicy->Execute->Options !== null && count($unit->ExecutionPolicy->Execute->Options) > 0)
if($unit->execution_policy->Execute->Options !== null && count($unit->execution_policy->Execute->Options) > 0)
{
$args = array_merge($args, $unit->ExecutionPolicy->Execute->Options);
$args = array_merge($args, $unit->execution_policy->Execute->Options);
foreach($unit->ExecutionPolicy->Execute->Options as $option)
foreach($unit->execution_policy->Execute->Options as $option)
{
$args[] = ConstantCompiler::compileRuntimeConstants($option);
}
}
$process = new Process(array_merge(
[PathFinder::findRunner(strtolower($unit->ExecutionPolicy->Runner)), $unit->FilePointer], $args)
[PathFinder::findRunner(strtolower($unit->execution_policy->Runner)), $unit->file_pointer], $args)
);
if($unit->ExecutionPolicy->Execute->WorkingDirectory !== null)
if($unit->execution_policy->Execute->WorkingDirectory !== null)
{
$process->setWorkingDirectory(ConstantCompiler::compileRuntimeConstants($unit->ExecutionPolicy->Execute->WorkingDirectory));
$process->setWorkingDirectory(ConstantCompiler::compileRuntimeConstants($unit->execution_policy->Execute->WorkingDirectory));
}
if($unit->ExecutionPolicy->Execute->Timeout !== null)
if($unit->execution_policy->Execute->Timeout !== null)
{
$process->setTimeout((float)$unit->ExecutionPolicy->Execute->Timeout);
$process->setTimeout((float)$unit->execution_policy->Execute->Timeout);
}
else
{
@ -402,12 +427,12 @@
try
{
if($unit->ExecutionPolicy->Execute->Silent)
if($unit->execution_policy->Execute->Silent)
{
$process->disableOutput();
$process->setTty(false);
}
elseif($unit->ExecutionPolicy->Execute->Tty)
elseif($unit->execution_policy->Execute->Tty)
{
$process->enableOutput();
$process->setTty(true);
@ -419,6 +444,7 @@
}
catch(Exception $e)
{
unset($e);
$process->enableOutput();
Console::outWarning('The process is configured to use a TTY, but the current environment does not support it');
}
@ -433,16 +459,18 @@
Console::outDebug(sprintf('working_directory=%s', $process->getWorkingDirectory()));
Console::outDebug(sprintf('timeout=%s', ($process->getTimeout() ?? 0)));
Console::outDebug(sprintf('silent=%s', ($unit->ExecutionPolicy->Execute->Silent ? 'true' : 'false')));
Console::outDebug(sprintf('tty=%s', ($unit->ExecutionPolicy->Execute->Tty ? 'true' : 'false')));
Console::outDebug(sprintf('timeout=%s', (int)$process->getTimeout()));
Console::outDebug(sprintf('silent=%s', ($unit->execution_policy->Execute->Silent ? 'true' : 'false')));
Console::outDebug(sprintf('tty=%s', ($unit->execution_policy->Execute->Tty ? 'true' : 'false')));
Console::outDebug(sprintf('options=%s', implode(' ', $args)));
Console::outDebug(sprintf('cmd=%s', $process->getCommandLine()));
try
{
if($unit->ExecutionPolicy->Message !== null)
Console::out($unit->ExecutionPolicy->Message);
if($unit->execution_policy->Message !== null)
{
Console::out($unit->execution_policy->Message);
}
$process->run(function ($type, $buffer)
{
@ -453,44 +481,37 @@
}
catch(Exception $e)
{
if($unit->ExecutionPolicy->ExitHandlers !== null && $unit->ExecutionPolicy->ExitHandlers->Error !== null)
if($unit->execution_policy->ExitHandlers !== null && $unit->execution_policy->ExitHandlers->Error !== null)
{
$this->handleExit($package, $version, $unit->ExecutionPolicy->ExitHandlers->Error);
$this->handleExit($package, $version, $unit->execution_policy->ExitHandlers->Error);
}
Console::outException(sprintf('An error occurred while executing the unit \'%s\' for \'%s\' (exit code %s)', $unit->ExecutionPolicy->Name, $package, $process->getExitCode()), $e);
Console::outException(sprintf('An error occurred while executing the unit \'%s\' for \'%s\' (exit code %s)', $unit->execution_policy->Name, $package, $process->getExitCode()), $e);
}
finally
{
Console::outDebug(sprintf('exit_code=%s', $process->getExitCode()));
}
if($unit->ExecutionPolicy->ExitHandlers !== null)
if($unit->execution_policy->ExitHandlers !== null)
{
if($process->isSuccessful() && $unit->ExecutionPolicy->ExitHandlers->Success !== null)
if($unit->execution_policy->ExitHandlers->Success !== null && $process->isSuccessful())
{
$this->handleExit($package, $version, $unit->ExecutionPolicy->ExitHandlers->Success);
$this->handleExit($package, $version, $unit->execution_policy->ExitHandlers->Success);
}
elseif($process->isSuccessful() && $unit->ExecutionPolicy->ExitHandlers->Error !== null)
elseif($unit->execution_policy->ExitHandlers->Error !== null && $process->isSuccessful())
{
$this->handleExit($package, $version, $unit->ExecutionPolicy->ExitHandlers->Error);
$this->handleExit($package, $version, $unit->execution_policy->ExitHandlers->Error);
}
else
{
$this->handleExit($package, $version, $unit->ExecutionPolicy->ExitHandlers->Success, $process);
$this->handleExit($package, $version, $unit->ExecutionPolicy->ExitHandlers->Warning, $process);
$this->handleExit($package, $version, $unit->ExecutionPolicy->ExitHandlers->Error, $process);
$this->handleExit($package, $version, $unit->execution_policy->ExitHandlers->Success, $process);
$this->handleExit($package, $version, $unit->execution_policy->ExitHandlers->Warning, $process);
$this->handleExit($package, $version, $unit->execution_policy->ExitHandlers->Error, $process);
}
}
$exit_code = $process->getExitCode();
if($exit_code == null)
{
return 0;
}
return $exit_code;
return $process->getExitCode() ?? 0;
}
/**
@ -500,31 +521,42 @@
* @param string $unit_name
* @return void
* @throws AccessDeniedException
* @throws FileNotFoundException
* @throws IOException
* @throws NoAvailableUnitsException
* @throws PathNotFoundException
* @throws RunnerExecutionException
*/
public function temporaryExecute(Package $package, string $unit_name): void
{
// First get the execution unit from the package.
// First, get the execution unit from the package.
$unit = $package->getExecutionUnit($unit_name);
if($unit === null)
{
throw new NoAvailableUnitsException(sprintf('No execution unit named \'%s\' is available for package \'%s\'', $unit_name, $package->Assembly->Package));
}
// Get the required units
$required_units = [];
if($unit->ExecutionPolicy->ExitHandlers !== null)
if($unit->execution_policy->ExitHandlers !== null)
{
$required_unit = $unit->ExecutionPolicy?->ExitHandlers?->Success?->Run;
$required_unit = $unit->execution_policy?->ExitHandlers?->Success?->Run;
if($required_unit !== null)
{
$required_units[] = $required_unit;
}
$required_unit = $unit->ExecutionPolicy?->ExitHandlers?->Warning?->Run;
$required_unit = $unit->execution_policy?->ExitHandlers?->Warning?->Run;
if($required_unit !== null)
{
$required_units[] = $required_unit;
}
$required_unit = $unit->ExecutionPolicy?->ExitHandlers?->Error?->Run;
$required_unit = $unit->execution_policy?->ExitHandlers?->Error?->Run;
if($required_unit !== null)
{
$required_units = $required_unit;
}
}
// Install the units temporarily
@ -546,35 +578,38 @@
*
* @param string $package
* @param string $version
* @param ExitHandle $exitHandle
* @param ExitHandle $exit_handler
* @param Process|null $process
* @return bool
* @throws AccessDeniedException
* @throws FileNotFoundException
* @throws IOException
* @throws NoAvailableUnitsException
* @throws RunnerExecutionException
*/
public function handleExit(string $package, string $version, ExitHandle $exitHandle, ?Process $process=null): bool
public function handleExit(string $package, string $version, ExitHandle $exit_handler, ?Process $process=null): bool
{
if($exitHandle->Message !== null)
Console::out($exitHandle->Message);
if($process !== null && !$exitHandle->EndProcess)
if($exit_handler->Message !== null)
{
if($exitHandle->ExitCode !== $process->getExitCode())
return false;
Console::out($exit_handler->Message);
}
elseif($exitHandle->EndProcess)
if($process !== null && !$exit_handler->EndProcess)
{
if($exit_handler->ExitCode !== $process->getExitCode())
{
return false;
}
}
elseif($exit_handler->EndProcess)
{
Console::outDebug(sprintf('exit_code=%s', $process->getExitCode()));
exit($exitHandle->ExitCode);
exit($exit_handler->ExitCode);
}
if($exitHandle->Run !== null)
if($exit_handler->Run !== null)
{
Console::outVerbose('Running unit \'' . $exitHandle->Run . '\'');
$this->executeUnit($package, $version, $exitHandle->Run);
Console::outVerbose('Running unit \'' . $exit_handler->Run . '\'');
$this->executeUnit($package, $version, $exit_handler->Run);
}
return true;

View file

@ -39,7 +39,6 @@
use ncc\Classes\PhpExtension\PhpInstaller;
use ncc\CLI\Main;
use ncc\Exceptions\AccessDeniedException;
use ncc\Exceptions\FileNotFoundException;
use ncc\Exceptions\InstallationException;
use ncc\Exceptions\InvalidPackageNameException;
use ncc\Exceptions\InvalidScopeException;
@ -51,6 +50,7 @@
use ncc\Exceptions\PackageLockException;
use ncc\Exceptions\PackageNotFoundException;
use ncc\Exceptions\PackageParsingException;
use ncc\Exceptions\PathNotFoundException;
use ncc\Exceptions\RunnerExecutionException;
use ncc\Exceptions\SymlinkException;
use ncc\Exceptions\UnsupportedCompilerExtensionException;
@ -82,22 +82,21 @@
/**
* @var string
*/
private $PackagesPath;
private $packages_path;
/**
* @var PackageLockManager|null
*/
private $PackageLockManager;
private $package_lock_manager;
/**
* @throws InvalidScopeException
* @throws PackageLockException
*/
public function __construct()
{
$this->PackagesPath = PathFinder::getPackagesPath(Scopes::SYSTEM);
$this->PackageLockManager = new PackageLockManager();
$this->PackageLockManager->load();
$this->packages_path = PathFinder::getPackagesPath(Scopes::SYSTEM);
$this->package_lock_manager = new PackageLockManager();
$this->package_lock_manager->load();
}
/**
@ -108,7 +107,6 @@
* @param array $options
* @return string
* @throws AccessDeniedException
* @throws FileNotFoundException
* @throws IOException
* @throws InstallationException
* @throws InvalidPackageNameException
@ -119,6 +117,7 @@
* @throws PackageLockException
* @throws PackageNotFoundException
* @throws PackageParsingException
* @throws PathNotFoundException
* @throws RunnerExecutionException
* @throws SymlinkException
* @throws UnsupportedCompilerExtensionException
@ -127,10 +126,14 @@
public function install(string $package_path, ?Entry $entry=null, array $options=[]): string
{
if(Resolver::resolveScope() !== Scopes::SYSTEM)
{
throw new AccessDeniedException('Insufficient permission to install packages');
}
if(!file_exists($package_path) || !is_file($package_path) || !is_readable($package_path))
throw new FileNotFoundException('The specified file \'' . $package_path .' \' does not exist or is not readable.');
{
throw new PathNotFoundException($package_path);
}
$package = Package::load($package_path);
@ -141,7 +144,7 @@
}
$extension = $package->Header->CompilerExtension->Extension;
$installation_paths = new InstallationPaths($this->PackagesPath . DIRECTORY_SEPARATOR . $package->Assembly->Package . '=' . $package->Assembly->Version);
$installation_paths = new InstallationPaths($this->packages_path . DIRECTORY_SEPARATOR . $package->Assembly->Package . '=' . $package->Assembly->Version);
$installer = match ($extension)
{
@ -151,13 +154,11 @@
if($this->getPackageVersion($package->Assembly->Package, $package->Assembly->Version) !== null)
{
if(in_array(InstallPackageOptions::REINSTALL, $options))
if(in_array(InstallPackageOptions::REINSTALL, $options, true))
{
if($this->getPackageLockManager()->getPackageLock()->packageExists(
$package->Assembly->Package, $package->Assembly->Version
))
if($this->getPackageLockManager()?->getPackageLock()?->packageExists($package->Assembly->Package, $package->Assembly->Version))
{
$this->getPackageLockManager()->getPackageLock()->removePackageVersion(
$this->getPackageLockManager()?->getPackageLock()?->removePackageVersion(
$package->Assembly->Package, $package->Assembly->Version
);
}
@ -174,23 +175,20 @@
]);
// Process all the required dependencies before installing the package
if($package->Dependencies !== null && count($package->Dependencies) > 0 && !in_array(InstallPackageOptions::SKIP_DEPENDENCIES, $options))
if($package->Dependencies !== null && count($package->Dependencies) > 0 && !in_array(InstallPackageOptions::SKIP_DEPENDENCIES, $options, true))
{
foreach($package->Dependencies as $dependency)
{
if(in_array(InstallPackageOptions::REINSTALL, $options))
// Uninstall the dependency if the option Reinstall is passed on
if(in_array(InstallPackageOptions::REINSTALL, $options, true) && $this->getPackageLockManager()?->getPackageLock()?->packageExists($dependency->Name, $dependency->Version))
{
// Uninstall the dependency if the option Reinstall is passed on
if($this->getPackageLockManager()->getPackageLock()->packageExists($dependency->Name, $dependency->Version))
if($dependency->Version === null)
{
if($dependency->Version == null)
{
$this->uninstallPackage($dependency->Name);
}
else
{
$this->uninstallPackageVersion($dependency->Name, $dependency->Version);
}
$this->uninstallPackage($dependency->Name);
}
else
{
$this->uninstallPackageVersion($dependency->Name, $dependency->Version);
}
}
@ -208,21 +206,31 @@
Console::outDebug(sprintf('installer.src_path: %s', $installation_paths->getSourcePath()));
foreach($package->Assembly->toArray() as $prop => $value)
{
Console::outDebug(sprintf('assembly.%s: %s', $prop, ($value ?? 'n/a')));
}
foreach($package->Header->CompilerExtension->toArray() as $prop => $value)
{
Console::outDebug(sprintf('header.compiler.%s: %s', $prop, ($value ?? 'n/a')));
}
}
Console::out('Installing ' . $package->Assembly->Package);
// 4 For Directory Creation, preInstall, postInstall & initData methods
// Four For Directory Creation, preInstall, postInstall & initData methods
$steps = (4 + count($package->Components) + count ($package->Resources) + count ($package->ExecutionUnits));
// Include the Execution units
if($package->Installer?->PreInstall !== null)
{
$steps += count($package->Installer->PreInstall);
}
if($package->Installer?->PostInstall!== null)
{
$steps += count($package->Installer->PostInstall);
}
$current_steps = 0;
$filesystem = new Filesystem();
@ -233,7 +241,8 @@
$filesystem->mkdir($installation_paths->getBinPath(), 0755);
$filesystem->mkdir($installation_paths->getDataPath(), 0755);
$filesystem->mkdir($installation_paths->getSourcePath(), 0755);
$current_steps += 1;
++$current_steps;
Console::inlineProgressBar($current_steps, $steps);
}
catch(Exception $e)
@ -243,10 +252,12 @@
try
{
self::initData($package, $installation_paths);
Console::outDebug(sprintf('saving shadow package to %s', $installation_paths->getDataPath() . DIRECTORY_SEPARATOR . 'pkg'));
self::initData($package, $installation_paths);
$package->save($installation_paths->getDataPath() . DIRECTORY_SEPARATOR . 'pkg');
$current_steps += 1;
++$current_steps;
Console::inlineProgressBar($current_steps, $steps);
}
catch(Exception $e)
@ -258,7 +269,7 @@
try
{
$installer->preInstall($installation_paths);
$current_steps += 1;
++$current_steps;
Console::inlineProgressBar($current_steps, $steps);
}
catch (Exception $e)
@ -279,7 +290,7 @@
Console::outWarning('Cannot execute unit ' . $unit_name . ', ' . $e->getMessage());
}
$current_steps += 1;
++$current_steps;
Console::inlineProgressBar($current_steps, $steps);
}
}
@ -287,17 +298,21 @@
// Process & Install the components
foreach($package->Components as $component)
{
Console::outDebug(sprintf('processing component %s (%s)', $component->Name, $component->DataType));
Console::outDebug(sprintf('processing component %s (%s)', $component->name, $component->data_types));
try
{
$data = $installer->processComponent($component);
if($data !== null)
{
$component_path = $installation_paths->getSourcePath() . DIRECTORY_SEPARATOR . $component->Name;
$component_path = $installation_paths->getSourcePath() . DIRECTORY_SEPARATOR . $component->name;
$component_dir = dirname($component_path);
if(!$filesystem->exists($component_dir))
{
$filesystem->mkdir($component_dir);
}
IO::fwrite($component_path, $data);
}
}
@ -306,7 +321,7 @@
throw new InstallationException('Cannot process one or more components, ' . $e->getMessage(), $e);
}
$current_steps += 1;
++$current_steps;
Console::inlineProgressBar($current_steps, $steps);
}
@ -322,8 +337,12 @@
{
$resource_path = $installation_paths->getSourcePath() . DIRECTORY_SEPARATOR . $resource->Name;
$resource_dir = dirname($resource_path);
if(!$filesystem->exists($resource_dir))
{
$filesystem->mkdir($resource_dir);
}
IO::fwrite($resource_path, $data);
}
}
@ -332,7 +351,7 @@
throw new InstallationException('Cannot process one or more resources, ' . $e->getMessage(), $e);
}
$current_steps += 1;
++$current_steps;
Console::inlineProgressBar($current_steps, $steps);
}
@ -347,9 +366,9 @@
/** @var Package\ExecutionUnit $executionUnit */
foreach($package->ExecutionUnits as $executionUnit)
{
Console::outDebug(sprintf('processing execution unit %s', $executionUnit->ExecutionPolicy->Name));
Console::outDebug(sprintf('processing execution unit %s', $executionUnit->execution_policy->Name));
$execution_pointer_manager->addUnit($package->Assembly->Package, $package->Assembly->Version, $executionUnit);
$current_steps += 1;
++$current_steps;
Console::inlineProgressBar($current_steps, $steps);
}
@ -364,7 +383,9 @@
if(isset($package->Header->Options['create_symlink']) && $package->Header->Options['create_symlink'])
{
if($package->MainExecutionPolicy === null)
{
throw new InstallationException('Cannot create symlink, no main execution policy is defined');
}
Console::outDebug(sprintf('creating symlink to %s', $package->Assembly->Package));
@ -376,8 +397,10 @@
try
{
Console::outDebug('executing post-installation stage');
$installer->postInstall($installation_paths);
$current_steps += 1;
++$current_steps;
Console::inlineProgressBar($current_steps, $steps);
}
catch (Exception $e)
@ -399,9 +422,11 @@
{
Console::outWarning('Cannot execute unit ' . $unit_name . ', ' . $e->getMessage());
}
$current_steps += 1;
Console::inlineProgressBar($current_steps, $steps);
finally
{
++$current_steps;
Console::inlineProgressBar($current_steps, $steps);
}
}
}
else
@ -425,8 +450,8 @@
}
}
$this->getPackageLockManager()->getPackageLock()->addPackage($package, $installation_paths->getInstallationPath());
$this->getPackageLockManager()->save();
$this->getPackageLockManager()?->getPackageLock()?->addPackage($package, $installation_paths->getInstallationPath());
$this->getPackageLockManager()?->save();
RuntimeCache::set(sprintf('installed.%s=%s', $package->Assembly->Package, $package->Assembly->Version), true);
@ -445,43 +470,52 @@
{
$input = new RemotePackageInput($source);
if($input->Source == null)
throw new PackageFetchException('No source specified');
if($input->Package == null)
throw new PackageFetchException('No package specified');
if($input->Version == null)
$input->Version = Versions::LATEST;
Console::outVerbose('Fetching package ' . $input->Package . ' from ' . $input->Source . ' (' . $input->Version . ')');
$remote_source_type = Resolver::detectRemoteSourceType($input->Source);
if($remote_source_type == RemoteSourceType::BUILTIN)
if($input->source === null)
{
Console::outDebug('using builtin source ' . $input->Source);
switch($input->Source)
{
case 'composer':
try
{
return ComposerSourceBuiltin::fetch($input);
}
catch(Exception $e)
{
throw new PackageFetchException('Cannot fetch package from composer source, ' . $e->getMessage(), $e);
}
default:
throw new NotImplementedException('Builtin source type ' . $input->Source . ' is not implemented');
}
throw new PackageFetchException('No source specified');
}
if($remote_source_type == RemoteSourceType::DEFINED)
if($input->package === null)
{
Console::outDebug('using defined source ' . $input->Source);
$remote_source_manager = new RemoteSourcesManager();
$source = $remote_source_manager->getRemoteSource($input->Source);
if($source == null)
throw new InstallationException('Remote source ' . $input->Source . ' is not defined');
throw new PackageFetchException('No package specified');
}
if($input->version === null)
{
$input->version = Versions::LATEST;
}
Console::outVerbose('Fetching package ' . $input->package . ' from ' . $input->source . ' (' . $input->version . ')');
$remote_source_type = Resolver::detectRemoteSourceType($input->source);
if($remote_source_type === RemoteSourceType::BUILTIN)
{
Console::outDebug('using builtin source ' . $input->source);
if ($input->source === 'composer')
{
try
{
return ComposerSourceBuiltin::fetch($input);
}
catch (Exception $e)
{
throw new PackageFetchException('Cannot fetch package from composer source, ' . $e->getMessage(), $e);
}
}
throw new NotImplementedException('Builtin source type ' . $input->source . ' is not implemented');
}
if($remote_source_type === RemoteSourceType::DEFINED)
{
Console::outDebug('using defined source ' . $input->source);
/** @noinspection CallableParameterUseCaseInTypeContextInspection */
$source = (new RemoteSourcesManager())->getRemoteSource($input->source);
if($source === null)
{
throw new InstallationException('Remote source ' . $input->source . ' is not defined');
}
$repositoryQueryResults = Functions::getRepositoryQueryResults($input, $source, $entry);
$exceptions = [];
@ -490,7 +524,7 @@
{
try
{
Console::outDebug(sprintf('fetching package %s from %s', $input->Package, $repositoryQueryResults->Files->ZipballUrl));
Console::outDebug(sprintf('fetching package %s from %s', $input->package, $repositoryQueryResults->Files->ZipballUrl));
$archive = Functions::downloadGitServiceFile($repositoryQueryResults->Files->ZipballUrl, $entry);
return PackageCompiler::tryCompile(Functions::extractArchive($archive), $repositoryQueryResults->Version);
}
@ -505,7 +539,7 @@
{
try
{
Console::outDebug(sprintf('fetching package %s from %s', $input->Package, $repositoryQueryResults->Files->TarballUrl));
Console::outDebug(sprintf('fetching package %s from %s', $input->package, $repositoryQueryResults->Files->TarballUrl));
$archive = Functions::downloadGitServiceFile($repositoryQueryResults->Files->TarballUrl, $entry);
return PackageCompiler::tryCompile(Functions::extractArchive($archive), $repositoryQueryResults->Version);
}
@ -520,7 +554,7 @@
{
try
{
Console::outDebug(sprintf('fetching package %s from %s', $input->Package, $repositoryQueryResults->Files->PackageUrl));
Console::outDebug(sprintf('fetching package %s from %s', $input->package, $repositoryQueryResults->Files->PackageUrl));
return Functions::downloadGitServiceFile($repositoryQueryResults->Files->PackageUrl, $entry);
}
catch(Exception $e)
@ -534,7 +568,7 @@
{
try
{
Console::outDebug(sprintf('fetching package %s from %s', $input->Package, $repositoryQueryResults->Files->GitHttpUrl ?? $repositoryQueryResults->Files->GitSshUrl));
Console::outDebug(sprintf('fetching package %s from %s', $input->package, $repositoryQueryResults->Files->GitHttpUrl ?? $repositoryQueryResults->Files->GitSshUrl));
$git_repository = GitClient::cloneRepository($repositoryQueryResults->Files->GitHttpUrl ?? $repositoryQueryResults->Files->GitSshUrl);
foreach(GitClient::getTags($git_repository) as $tag)
@ -562,14 +596,16 @@
{
foreach($exceptions as $e)
{
if($exception == null)
if($exception === null)
{
$exception = new PackageFetchException($e->getMessage(), $e);
}
else
{
if($e->getMessage() == $exception->getMessage())
if($e->getMessage() === $exception->getMessage())
{
continue;
}
$exception = new PackageFetchException($e->getMessage(), $exception);
}
@ -600,6 +636,7 @@
try
{
Console::outVerbose(sprintf('Installing package from source %s', $source));
$package = $this->fetchFromSource($source, $entry);
return $this->install($package, $entry, $options);
}
@ -617,7 +654,6 @@
* @param array $options
* @return void
* @throws AccessDeniedException
* @throws FileNotFoundException
* @throws IOException
* @throws InstallationException
* @throws InvalidPackageNameException
@ -628,10 +664,12 @@
* @throws PackageLockException
* @throws PackageNotFoundException
* @throws PackageParsingException
* @throws PathNotFoundException
* @throws RunnerExecutionException
* @throws SymlinkException
* @throws UnsupportedCompilerExtensionException
* @throws VersionNotFoundException
* @throws PathNotFoundException
*/
private function processDependency(Dependency $dependency, Package $package, string $package_path, ?Entry $entry=null, array $options=[]): void
{
@ -650,9 +688,11 @@
Console::outDebug('dependency has version constraint, checking if package is installed');
$dependent_version = $this->getPackageVersion($dependency->Name, $dependency->Version);
if ($dependent_version !== null)
{
$dependency_met = true;
}
}
elseif ($dependent_package !== null && $dependency->Version == null)
elseif ($dependent_package !== null && $dependency->Version === null)
{
Console::outDebug(sprintf('dependency %s has no version specified, assuming dependency is met', $dependency->Name));
$dependency_met = true;
@ -668,8 +708,12 @@
case DependencySourceType::LOCAL:
Console::outDebug('installing from local source ' . $dependency->Source);
$basedir = dirname($package_path);
if (!file_exists($basedir . DIRECTORY_SEPARATOR . $dependency->Source))
throw new FileNotFoundException($basedir . DIRECTORY_SEPARATOR . $dependency->Source);
{
throw new PathNotFoundException($basedir . DIRECTORY_SEPARATOR . $dependency->Source);
}
$this->install($basedir . DIRECTORY_SEPARATOR . $dependency->Source, null, $options);
RuntimeCache::set(sprintf('dependency_installed.%s=%s', $dependency->Name, $dependency->Version), true);
break;
@ -703,7 +747,7 @@
public function getPackage(string $package): ?PackageEntry
{
Console::outDebug('getting package ' . $package);
return $this->getPackageLockManager()->getPackageLock()->getPackage($package);
return $this->getPackageLockManager()?->getPackageLock()?->getPackage($package);
}
/**
@ -745,7 +789,7 @@
*/
public function getInstalledPackages(): array
{
return $this->getPackageLockManager()->getPackageLock()->getPackages();
return $this->getPackageLockManager()?->getPackageLock()?->getPackages() ?? [];
}
/**
@ -765,18 +809,25 @@
$exploded = explode('=', $package);
try
{
/** @noinspection CallableParameterUseCaseInTypeContextInspection */
$package = $this->getPackage($exploded[0]);
if($package == null)
if($package === null)
{
throw new PackageNotFoundException('Package ' . $exploded[0] . ' not found');
}
$version = $package->getVersion($exploded[1]);
if($version == null)
if($version === null)
{
throw new VersionNotFoundException('Version ' . $exploded[1] . ' not found for package ' . $exploded[0]);
}
foreach ($version->Dependencies as $dependency)
{
if(!in_array($dependency->PackageName . '=' . $dependency->Version, $tree))
if(!in_array($dependency->PackageName . '=' . $dependency->Version, $tree, true))
{
$packages[] = $dependency->PackageName . '=' . $dependency->Version;
}
}
}
catch(Exception $e)
@ -794,8 +845,10 @@
{
foreach ($versions as $version)
{
if (!in_array($installed_package . '=' . $version, $packages))
if (!in_array($installed_package . '=' . $version, $packages, true))
{
$packages[] = $installed_package . '=' . $version;
}
}
}
}
@ -806,26 +859,26 @@
}
// Go through each package
foreach($packages as $package)
foreach($packages as $package_iter)
{
$package_e = explode('=', $package);
$package_e = explode('=', $package_iter);
try
{
$version_entry = $this->getPackageVersion($package_e[0], $package_e[1]);
if($version_entry == null)
if($version_entry === null)
{
Console::outWarning('Version ' . $package_e[1] . ' of package ' . $package_e[0] . ' not found');
}
else
{
$tree[$package] = null;
$tree[$package_iter] = null;
if($version_entry->Dependencies !== null && count($version_entry->Dependencies) > 0)
{
$tree[$package] = [];
$tree[$package_iter] = [];
foreach($version_entry->Dependencies as $dependency)
{
$dependency_name = sprintf('%s=%s', $dependency->PackageName, $dependency->Version);
$tree[$package] = $this->getPackageTree($tree[$package], $dependency_name);
$tree[$package_iter] = $this->getPackageTree($tree[$package_iter], $dependency_name);
}
}
}
@ -846,7 +899,6 @@
* @param string $version
* @return void
* @throws AccessDeniedException
* @throws FileNotFoundException
* @throws IOException
* @throws PackageLockException
* @throws PackageNotFoundException
@ -856,18 +908,25 @@
public function uninstallPackageVersion(string $package, string $version): void
{
if(Resolver::resolveScope() !== Scopes::SYSTEM)
{
throw new AccessDeniedException('Insufficient permission to uninstall packages');
}
$version_entry = $this->getPackageVersion($package, $version);
if($version_entry == null)
if($version_entry === null)
{
throw new PackageNotFoundException(sprintf('The package %s=%s was not found', $package, $version));
}
Console::out(sprintf('Uninstalling %s=%s', $package, $version));
Console::outVerbose(sprintf('Removing package %s=%s from PackageLock', $package, $version));
if(!$this->getPackageLockManager()->getPackageLock()->removePackageVersion($package, $version))
Console::outDebug('warning: removing package from package lock failed');
$this->getPackageLockManager()->save();
if(!$this->getPackageLockManager()?->getPackageLock()?->removePackageVersion($package, $version))
{
Console::outDebug('warning: removing package from package lock failed');
}
$this->getPackageLockManager()?->save();
Console::outVerbose('Removing package files');
$scanner = new DirectoryScanner();
@ -903,8 +962,10 @@
$execution_pointer_manager = new ExecutionPointerManager();
foreach($version_entry->ExecutionUnits as $executionUnit)
{
if(!$execution_pointer_manager->removeUnit($package, $version, $executionUnit->ExecutionPolicy->Name))
Console::outDebug(sprintf('warning: removing execution unit %s failed', $executionUnit->ExecutionPolicy->Name));
if(!$execution_pointer_manager->removeUnit($package, $version, $executionUnit->execution_policy->Name))
{
Console::outDebug(sprintf('warning: removing execution unit %s failed', $executionUnit->execution_policy->Name));
}
}
}
@ -925,16 +986,26 @@
public function uninstallPackage(string $package): void
{
if(Resolver::resolveScope() !== Scopes::SYSTEM)
{
throw new AccessDeniedException('Insufficient permission to uninstall packages');
}
$package_entry = $this->getPackage($package);
if($package_entry == null)
if($package_entry === null)
{
throw new PackageNotFoundException(sprintf('The package %s was not found', $package));
}
foreach($package_entry->getVersions() as $version)
{
$version_entry = $package_entry->getVersion($version);
if($version_entry === null)
{
Console::outDebug(sprintf('warning: version %s of package %s not found', $version, $package));
continue;
}
try
{
$this->uninstallPackageVersion($package, $version_entry->Version);
@ -992,12 +1063,12 @@
*/
private function getPackageLockManager(): ?PackageLockManager
{
if($this->PackageLockManager == null)
if($this->package_lock_manager === null)
{
$this->PackageLockManager = new PackageLockManager();
$this->package_lock_manager = new PackageLockManager();
}
return $this->PackageLockManager;
return $this->package_lock_manager;
}
}

View file

@ -1,27 +1,28 @@
<?php
/*
* Copyright (c) Nosial 2022-2023, all rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
* associated documentation files (the "Software"), to deal in the Software without restriction, including without
* limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
* Software, and to permit persons to whom the Software is furnished to do so, subject to the following
* conditions:
*
* The above copyright notice and this permission notice shall be included in all copies or substantial portions
* of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
* PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*
*/
/** @noinspection PhpMissingFieldTypeInspection */
/*
* Copyright (c) Nosial 2022-2023, all rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
* associated documentation files (the "Software"), to deal in the Software without restriction, including without
* limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
* Software, and to permit persons to whom the Software is furnished to do so, subject to the following
* conditions:
*
* The above copyright notice and this permission notice shall be included in all copies or substantial portions
* of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
* PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*
*/
namespace ncc\Managers;
use ncc\Enums\Options\BuildConfigurationValues;
@ -30,13 +31,13 @@
use ncc\Exceptions\AccessDeniedException;
use ncc\Exceptions\BuildConfigurationNotFoundException;
use ncc\Exceptions\BuildException;
use ncc\Exceptions\DirectoryNotFoundException;
use ncc\Exceptions\FileNotFoundException;
use ncc\Exceptions\InvalidPackageNameException;
use ncc\Exceptions\InvalidProjectNameException;
use ncc\Exceptions\IOException;
use ncc\Exceptions\MalformedJsonException;
use ncc\Exceptions\PackagePreparationFailedException;
use ncc\Exceptions\PathNotFoundException;
use ncc\Exceptions\ProjectAlreadyExistsException;
use ncc\Exceptions\ProjectConfigurationNotFoundException;
use ncc\Exceptions\UnsupportedCompilerExtensionException;
@ -44,6 +45,7 @@
use ncc\Objects\ProjectConfiguration\Compiler;
use ncc\ThirdParty\Symfony\Uid\Uuid;
use ncc\Utilities\Validate;
use RuntimeException;
class ProjectManager
{
@ -52,41 +54,37 @@
*
* @var string
*/
private $ProjectFilePath;
private $project_file_path;
/**
* The path that points the project's main directory
*
* @var string
*/
private $ProjectPath;
private $project_path;
/**
* The loaded project configuration, null if no project file is loaded
*
* @var ProjectConfiguration|null
*/
private $ProjectConfiguration;
private $project_configuration;
/**
* Public Constructor
*
* @param string $path
* @throws AccessDeniedException
* @throws DirectoryNotFoundException
* @throws FileNotFoundException
* @throws IOException
* @throws MalformedJsonException
* @throws PathNotFoundException
* @throws ProjectConfigurationNotFoundException
*/
public function __construct(string $path)
{
$this->ProjectFilePath = null;
$this->ProjectPath = null;
// Auto-resolve the trailing slash
/** @noinspection PhpStrFunctionsInspection */
if(substr($path, -1) !== '/')
if(!str_ends_with($path, '/'))
{
$path .= DIRECTORY_SEPARATOR;
}
@ -94,14 +92,16 @@
// Detect if the folder exists or not
if(!file_exists($path) || !is_dir($path))
{
throw new DirectoryNotFoundException('The given directory \'' . $path .'\' does not exist');
throw new PathNotFoundException($path);
}
$this->ProjectPath = $path;
$this->ProjectFilePath = $path . 'project.json';
$this->project_path = $path;
$this->project_file_path = $path . 'project.json';
if(file_exists($this->ProjectFilePath))
if(file_exists($this->project_file_path))
{
$this->load();
}
}
/**
@ -130,71 +130,79 @@
throw new InvalidProjectNameException('The given project name \'' . $name . '\' is not valid');
}
if(file_exists($this->ProjectPath . DIRECTORY_SEPARATOR . 'project.json'))
if(file_exists($this->project_path . DIRECTORY_SEPARATOR . 'project.json'))
{
throw new ProjectAlreadyExistsException('A project has already been initialized in \'' . $this->ProjectPath . DIRECTORY_SEPARATOR . 'project.json' . '\'');
throw new ProjectAlreadyExistsException('A project has already been initialized in \'' . $this->project_path . DIRECTORY_SEPARATOR . 'project.json' . '\'');
}
$this->ProjectConfiguration = new ProjectConfiguration();
$this->project_configuration = new ProjectConfiguration();
// Set the compiler information
$this->ProjectConfiguration->Project->Compiler = $compiler;
$this->project_configuration->Project->Compiler = $compiler;
// Set the assembly information
$this->ProjectConfiguration->Assembly->Name = $name;
$this->ProjectConfiguration->Assembly->Package = $package;
$this->ProjectConfiguration->Assembly->Version = '1.0.0';
$this->ProjectConfiguration->Assembly->UUID = Uuid::v1()->toRfc4122();
$this->project_configuration->Assembly->Name = $name;
$this->project_configuration->Assembly->Package = $package;
$this->project_configuration->Assembly->Version = '1.0.0';
$this->project_configuration->Assembly->UUID = Uuid::v1()->toRfc4122();
// Set the build information
$this->ProjectConfiguration->Build->SourcePath = $src;
if($this->ProjectConfiguration->Build->SourcePath == null)
$this->ProjectConfiguration->Build->SourcePath = $this->ProjectPath;
$this->ProjectConfiguration->Build->DefaultConfiguration = 'debug';
$this->project_configuration->Build->SourcePath = $src;
if($this->project_configuration->Build->SourcePath === null)
{
$this->project_configuration->Build->SourcePath = $this->project_path;
}
$this->project_configuration->Build->DefaultConfiguration = 'debug';
// Assembly constants if the program wishes to check for this
$this->ProjectConfiguration->Build->DefineConstants['ASSEMBLY_NAME'] = '%ASSEMBLY.NAME%';
$this->ProjectConfiguration->Build->DefineConstants['ASSEMBLY_PACKAGE'] = '%ASSEMBLY.PACKAGE%';
$this->ProjectConfiguration->Build->DefineConstants['ASSEMBLY_VERSION'] = '%ASSEMBLY.VERSION%';
$this->ProjectConfiguration->Build->DefineConstants['ASSEMBLY_UID'] = '%ASSEMBLY.UID%';
$this->project_configuration->Build->DefineConstants['ASSEMBLY_NAME'] = '%ASSEMBLY.NAME%';
$this->project_configuration->Build->DefineConstants['ASSEMBLY_PACKAGE'] = '%ASSEMBLY.PACKAGE%';
$this->project_configuration->Build->DefineConstants['ASSEMBLY_VERSION'] = '%ASSEMBLY.VERSION%';
$this->project_configuration->Build->DefineConstants['ASSEMBLY_UID'] = '%ASSEMBLY.UID%';
// Generate configurations
$DebugConfiguration = new ProjectConfiguration\Build\BuildConfiguration();
$DebugConfiguration->Name = 'debug';
$DebugConfiguration->OutputPath = 'build/debug';
$DebugConfiguration->DefineConstants["DEBUG"] = '1'; // Debugging constant if the program wishes to check for this
$this->ProjectConfiguration->Build->Configurations[] = $DebugConfiguration;
$this->project_configuration->Build->Configurations[] = $DebugConfiguration;
$ReleaseConfiguration = new ProjectConfiguration\Build\BuildConfiguration();
$ReleaseConfiguration->Name = 'release';
$ReleaseConfiguration->OutputPath = 'build/release';
$ReleaseConfiguration->DefineConstants["DEBUG"] = '0'; // Debugging constant if the program wishes to check for this
$this->ProjectConfiguration->Build->Configurations[] = $ReleaseConfiguration;
$this->project_configuration->Build->Configurations[] = $ReleaseConfiguration;
// Finally create project.json
$this->ProjectConfiguration->toFile($this->ProjectPath . DIRECTORY_SEPARATOR . 'project.json');
// Finally, create project.json
$this->project_configuration->toFile($this->project_path . DIRECTORY_SEPARATOR . 'project.json');
// And create the project directory for additional assets/resources
$Folders = [
$this->ProjectPath . DIRECTORY_SEPARATOR . 'ncc',
$this->ProjectPath . DIRECTORY_SEPARATOR . 'ncc' . DIRECTORY_SEPARATOR . 'cache',
$this->ProjectPath . DIRECTORY_SEPARATOR . 'ncc' . DIRECTORY_SEPARATOR . 'config',
$this->project_path . DIRECTORY_SEPARATOR . 'ncc',
$this->project_path . DIRECTORY_SEPARATOR . 'ncc' . DIRECTORY_SEPARATOR . 'cache',
$this->project_path . DIRECTORY_SEPARATOR . 'ncc' . DIRECTORY_SEPARATOR . 'config',
];
foreach($Folders as $folder)
{
if(!file_exists($folder))
if(!file_exists($folder) && !mkdir($folder) && !is_dir($folder))
{
mkdir($folder);
throw new RuntimeException(sprintf('Directory "%s" was not created', $folder));
}
}
// Process options
foreach($options as $option)
{
if ($option == InitializeProjectOptions::CREATE_SOURCE_DIRECTORY) {
if (!file_exists($this->ProjectConfiguration->Build->SourcePath)) {
mkdir($this->ProjectConfiguration->Build->SourcePath);
}
if (
$option === InitializeProjectOptions::CREATE_SOURCE_DIRECTORY &&
!file_exists($this->project_configuration->Build->SourcePath) &&
!mkdir($concurrentDirectory = $this->project_configuration->Build->SourcePath) &&
!is_dir($concurrentDirectory)
)
{
throw new RuntimeException(sprintf('Directory "%s" was not created', $concurrentDirectory));
}
}
}
@ -206,10 +214,7 @@
*/
public function projectLoaded(): bool
{
if($this->ProjectConfiguration == null)
return false;
return true;
return $this->project_configuration !== null;
}
/**
@ -224,10 +229,12 @@
*/
public function load(): void
{
if(!file_exists($this->ProjectFilePath) && !is_file($this->ProjectFilePath))
throw new ProjectConfigurationNotFoundException('The project configuration file \'' . $this->ProjectFilePath . '\' was not found');
if(!file_exists($this->project_file_path) && !is_file($this->project_file_path))
{
throw new ProjectConfigurationNotFoundException('The project configuration file \'' . $this->project_file_path . '\' was not found');
}
$this->ProjectConfiguration = ProjectConfiguration::fromFile($this->ProjectFilePath);
$this->project_configuration = ProjectConfiguration::fromFile($this->project_file_path);
}
/**
@ -239,16 +246,21 @@
public function save(): void
{
if(!$this->projectLoaded())
{
return;
$this->ProjectConfiguration->toFile($this->ProjectFilePath);
}
$this->project_configuration->toFile($this->project_file_path);
}
/**
* Returns the project's file path.
*
* @return string|null
*/
public function getProjectFilePath(): ?string
{
return $this->ProjectFilePath;
return $this->project_file_path;
}
/**
@ -261,17 +273,22 @@
*/
public function getProjectConfiguration(): ?ProjectConfiguration
{
if($this->ProjectConfiguration == null)
if($this->project_configuration === null)
{
$this->load();
return $this->ProjectConfiguration;
}
return $this->project_configuration;
}
/**
* Returns the project's path.
*
* @return string|null
*/
public function getProjectPath(): ?string
{
return $this->ProjectPath;
return $this->project_path;
}

View file

@ -131,7 +131,9 @@
foreach($this->Sources as $source)
{
if($source->Name === $name)
{
return $source;
}
}
return null;

View file

@ -1,30 +1,30 @@
<?php
/*
* Copyright (c) Nosial 2022-2023, all rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
* associated documentation files (the "Software"), to deal in the Software without restriction, including without
* limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
* Software, and to permit persons to whom the Software is furnished to do so, subject to the following
* conditions:
*
* The above copyright notice and this permission notice shall be included in all copies or substantial portions
* of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
* PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*
*/
/*
* Copyright (c) Nosial 2022-2023, all rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
* associated documentation files (the "Software"), to deal in the Software without restriction, including without
* limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
* Software, and to permit persons to whom the Software is furnished to do so, subject to the following
* conditions:
*
* The above copyright notice and this permission notice shall be included in all copies or substantial portions
* of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
* PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*
*/
/** @noinspection PhpMissingFieldTypeInspection */
namespace ncc\Objects;
use ncc\Exceptions\FileNotFoundException;
use ncc\Exceptions\PathNotFoundException;
use ncc\Objects\ExecutionPointers\ExecutionPointer;
use ncc\Objects\Package\ExecutionUnit;
use ncc\Utilities\Functions;
@ -35,17 +35,17 @@
/**
* @var string
*/
private $Package;
private $package;
/**
* @var string
*/
private $Version;
private $version;
/**
* @var ExecutionPointer[]
*/
private $Pointers;
private $pointers;
/**
* @param string|null $package
@ -53,9 +53,9 @@
*/
public function __construct(?string $package=null, ?string $version=null)
{
$this->Package = $package;
$this->Version = $version;
$this->Pointers = [];
$this->package = $package;
$this->version = $version;
$this->pointers = [];
}
/**
@ -65,26 +65,30 @@
* @param string $bin_file
* @param bool $overwrite
* @return bool
* @throws FileNotFoundException
* @throws PathNotFoundException
*/
public function addUnit(ExecutionUnit $unit, string $bin_file, bool $overwrite=true): bool
{
if(Validate::exceedsPathLength($bin_file))
{
return false;
}
if(!file_exists($bin_file))
throw new FileNotFoundException('The file ' . $unit->Data . ' does not exist, cannot add unit \'' . $unit->ExecutionPolicy->Name . '\'');
{
throw new PathNotFoundException($bin_file);
}
if($overwrite)
{
$this->deleteUnit($unit->ExecutionPolicy->Name);
$this->deleteUnit($unit->execution_policy->Name);
}
elseif($this->getUnit($unit->ExecutionPolicy->Name) !== null)
elseif($this->getUnit($unit->execution_policy->Name) !== null)
{
return false;
}
$this->Pointers[] = new ExecutionPointer($unit, $bin_file);
$this->pointers[] = new ExecutionPointer($unit, $bin_file);
return true;
}
@ -97,17 +101,22 @@
public function deleteUnit(string $name): bool
{
$unit = $this->getUnit($name);
if($unit == null)
return false;
$new_pointers = [];
foreach($this->Pointers as $pointer)
if($unit === null)
{
if($pointer->ExecutionPolicy->Name !== $name)
$new_pointers[] = $pointer;
return false;
}
$this->Pointers = $new_pointers;
$new_pointers = [];
foreach($this->pointers as $pointer)
{
if($pointer->execution_policy->Name !== $name)
{
$new_pointers[] = $pointer;
}
}
$this->pointers = $new_pointers;
return true;
}
@ -120,10 +129,12 @@
public function getUnit(string $name): ?ExecutionPointer
{
/** @var ExecutionPointer $pointer */
foreach($this->Pointers as $pointer)
foreach($this->pointers as $pointer)
{
if($pointer->ExecutionPolicy->Name == $name)
if($pointer->execution_policy->Name === $name)
{
return $pointer;
}
}
return null;
@ -136,7 +147,7 @@
*/
public function getPointers(): array
{
return $this->Pointers;
return $this->pointers;
}
/**
@ -146,7 +157,7 @@
*/
public function getVersion(): string
{
return $this->Version;
return $this->version;
}
/**
@ -156,7 +167,7 @@
*/
public function getPackage(): string
{
return $this->Package;
return $this->package;
}
/**
@ -168,13 +179,13 @@
public function toArray(bool $bytecode=false): array
{
$pointers = [];
foreach($this->Pointers as $pointer)
foreach($this->pointers as $pointer)
{
$pointers[] = $pointer->toArray($bytecode);
}
return [
($bytecode ? Functions::cbc('package') : 'package') => $this->Package,
($bytecode ? Functions::cbc('version') : 'version') => $this->Version,
($bytecode ? Functions::cbc('package') : 'package') => $this->package,
($bytecode ? Functions::cbc('version') : 'version') => $this->version,
($bytecode ? Functions::cbc('pointers') : 'pointers') => $pointers
];
}
@ -189,18 +200,18 @@
{
$object = new self();
$object->Version = Functions::array_bc($data, 'version');
$object->Package = Functions::array_bc($data, 'package');
$object->Pointers = Functions::array_bc($data, 'pointers');
$object->version = Functions::array_bc($data, 'version');
$object->package = Functions::array_bc($data, 'package');
$object->pointers = Functions::array_bc($data, 'pointers');
if($object->Pointers !== null)
if($object->pointers !== null)
{
$pointers = [];
foreach($object->Pointers as $pointer)
foreach($object->pointers as $pointer)
{
$pointers[] = ExecutionPointer::fromArray($pointer);
}
$object->Pointers = $pointers;
$object->pointers = $pointers;
}
return $object;

View file

@ -33,21 +33,21 @@
/**
* @var string
*/
public $ID;
public $id;
/**
* The execution policy for this execution unit
*
* @var ExecutionPolicy
*/
public $ExecutionPolicy;
public $execution_policy;
/**
* The file pointer for where the target script should be executed
*
* @var string
*/
public $FilePointer;
public $file_pointer;
/**
* Public Constructor with optional ExecutionUnit parameter to construct object from
@ -57,12 +57,14 @@
*/
public function __construct(?ExecutionUnit $unit=null, ?string $bin_file=null)
{
if($unit == null)
if($unit === null)
{
return;
}
$this->ID = $unit->getID();
$this->ExecutionPolicy = $unit->ExecutionPolicy;
$this->FilePointer = $bin_file;
$this->id = $unit->getId();
$this->execution_policy = $unit->execution_policy;
$this->file_pointer = $bin_file;
}
/**
@ -74,14 +76,14 @@
public function toArray(bool $bytecode=false): array
{
return [
($bytecode ? Functions::cbc('id') : 'id') => $this->ID,
($bytecode ? Functions::cbc('execution_policy') : 'execution_policy') => $this->ExecutionPolicy->toArray($bytecode),
($bytecode ? Functions::cbc('file_pointer') : 'file_pointer') => $this->FilePointer,
($bytecode ? Functions::cbc('id') : 'id') => $this->id,
($bytecode ? Functions::cbc('execution_policy') : 'execution_policy') => $this->execution_policy->toArray($bytecode),
($bytecode ? Functions::cbc('file_pointer') : 'file_pointer') => $this->file_pointer,
];
}
/**
* Constructs object from an array representation
* Constructs an object from an array representation
*
* @param array $data
* @return ExecutionPointer
@ -90,12 +92,14 @@
{
$object = new self();
$object->ID = Functions::array_bc($data, 'id');
$object->ExecutionPolicy = Functions::array_bc($data, 'execution_policy');
$object->FilePointer = Functions::array_bc($data, 'file_pointer');
$object->id = Functions::array_bc($data, 'id');
$object->execution_policy = Functions::array_bc($data, 'execution_policy');
$object->file_pointer = Functions::array_bc($data, 'file_pointer');
if($object->ExecutionPolicy !== null)
$object->ExecutionPolicy = ExecutionPolicy::fromArray($object->ExecutionPolicy);
if($object->execution_policy !== null)
{
$object->execution_policy = ExecutionPolicy::fromArray($object->execution_policy);
}
return $object;
}

View file

@ -1,24 +1,24 @@
<?php
/*
* Copyright (c) Nosial 2022-2023, all rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
* associated documentation files (the "Software"), to deal in the Software without restriction, including without
* limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
* Software, and to permit persons to whom the Software is furnished to do so, subject to the following
* conditions:
*
* The above copyright notice and this permission notice shall be included in all copies or substantial portions
* of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
* PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*
*/
/*
* Copyright (c) Nosial 2022-2023, all rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
* associated documentation files (the "Software"), to deal in the Software without restriction, including without
* limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
* Software, and to permit persons to whom the Software is furnished to do so, subject to the following
* conditions:
*
* The above copyright notice and this permission notice shall be included in all copies or substantial portions
* of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
* PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*
*/
/** @noinspection PhpMissingFieldTypeInspection */
@ -26,7 +26,6 @@
use ncc\Exceptions\AccessDeniedException;
use ncc\Exceptions\ComponentVersionNotFoundException;
use ncc\Exceptions\FileNotFoundException;
use ncc\Exceptions\IOException;
use ncc\Utilities\IO;
@ -37,14 +36,14 @@
*
* @var string
*/
public $Vendor;
public $vendor;
/**
* The name of the package
*
* @var string
*/
public $PackageName;
public $package_name;
/**
* Attempts to resolve the component's build version
@ -52,16 +51,17 @@
* @return string
* @throws ComponentVersionNotFoundException
* @throws AccessDeniedException
* @throws FileNotFoundException
* @throws IOException
*/
public function getVersion(): string
{
$third_party_path = NCC_EXEC_LOCATION . DIRECTORY_SEPARATOR . 'ThirdParty' . DIRECTORY_SEPARATOR;
$component_path = $third_party_path . $this->Vendor . DIRECTORY_SEPARATOR . $this->PackageName . DIRECTORY_SEPARATOR;
$component_path = $third_party_path . $this->vendor . DIRECTORY_SEPARATOR . $this->package_name . DIRECTORY_SEPARATOR;
if(!file_exists($component_path . 'VERSION'))
{
throw new ComponentVersionNotFoundException('The file \'' . $component_path . 'VERSION' . '\' does not exist');
}
return IO::fread($component_path . 'VERSION');
}
@ -74,27 +74,31 @@
public function toArray(): array
{
return [
'vendor' => $this->Vendor,
'package_name' => $this->PackageName
'vendor' => $this->vendor,
'package_name' => $this->package_name
];
}
/**
* Constructs object from an array representation
* Constructs an object from an array representation
*
* @param array $data
* @return Component
*/
public static function fromArray(array $data): Component
{
$ComponentObject = new Component();
$object = new self();
if(isset($data['vendor']))
$ComponentObject->Vendor = $data['vendor'];
{
$object->vendor = $data['vendor'];
}
if(isset($data['package_name']))
$ComponentObject->PackageName = $data['package_name'];
{
$object->package_name = $data['package_name'];
}
return $ComponentObject;
return $object;
}
}

View file

@ -209,7 +209,7 @@
{
foreach($this->ExecutionUnits as $unit)
{
if($unit->ExecutionPolicy->Name == $name)
if($unit->execution_policy->Name == $name)
return $unit;
}

View file

@ -1,24 +1,24 @@
<?php
/*
* Copyright (c) Nosial 2022-2023, all rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
* associated documentation files (the "Software"), to deal in the Software without restriction, including without
* limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
* Software, and to permit persons to whom the Software is furnished to do so, subject to the following
* conditions:
*
* The above copyright notice and this permission notice shall be included in all copies or substantial portions
* of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
* PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*
*/
/*
* Copyright (c) Nosial 2022-2023, all rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
* associated documentation files (the "Software"), to deal in the Software without restriction, including without
* limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
* Software, and to permit persons to whom the Software is furnished to do so, subject to the following
* conditions:
*
* The above copyright notice and this permission notice shall be included in all copies or substantial portions
* of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
* PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*
*/
/** @noinspection PhpMissingFieldTypeInspection */
@ -33,21 +33,21 @@
*
* @var string
*/
public $Name;
public $name;
/**
* Flags associated with the component created by the compiler extension
*
* @var array
*/
public $Flags;
public $flags;
/**
* The data type of the component
*
* @var string
*/
public $DataType;
public $data_types;
/**
* A sha1 hash checksum of the component, this will be compared against the data to determine
@ -55,14 +55,14 @@
*
* @var string
*/
private $Checksum;
private $checksum;
/**
* The raw data of the component, this is to be processed by the compiler extension
*
* @var mixed
*/
public $Data;
public $data;
/**
* Validates the checksum of the component, returns false if the checksum or data is invalid or if the checksum
@ -70,16 +70,22 @@
*
* @return bool
*/
public function validateChecksum(): bool
public function validate_checksum(): bool
{
if($this->Checksum === null)
if($this->checksum === null)
{
return true; // Return true if the checksum is empty
}
if($this->Data === null)
if($this->data === null)
{
return true; // Return true if the data is null
}
if(hash('sha1', $this->Data, true) !== $this->Checksum)
if(hash('sha1', $this->data, true) !== $this->checksum)
{
return false; // Return false if the checksum failed
}
return true;
}
@ -91,11 +97,11 @@
*/
public function updateChecksum(): void
{
$this->Checksum = null;
$this->checksum = null;
if(gettype($this->Data) == 'string')
if(is_string($this->data))
{
$this->Checksum = hash('sha1', $this->Data, true);
$this->checksum = hash('sha1', $this->data, true);
}
}
@ -108,11 +114,11 @@
public function toArray(bool $bytecode=false): array
{
return [
($bytecode ? Functions::cbc('name') : 'name') => $this->Name,
($bytecode ? Functions::cbc('flags') : 'flags') => $this->Flags,
($bytecode ? Functions::cbc('data_type') : 'data_type') => $this->DataType,
($bytecode ? Functions::cbc('checksum') : 'checksum') => $this->Checksum,
($bytecode ? Functions::cbc('data') : 'data') => $this->Data,
($bytecode ? Functions::cbc('name') : 'name') => $this->name,
($bytecode ? Functions::cbc('flags') : 'flags') => $this->flags,
($bytecode ? Functions::cbc('data_type') : 'data_type') => $this->data_types,
($bytecode ? Functions::cbc('checksum') : 'checksum') => $this->checksum,
($bytecode ? Functions::cbc('data') : 'data') => $this->data,
];
}
@ -126,11 +132,11 @@
{
$Object = new self();
$Object->Name = Functions::array_bc($data, 'name');
$Object->Flags = Functions::array_bc($data, 'flags');
$Object->DataType = Functions::array_bc($data, 'data_type');
$Object->Checksum = Functions::array_bc($data, 'checksum');
$Object->Data = Functions::array_bc($data, 'data');
$Object->name = Functions::array_bc($data, 'name');
$Object->flags = Functions::array_bc($data, 'flags');
$Object->data_types = Functions::array_bc($data, 'data_type');
$Object->checksum = Functions::array_bc($data, 'checksum');
$Object->data = Functions::array_bc($data, 'data');
return $Object;
}

View file

@ -32,14 +32,14 @@
/**
* @var string|null
*/
private $ID;
private $id;
/**
* The execution policy for this execution unit
*
* @var ExecutionPolicy
*/
public $ExecutionPolicy;
public $execution_policy;
/**
* The data of the unit to execute
@ -57,7 +57,7 @@
public function toArray(bool $bytecode=false): array
{
return [
($bytecode ? Functions::cbc('execution_policy') : 'execution_policy') => $this->ExecutionPolicy->toArray($bytecode),
($bytecode ? Functions::cbc('execution_policy') : 'execution_policy') => $this->execution_policy->toArray($bytecode),
($bytecode ? Functions::cbc('data') : 'data') => $this->Data,
];
}
@ -72,11 +72,11 @@
{
$object = new self();
$object->ExecutionPolicy = Functions::array_bc($data, 'execution_policy');
$object->execution_policy = Functions::array_bc($data, 'execution_policy');
$object->Data = Functions::array_bc($data, 'data');
if($object->ExecutionPolicy !== null)
$object->ExecutionPolicy = ExecutionPolicy::fromArray($object->ExecutionPolicy);
if($object->execution_policy !== null)
$object->execution_policy = ExecutionPolicy::fromArray($object->execution_policy);
return $object;
}
@ -84,11 +84,11 @@
/**
* @return string
*/
public function getID(): string
public function getId(): string
{
if($this->ID == null)
$this->ID = hash('sha1', $this->ExecutionPolicy->Name);
return $this->ID;
if($this->id == null)
$this->id = hash('sha1', $this->execution_policy->Name);
return $this->id;
}
}

View file

@ -24,60 +24,59 @@
namespace ncc\Objects;
use InvalidArgumentException;
use ncc\Enums\RegexPatterns;
class RemotePackageInput
{
/**
* @var string|null
* @var string
*/
public $Vendor;
public $vendor;
/**
* @var string
*/
public $package;
/**
* @var string|null
*/
public $Package;
public $version;
/**
* @var string|null
*/
public $Version;
public $branch;
/**
* @var string|null
* @var string
*/
public $Branch;
/**
* @var string|null
*/
public $Source;
public $source;
/**
* Public Constructor & String Parser
*
* @param string|null $input
*/
public function __construct(?string $input=null)
public function __construct(?string $input = null)
{
if($input !== null && preg_match(RegexPatterns::REMOTE_PACKAGE, $input, $matches))
if ($input !== null && preg_match(RegexPatterns::REMOTE_PACKAGE, $input, $matches))
{
$this->Vendor = $matches['vendor'];
$this->Package = $matches['package'];
$this->Version = $matches['version'];
$this->Branch = $matches['branch'];
$this->Source = $matches['source'];
if ($matches['source'] === null || $matches['package'] === null || $matches['vendor'] === null)
{
throw new InvalidArgumentException('Package, version, and source are required.');
}
if(strlen($this->Vendor) == 0)
$this->Vendor = null;
if(strlen($this->Package) == 0)
$this->Package = null;
if(strlen($this->Version) == 0)
$this->Version = null;
if(strlen($this->Branch) == 0)
$this->Branch = null;
if(strlen($this->Source) == 0)
$this->Source = null;
$this->vendor = $matches['vendor'];
$this->package = $matches['package'];
$this->source = $matches['source'];
$this->version = empty($matches['version']) ? null : $matches['version'];
$this->branch = empty($matches['branch']) ? null : $matches['branch'];
}
else
{
throw new InvalidArgumentException('Input does not match the expected pattern.');
}
}
@ -88,19 +87,27 @@
*/
public function toString(): string
{
if($this->Vendor == null || $this->Package == null)
if($this->vendor === null || $this->package === null)
{
return '';
}
$results = $this->Vendor . '/' . $this->Package;
$results = $this->vendor . '/' . $this->package;
if($this->Version !== null)
$results .= '=' . $this->Version;
if($this->Branch !== null)
$results .= ':' . $this->Branch;
if($this->Source !== null)
$results .= '@' . $this->Source;
if($this->version !== null)
{
$results .= '=' . $this->version;
}
if($this->branch !== null)
{
$results .= ':' . $this->branch;
}
if($this->source !== null)
{
$results .= '@' . $this->source;
}
return $results;
}
@ -114,7 +121,10 @@
public function toStandard(bool $version=true): string
{
if($version)
return str_replace('-', '_', sprintf('com.%s.%s=%s', $this->Vendor, $this->Package, $this->Version));
return str_replace('-', '_', sprintf('com.%s.%s', $this->Vendor, $this->Package));
{
return str_replace('-', '_', sprintf('com.%s.%s=%s', $this->vendor, $this->package, $this->version));
}
return str_replace('-', '_', sprintf('com.%s.%s', $this->vendor, $this->package));
}
}

View file

@ -1,28 +1,29 @@
<?php
/*
* Copyright (c) Nosial 2022-2023, all rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
* associated documentation files (the "Software"), to deal in the Software without restriction, including without
* limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
* Software, and to permit persons to whom the Software is furnished to do so, subject to the following
* conditions:
*
* The above copyright notice and this permission notice shall be included in all copies or substantial portions
* of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
* PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*
*/
/*
* Copyright (c) Nosial 2022-2023, all rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
* associated documentation files (the "Software"), to deal in the Software without restriction, including without
* limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
* Software, and to permit persons to whom the Software is furnished to do so, subject to the following
* conditions:
*
* The above copyright notice and this permission notice shall be included in all copies or substantial portions
* of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
* PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*
*/
namespace ncc\Utilities;
namespace ncc\Utilities;
use Exception;
use JsonException;
use ncc\Enums\AuthenticationType;
use ncc\Enums\DefinedRemoteSourceType;
use ncc\Enums\HttpRequestType;
@ -41,12 +42,11 @@ namespace ncc\Utilities;
use ncc\Exceptions\AccessDeniedException;
use ncc\Exceptions\ArchiveException;
use ncc\Exceptions\AuthenticationException;
use ncc\Exceptions\FileNotFoundException;
use ncc\Exceptions\GitlabServiceException;
use ncc\Exceptions\HttpException;
use ncc\Exceptions\InvalidScopeException;
use ncc\Exceptions\IOException;
use ncc\Exceptions\MalformedJsonException;
use ncc\Exceptions\PathNotFoundException;
use ncc\Exceptions\RunnerExecutionException;
use ncc\Exceptions\UnsupportedArchiveException;
use ncc\Managers\ConfigurationManager;
@ -62,7 +62,6 @@ namespace ncc\Utilities;
use ncc\Objects\RepositoryQueryResults;
use ncc\Objects\RepositoryQueryResults\Files;
use ncc\Objects\Vault\Entry;
use ncc\Runtime;
use ncc\ThirdParty\jelix\Version\Parser;
use ncc\ThirdParty\jelix\Version\VersionComparator;
use ncc\ThirdParty\Symfony\Filesystem\Filesystem;
@ -70,6 +69,7 @@ namespace ncc\Utilities;
use ncc\ThirdParty\Symfony\Process\Process;
use RecursiveDirectoryIterator;
use RecursiveIteratorIterator;
use RuntimeException;
use Throwable;
/**
@ -78,10 +78,19 @@ namespace ncc\Utilities;
*/
class Functions
{
/**
* Forces the output to be an array
*/
public const FORCE_ARRAY = 0b0001;
/**
* Forces the output to be pretty
*/
public const PRETTY = 0b0010;
/**
* Escapes unicode characters
*/
public const ESCAPE_UNICODE = 0b0100;
/**
@ -92,11 +101,7 @@ namespace ncc\Utilities;
*/
public static function cbc(string $input): string
{
$cache = RuntimeCache::get("cbc_$input");
if($cache !== null)
return $cache;
return RuntimeCache::set("cbc_$input", hash('crc32', $input, true));
return RuntimeCache::get("cbc_$input") ?? RuntimeCache::set("cbc_$input", hash('crc32', $input, true));
}
/**
@ -106,17 +111,10 @@ namespace ncc\Utilities;
* @param array $data
* @param string $select
* @return mixed|null
* @noinspection PhpMissingReturnTypeInspection
*/
public static function array_bc(array $data, string $select)
public static function array_bc(array $data, string $select): mixed
{
if(isset($data[$select]))
return $data[$select];
if(isset($data[self::cbc($select)]))
return $data[self::cbc($select)];
return null;
return $data[$select] ?? $data[self::cbc($select)] ?? null;
}
/**
@ -126,16 +124,15 @@ namespace ncc\Utilities;
* @param int $flags
* @return mixed
* @throws AccessDeniedException
* @throws FileNotFoundException
* @throws IOException
* @throws MalformedJsonException
* @noinspection PhpMissingReturnTypeInspection
* @throws PathNotFoundException
*/
public static function loadJsonFile(string $path, int $flags=0)
public static function loadJsonFile(string $path, int $flags=0): mixed
{
if(!file_exists($path))
{
throw new FileNotFoundException($path);
throw new PathNotFoundException($path);
}
return self::loadJson(IO::fread($path), $flags);
@ -148,19 +145,17 @@ namespace ncc\Utilities;
* @param int $flags
* @return mixed
* @throws MalformedJsonException
* @noinspection PhpMissingReturnTypeInspection
*/
public static function loadJson(string $json, int $flags=0)
public static function loadJson(string $json, int $flags=0): mixed
{
$forceArray = (bool) ($flags & self::FORCE_ARRAY);
$json_decoded = json_decode($json, $forceArray, 512, JSON_BIGINT_AS_STRING);
if($json_decoded == null && json_last_error() !== JSON_ERROR_NONE)
try
{
throw new MalformedJsonException(json_last_error_msg() . ' (' . json_last_error() . ')');
return json_decode($json, ($flags & self::FORCE_ARRAY), 512, JSON_THROW_ON_ERROR | JSON_BIGINT_AS_STRING);
}
catch(Throwable $e)
{
throw new MalformedJsonException($e->getMessage(), $e);
}
return $json_decoded;
}
/**
@ -170,39 +165,41 @@ namespace ncc\Utilities;
* @param int $flags
* @return string
* @throws MalformedJsonException
* @noinspection PhpMissingParamTypeInspection
* @noinspection PhpUnusedLocalVariableInspection
*/
public static function encodeJson($value, int $flags=0): string
public static function encodeJson(mixed $value, int $flags=0): string
{
$flags = ($flags & self::ESCAPE_UNICODE ? 0 : JSON_UNESCAPED_UNICODE)
| JSON_UNESCAPED_SLASHES
| ($flags & self::PRETTY ? JSON_PRETTY_PRINT : 0)
| (defined('JSON_PRESERVE_ZERO_FRACTION') ? JSON_PRESERVE_ZERO_FRACTION : 0); // since PHP 5.6.6 & PECL JSON-C 1.3.7
$json = json_encode($value, $flags);
if ($error = json_last_error())
try
{
throw new MalformedJsonException(json_last_error_msg() . ' (' . json_last_error() . ')');
return json_encode($value, JSON_THROW_ON_ERROR | $flags);
}
catch (JsonException $e)
{
throw new MalformedJsonException($e->getMessage(), $e);
}
return $json;
}
/**
* Writes a json file to disk
*
* @param $value
* @param mixed $value
* @param string $path
* @param int $flags
* @return void
* @throws MalformedJsonException
*/
public static function encodeJsonFile($value, string $path, int $flags=0): void
public static function encodeJsonFile(mixed $value, string $path, int $flags=0): void
{
file_put_contents($path, self::encodeJson($value, $flags));
}
/**
* Returns the current working directory
*
* @param CliHelpSection[] $input
* @return int
*/
@ -235,7 +232,6 @@ namespace ncc\Utilities;
* @param bool $basic_ascii
* @return string
* @throws AccessDeniedException
* @throws FileNotFoundException
* @throws IOException
*/
public static function getBanner(string $version, string $copyright, bool $basic_ascii=false): string
@ -253,10 +249,7 @@ namespace ncc\Utilities;
$banner_copyright = str_pad($copyright, 30);
$banner = str_ireplace('%A', $banner_version, $banner);
/** @noinspection PhpUnnecessaryLocalVariableInspection */
$banner = str_ireplace('%B', $banner_copyright, $banner);
return $banner;
return str_ireplace('%B', $banner_copyright, $banner);
}
/**
@ -264,23 +257,25 @@ namespace ncc\Utilities;
* current working directory, optionally accepts a different basename using the $basename parameter.
*
* @param string $path
* @param string|null $basename
* @param string|null $base_name
* @return string
*/
public static function removeBasename(string $path, ?string $basename=null): string
public static function removeBasename(string $path, ?string $base_name=null): string
{
if($basename == null)
$basename = getcwd();
if($base_name === null)
{
$base_name = getcwd();
}
// Append the trailing slash if it's not already there
// "/etc/foo" becomes "/etc/foo/"
if(substr($basename, -1) !== DIRECTORY_SEPARATOR)
if(substr($base_name, -1) !== DIRECTORY_SEPARATOR)
{
$basename .= DIRECTORY_SEPARATOR;
$base_name .= DIRECTORY_SEPARATOR;
}
// If the path is "/etc/foo/text.txt" and the basename is "/etc" then the returned path will be "foo/test.txt"
return str_replace($basename, (string)null, $path);
return str_replace($base_name, (string)null, $path);
}
/**
@ -300,20 +295,21 @@ namespace ncc\Utilities;
* @param ExecutionPolicy $policy
* @return ExecutionUnit
* @throws AccessDeniedException
* @throws FileNotFoundException
* @throws IOException
* @throws PathNotFoundException
* @throws RunnerExecutionException
*/
public static function compileRunner(string $path, ExecutionPolicy $policy): ExecutionUnit
{
return match (strtolower($policy->Runner)) {
return match (strtolower($policy->Runner))
{
Runners::BASH => BashRunner::processUnit($path, $policy),
Runners::PHP => PhpRunner::processUnit($path, $policy),
Runners::PERL => PerlRunner::processUnit($path, $policy),
Runners::PYTHON => PythonRunner::processUnit($path, $policy),
Runners::PYTHON_2 => Python2Runner::processUnit($path, $policy),
Runners::PYTHON_3 => Python3Runner::processUnit($path, $policy),
Runners::lua => LuaRunner::processUnit($path, $policy),
Runners::LUA => LuaRunner::processUnit($path, $policy),
default => throw new RunnerExecutionException('The runner \'' . $policy->Runner . '\' is not supported'),
};
}
@ -354,7 +350,7 @@ namespace ncc\Utilities;
{
$size = array('B','kB','MB','GB','TB','PB','EB','ZB','YB');
$factor = floor((strlen($bytes) - 1) / 3);
return sprintf("%.{$decimals}f", $bytes / pow(1024, $factor)) . @$size[$factor];
return sprintf("%.{$decimals}f", $bytes / (1024 ** $factor)) . @$size[$factor];
}
/**
@ -362,12 +358,14 @@ namespace ncc\Utilities;
*
* @return void
* @throws AccessDeniedException
* @throws InvalidScopeException
* @noinspection PhpRedundantOptionalArgumentInspection
*/
public static function initializeFiles(): void
{
if(Resolver::resolveScope() !== Scopes::SYSTEM)
{
throw new AccessDeniedException('Cannot initialize NCC files, insufficient permissions');
}
Console::outVerbose('Initializing NCC files');
@ -381,21 +379,18 @@ namespace ncc\Utilities;
if(!$filesystem->exists(PathFinder::getCachePath(Scopes::SYSTEM)))
{
Console::outDebug(sprintf('Initializing %s', PathFinder::getCachePath(Scopes::SYSTEM)));
/** @noinspection PhpRedundantOptionalArgumentInspection */
$filesystem->mkdir(PathFinder::getCachePath(Scopes::SYSTEM), 0777);
}
if(!$filesystem->exists(PathFinder::getRunnerPath(Scopes::SYSTEM)))
{
Console::outDebug(sprintf('Initializing %s', PathFinder::getRunnerPath(Scopes::SYSTEM)));
/** @noinspection PhpRedundantOptionalArgumentInspection */
$filesystem->mkdir(PathFinder::getRunnerPath(Scopes::SYSTEM), 0755);
}
if(!$filesystem->exists(PathFinder::getPackagesPath(Scopes::SYSTEM)))
{
Console::outDebug(sprintf('Initializing %s', PathFinder::getPackagesPath(Scopes::SYSTEM)));
/** @noinspection PhpRedundantOptionalArgumentInspection */
$filesystem->mkdir(PathFinder::getPackagesPath(Scopes::SYSTEM), 0755);
}
@ -430,14 +425,21 @@ namespace ncc\Utilities;
* @param string $path
* @return ComposerJson
* @throws AccessDeniedException
* @throws FileNotFoundException
* @throws IOException
* @noinspection PhpUnused
* @throws MalformedJsonException
*/
public static function loadComposerJson(string $path): ComposerJson
{
$json_contents = IO::fread($path);
return ComposerJson::fromArray(json_decode($json_contents, true));
try
{
return ComposerJson::fromArray(json_decode($json_contents, true, 512, JSON_THROW_ON_ERROR));
}
catch(JsonException $e)
{
throw new MalformedJsonException('Cannot parse composer.json, ' . $e->getMessage(), $e);
}
}
/**
@ -449,7 +451,10 @@ namespace ncc\Utilities;
public static function cbool($value): bool
{
if(is_null($value))
{
return false;
}
if(is_string($value))
{
switch(strtolower($value))
@ -470,15 +475,6 @@ namespace ncc\Utilities;
}
}
if(is_int($value))
{
if ($value == 0)
return false;
if ($value == 1)
return true;
return false;
}
return (bool)$value;
}
@ -491,8 +487,7 @@ namespace ncc\Utilities;
*/
public static function getConfigurationProperty(string $property)
{
$config_manager = new ConfigurationManager();
return $config_manager->getProperty($property);
return (new ConfigurationManager())->getProperty($property);
}
/**
@ -504,9 +499,10 @@ namespace ncc\Utilities;
*/
public static function parseVersion(string $version): string
{
/** @noinspection PhpStrFunctionsInspection */
if(substr($version, 0, 1) === 'v')
if(str_starts_with(strtolower($version), 'v'))
{
$version = substr($version, 1);
}
return Parser::parse($version)->toString();
}
@ -517,16 +513,25 @@ namespace ncc\Utilities;
* @param int $length
* @return string
*/
public static function randomString(int $length = 32): string
public static function randomString(int $length=32): string
{
$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$charactersLength = strlen($characters);
$randomString = '';
for ($i = 0; $i < $length; $i++)
$characters_length = strlen($characters);
$random_string = '';
for($i = 0; $i < $length; $i++)
{
$randomString .= $characters[rand(0, $charactersLength - 1)];
try
{
$random_string .= $characters[random_int(0, $characters_length - 1)];
}
catch (Exception $e)
{
throw new RuntimeException('Cannot generate random string, ' . $e->getMessage(), $e->getCode(), $e);
}
}
return $randomString;
return $random_string;
}
/**
@ -535,42 +540,49 @@ namespace ncc\Utilities;
* @param bool $create
* @param bool $set_as_tmp
* @return string
* @throws InvalidScopeException
*/
public static function getTmpDir(bool $create=true, bool $set_as_tmp=true): string
{
$path = PathFinder::getCachePath() . DIRECTORY_SEPARATOR . self::randomString(16);
if($create)
{
$filesystem = new Filesystem();
/** @noinspection PhpRedundantOptionalArgumentInspection */
$filesystem->mkdir($path, 0777);
}
if($set_as_tmp)
{
RuntimeCache::setFileAsTemporary($path);
}
return $path;
}
/**
* Applies the authentication to the given HTTP request.
*
* @param HttpRequest $httpRequest
* @param HttpRequest $http_request
* @param Entry|null $entry
* @param bool $expect_json
* @return HttpRequest
* @throws AuthenticationException
* @throws GitlabServiceException
*/
public static function prepareGitServiceRequest(HttpRequest $httpRequest, ?Entry $entry=null, bool $expect_json=true): HttpRequest
public static function prepareGitServiceRequest(HttpRequest $http_request, ?Entry $entry=null, bool $expect_json=true): HttpRequest
{
if($entry !== null)
{
if (!$entry->isCurrentlyDecrypted())
if(!$entry->isCurrentlyDecrypted())
{
throw new GitlabServiceException('The given Vault entry is not decrypted.');
}
switch ($entry->getPassword()->getAuthenticationType()) {
switch ($entry->getPassword()?->getAuthenticationType())
{
case AuthenticationType::ACCESS_TOKEN:
$httpRequest->Headers[] = "Authorization: Bearer " . $entry->getPassword();
$http_request->Headers[] = "Authorization: Bearer " . $entry->getPassword();
break;
case AuthenticationType::USERNAME_PASSWORD:
@ -580,11 +592,11 @@ namespace ncc\Utilities;
if($expect_json)
{
$httpRequest->Headers[] = "Accept: application/json";
$httpRequest->Headers[] = "Content-Type: application/json";
$http_request->Headers[] = "Accept: application/json";
$http_request->Headers[] = "Content-Type: application/json";
}
return $httpRequest;
return $http_request;
}
/**
@ -595,23 +607,23 @@ namespace ncc\Utilities;
* @return string
* @throws AuthenticationException
* @throws GitlabServiceException
* @throws InvalidScopeException
* @throws HttpException
*/
public static function downloadGitServiceFile(string $url, ?Entry $entry=null): string
{
if(RuntimeCache::get('download_cache.' . $url) !== null)
{
return RuntimeCache::get('download_cache.' . $url);
}
$out_path = Functions::getTmpDir() . "/" . basename($url);
$httpRequest = new HttpRequest();
$httpRequest->Url = $url;
$httpRequest->Type = HttpRequestType::GET;
$httpRequest = Functions::prepareGitServiceRequest($httpRequest, $entry, false);
$out_path = self::getTmpDir() . "/" . basename($url);
$http_request = new HttpRequest();
$http_request->Url = $url;
$http_request->Type = HttpRequestType::GET;
$http_request = self::prepareGitServiceRequest($http_request, $entry, false);
Console::out('Downloading file ' . $url);
HttpClient::download($httpRequest, $out_path);
HttpClient::download($http_request, $out_path);
RuntimeCache::set('download_cache.' . $url, $out_path);
return $out_path;
@ -632,7 +644,9 @@ namespace ncc\Utilities;
$filesystem = new Filesystem();
if(!$filesystem->exists($out_path))
{
$filesystem->mkdir($out_path);
}
RuntimeCache::setFileAsTemporary($out_path);
@ -651,13 +665,10 @@ namespace ncc\Utilities;
'multipart/x-zip'
]);
}
else
elseif(RuntimeCache::get('warning_zip_shown') !== true)
{
if(RuntimeCache::get('warning_zip_shown') !== true)
{
Console::out('unzip executable not found. ZIP archives will not be supported.');
RuntimeCache::set('warning_zip_shown', true);
}
Console::out('unzip executable not found. ZIP archives will not be supported.');
RuntimeCache::set('warning_zip_shown', true);
}
if($tar_executable !== null)
@ -669,17 +680,16 @@ namespace ncc\Utilities;
'application/x-xz'
]);
}
else
elseif(RuntimeCache::get('warning_tar_shown') !== true)
{
if(RuntimeCache::get('warning_tar_shown') !== true)
{
Console::outWarning('tar executable not found. TAR archives will not be supported.');
RuntimeCache::set('warning_tar_shown', true);
}
Console::outWarning('tar executable not found. TAR archives will not be supported.');
RuntimeCache::set('warning_tar_shown', true);
}
if (!in_array($mimeType, $supportedTypes))
if(!in_array($mimeType, $supportedTypes, true))
{
throw new UnsupportedArchiveException("Unsupported archive type: $mimeType");
}
$command = match ($mimeType) {
'application/zip' => [$unzip_executable, $path, '-d', $out_path],
@ -693,12 +703,15 @@ namespace ncc\Utilities;
$process = new Process($command);
// display the output of the command
$process->run(function ($type, $buffer) {
$process->run(function ($type, $buffer)
{
Console::outVerbose($buffer);
});
if (!$process->isSuccessful())
if(!$process->isSuccessful())
{
throw new ArchiveException($process->getErrorOutput());
}
return $out_path;
}
@ -712,15 +725,19 @@ namespace ncc\Utilities;
*/
public static function searchDirectory(string $path, array $files): ?string
{
if (!is_dir($path))
if(!is_dir($path))
{
return null;
}
// Search files in the given directory recursively
$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path));
foreach ($iterator as $file)
{
if (in_array($file->getFilename(), $files))
if(in_array($file->getFilename(), $files, true))
{
return $file->getPathname();
}
}
return null;
@ -734,8 +751,11 @@ namespace ncc\Utilities;
*/
public static function convertToSemVer($version): string
{
if(stripos($version, 'v') === 0)
if(stripos(strtolower($version), 'v') === 0)
{
$version = substr($version, 1);
}
if(!Validate::version($version))
{
$parts = explode('.', $version);
@ -744,17 +764,28 @@ namespace ncc\Utilities;
$patch = (string)null;
if(count($parts) >= 1)
{
$major = $parts[0];
}
if(count($parts) >= 2)
{
$minor = $parts[1];
}
if(count($parts) >= 3)
{
$patch = $parts[2];
}
// Assemble the SemVer compatible string
$version = "$major.$minor.$patch";
}
if(!Validate::version($version))
{
return '1.0.0';
}
return $version;
}
@ -803,8 +834,11 @@ namespace ncc\Utilities;
$results->ReleaseName = ($release_results->ReleaseName ?? null);
$results->ReleaseDescription = ($release_results->ReleaseDescription ?? null);
$results->Files = self::mergeFilesResults($release_results->Files, ($results->Files ?? null));
if($release_results->Version !== null)
{
$results->Version = $release_results->Version;
}
}
try
@ -819,27 +853,31 @@ namespace ncc\Utilities;
if($git_results !== null)
{
if($results->ReleaseName == null)
if($results->ReleaseName === null)
{
$results->ReleaseName = ($git_results->ReleaseName ?? null);
}
elseif($git_results->ReleaseName !== null)
{
if(strlen($git_results->ReleaseName) > strlen($results->ReleaseName))
{
$results->ReleaseName = $git_results->ReleaseName;
}
}
if($results->ReleaseDescription == null)
if($results->ReleaseDescription === null)
{
$results->ReleaseDescription = ($git_results->ReleaseDescription ?? null);
}
elseif($git_results->ReleaseDescription !== null)
{
if(strlen($git_results->ReleaseDescription) > strlen($results->ReleaseDescription))
{
$results->ReleaseDescription = $git_results->ReleaseDescription;
}
}
if($results->Version == null)
if($results->Version === null)
{
$results->Version = ($git_results->Version ?? null);
}
@ -847,7 +885,9 @@ namespace ncc\Utilities;
{
// Version compare
if(VersionComparator::compareVersion($git_results->Version, $results->Version) > 0)
{
$results->Version = $git_results->Version;
}
}
$results->Files = self::mergeFilesResults($git_results->Files, ($results->Files ?? null));
@ -865,27 +905,31 @@ namespace ncc\Utilities;
if($ncc_package_results !== null)
{
if($results->ReleaseName == null)
if($results->ReleaseName === null)
{
$results->ReleaseName = ($ncc_package_results->ReleaseName ?? null);
}
elseif($ncc_package_results->ReleaseName !== null)
{
if(strlen($ncc_package_results->ReleaseName) > strlen($results->ReleaseName))
{
$results->ReleaseName = $ncc_package_results->ReleaseName;
}
}
if($results->ReleaseDescription == null)
if($results->ReleaseDescription === null)
{
$results->ReleaseDescription = ($ncc_package_results->ReleaseDescription ?? null);
}
elseif($ncc_package_results->ReleaseDescription !== null)
{
if(strlen($ncc_package_results->ReleaseDescription) > strlen($results->ReleaseDescription))
{
$results->ReleaseDescription = $ncc_package_results->ReleaseDescription;
}
}
if($results->Version == null)
if($results->Version === null)
{
$results->Version = ($ncc_package_results->Version ?? null);
}
@ -893,7 +937,9 @@ namespace ncc\Utilities;
{
// Version compare
if(VersionComparator::compareVersion($ncc_package_results->Version, $results->Version) > 0)
{
$results->Version = $ncc_package_results->Version;
}
}
$results->Files = self::mergeFilesResults($ncc_package_results->Files, ($results->Files ?? null));
@ -903,7 +949,7 @@ namespace ncc\Utilities;
}
/**
* Merges the given Files object with another Files object
* Merges the given Files an object with another Files object
*
* @param Files $input
* @param Files|null $selected
@ -911,26 +957,40 @@ namespace ncc\Utilities;
*/
private static function mergeFilesResults(RepositoryQueryResults\Files $input, ?RepositoryQueryResults\Files $selected=null): RepositoryQueryResults\Files
{
if($selected == null)
if($selected === null)
{
$selected = new RepositoryQueryResults\Files();
}
if($input->GitSshUrl !== null)
{
$selected->GitSshUrl = $input->GitSshUrl;
}
if($input->GitHttpUrl !== null)
{
$selected->GitHttpUrl = $input->GitHttpUrl;
}
if($input->SourceUrl !== null)
{
$selected->SourceUrl = $input->SourceUrl;
}
if($input->TarballUrl !== null)
{
$selected->TarballUrl = $input->TarballUrl;
}
if($input->ZipballUrl !== null)
{
$selected->ZipballUrl = $input->ZipballUrl;
}
if($input->PackageUrl !== null)
{
$selected->PackageUrl = $input->PackageUrl;
}
return $selected;
}
@ -946,10 +1006,14 @@ namespace ncc\Utilities;
if (is_numeric($input))
{
if (str_contains($input, '.'))
{
return (float)$input;
}
if (ctype_digit($input))
{
return (int)$input;
}
}
elseif (in_array(strtolower($input), ['true', 'false']))
{
@ -963,12 +1027,13 @@ namespace ncc\Utilities;
* Finalizes the permissions
*
* @return void
* @throws InvalidScopeException
*/
public static function finalizePermissions(): void
{
if(Resolver::resolveScope() !== Scopes::SYSTEM)
{
return;
}
Console::outVerbose('Finalizing permissions...');
$filesystem = new Filesystem();
@ -976,7 +1041,9 @@ namespace ncc\Utilities;
try
{
if($filesystem->exists(PathFinder::getDataPath(Scopes::SYSTEM)))
{
$filesystem->chmod(PathFinder::getDataPath(Scopes::SYSTEM), 0777, 0000, true);
}
}
catch(Exception $e)
{
@ -986,7 +1053,9 @@ namespace ncc\Utilities;
try
{
if($filesystem->exists(PathFinder::getCachePath(Scopes::SYSTEM)))
{
$filesystem->chmod(PathFinder::getCachePath(Scopes::SYSTEM), 0777, 0000, true);
}
}
catch(Exception $e)
{
@ -1003,10 +1072,14 @@ namespace ncc\Utilities;
public static function isTtyMode(): bool
{
if(!is_null(RuntimeCache::get('posix_isatty')))
{
return RuntimeCache::get('posix_isatty');
}
if(function_exists('posix_isatty') === false)
{
return false;
}
RuntimeCache::set('posix_isatty', posix_isatty(STDOUT));
return (bool)RuntimeCache::get('posix_isatty');

View file

@ -1,30 +1,30 @@
<?php
/*
* Copyright (c) Nosial 2022-2023, all rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
* associated documentation files (the "Software"), to deal in the Software without restriction, including without
* limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
* Software, and to permit persons to whom the Software is furnished to do so, subject to the following
* conditions:
*
* The above copyright notice and this permission notice shall be included in all copies or substantial portions
* of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
* PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*
*/
/*
* Copyright (c) Nosial 2022-2023, all rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
* associated documentation files (the "Software"), to deal in the Software without restriction, including without
* limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
* Software, and to permit persons to whom the Software is furnished to do so, subject to the following
* conditions:
*
* The above copyright notice and this permission notice shall be included in all copies or substantial portions
* of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
* PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*
*/
namespace ncc\Utilities;
namespace ncc\Utilities;
use ncc\Exceptions\AccessDeniedException;
use ncc\Exceptions\FileNotFoundException;
use ncc\Exceptions\IOException;
use ncc\Exceptions\PathNotFoundException;
use SplFileInfo;
use SplFileObject;
@ -50,21 +50,25 @@ namespace ncc\Utilities;
}
Console::outDebug(sprintf('writing %s of data to %s', Functions::b2u(strlen($data)), $uri));
$file = new SplFileObject($uri, $mode);
if (!$file->flock(LOCK_EX | LOCK_NB))
{
throw new IOException(sprintf('Unable to obtain lock on file: (%s)', $uri));
}
elseif (!$file->fwrite($data))
if (!$file->fwrite($data))
{
throw new IOException(sprintf('Unable to write content to file: (%s)... to (%s)', substr($data,0,25), $uri));
}
elseif (!$file->flock(LOCK_UN))
if (!$file->flock(LOCK_UN))
{
throw new IOException(sprintf('Unable to remove lock on file: (%s)', $uri));
}
elseif (!@chmod($uri, $perms))
if (!@chmod($uri, $perms))
{
throw new IOException(sprintf('Unable to chmod: (%s) to (%s)', $uri, $perms));
}
@ -78,8 +82,8 @@ namespace ncc\Utilities;
* @param int|null $length
* @return string
* @throws AccessDeniedException
* @throws FileNotFoundException
* @throws IOException
* @throws PathNotFoundException
*/
public static function fread(string $uri, string $mode='r', ?int $length=null): string
{
@ -92,21 +96,27 @@ namespace ncc\Utilities;
if(!file_exists($uri))
{
throw new FileNotFoundException(sprintf('Cannot find file %s', $uri));
throw new PathNotFoundException($uri);
}
if(!is_readable($uri))
{
throw new AccessDeniedException(sprintf('Insufficient permissions to read %s', $uri));
throw new AccessDeniedException(sprintf('Unable to read file: (%s)', $uri));
}
$file = new SplFileObject($uri, $mode);
if($length == null)
if($length === null)
{
/** @noinspection CallableParameterUseCaseInTypeContextInspection */
$length = $file->getSize();
if($length === false)
{
throw new IOException(sprintf('Unable to get size of file: (%s)', $uri));
}
}
if($length == 0)
if($length === 0)
{
return (string)null;
}

View file

@ -22,6 +22,7 @@
namespace ncc\Utilities;
use InvalidArgumentException;
use ncc\Enums\Scopes;
use ncc\Exceptions\InvalidPackageNameException;
use ncc\Exceptions\InvalidScopeException;
@ -33,41 +34,21 @@ namespace ncc\Utilities;
/**
* Returns the root path of the system
*
* @param bool $win32
* @return string
*/
public static function getRootPath(bool $win32=false): string
public static function getRootPath(): string
{
if (strtoupper(substr(PHP_OS, 0, 3)) !== 'WIN' && $win32)
return "C:/"; // Emulation for unix only
return realpath(DIRECTORY_SEPARATOR);
}
/**
* Returns the path for where NCC is installed
*
* @return string
*/
public static function getInstallationPath(): string
{
if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN')
{
return realpath(self::getRootPath() . DIRECTORY_SEPARATOR . 'ncc');
}
return realpath(self::getRootPath() . DIRECTORY_SEPARATOR . 'etc' . DIRECTORY_SEPARATOR . 'ncc');
}
/**
* Returns the home directory of the user
*
* @param string $scope
* @param bool $win32
* @return string
* @throws InvalidScopeException
*/
public static function getHomePath(string $scope=Scopes::AUTO, bool $win32=false): string
public static function getHomePath(string $scope=Scopes::AUTO): string
{
$scope = Resolver::resolveScope($scope);
@ -76,17 +57,6 @@ namespace ncc\Utilities;
throw new InvalidScopeException($scope);
}
if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN' || $win32)
{
switch($scope)
{
case Scopes::USER:
return self::getRootPath($win32) . 'ncc' . DIRECTORY_SEPARATOR . 'user_home';
case Scopes::SYSTEM:
return self::getRootPath($win32) . 'ncc' . DIRECTORY_SEPARATOR . 'system_home';
}
}
switch($scope)
{
case Scopes::USER:
@ -104,30 +74,17 @@ namespace ncc\Utilities;
* Returns the path where all NCC installation data is stored
*
* @param string $scope
* @param bool $win32
* @return string
* @throws InvalidScopeException
*/
public static function getDataPath(string $scope=Scopes::AUTO, bool $win32=false): string
public static function getDataPath(string $scope=Scopes::AUTO): string
{
$scope = Resolver::resolveScope($scope);
if(!Validate::scope($scope, false))
{
throw new InvalidScopeException($scope);
throw new InvalidArgumentException(sprintf('Invalid scope "%s"', $scope));
}
if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN' || $win32)
{
switch($scope)
{
case Scopes::USER:
return self::getRootPath($win32) . 'ncc' . DIRECTORY_SEPARATOR . 'user';
case Scopes::SYSTEM:
return self::getRootPath($win32) . 'ncc' . DIRECTORY_SEPARATOR . 'system';
}
}
switch($scope)
{
case Scopes::USER:
@ -138,98 +95,84 @@ namespace ncc\Utilities;
return self::getRootPath() . 'var' . DIRECTORY_SEPARATOR . 'ncc';
}
throw new InvalidScopeException($scope);
throw new InvalidArgumentException(sprintf('Invalid scope "%s"', $scope));
}
/**
* Returns the path where packages are installed
*
* @param string $scope
* @param bool $win32
* @return string
* @throws InvalidScopeException
*/
public static function getPackagesPath(string $scope=Scopes::AUTO, bool $win32=false): string
public static function getPackagesPath(string $scope=Scopes::AUTO): string
{
return self::getDataPath($scope, $win32) . DIRECTORY_SEPARATOR . 'packages';
return self::getDataPath($scope) . DIRECTORY_SEPARATOR . 'packages';
}
/**
* Returns the path where cache files are stored
*
* @param string $scope
* @param bool $win32
* @return string
* @throws InvalidScopeException
*/
public static function getCachePath(string $scope=Scopes::AUTO, bool $win32=false): string
public static function getCachePath(string $scope=Scopes::AUTO): string
{
return self::getDataPath($scope, $win32) . DIRECTORY_SEPARATOR . 'cache';
return self::getDataPath($scope) . DIRECTORY_SEPARATOR . 'cache';
}
/**
* Returns the path where Runner bin files are located and installed
*
* @param string $scope
* @param bool $win32
* @return string
* @throws InvalidScopeException
*/
public static function getRunnerPath(string $scope=Scopes::AUTO, bool $win32=false): string
public static function getRunnerPath(string $scope=Scopes::AUTO): string
{
return self::getDataPath($scope, $win32) . DIRECTORY_SEPARATOR . 'runners';
return self::getDataPath($scope) . DIRECTORY_SEPARATOR . 'runners';
}
/**
* Returns the package lock file
*
* @param string $scope
* @param bool $win32
* @return string
* @throws InvalidScopeException
*/
public static function getPackageLock(string $scope=Scopes::AUTO, bool $win32=false): string
public static function getPackageLock(string $scope=Scopes::AUTO): string
{
return self::getDataPath($scope, $win32) . DIRECTORY_SEPARATOR . 'package.lck';
return self::getDataPath($scope) . DIRECTORY_SEPARATOR . 'package.lck';
}
/**
* @param string $scope
* @param bool $win32
* @return string
* @throws InvalidScopeException
*/
public static function getRemoteSources(string $scope=Scopes::AUTO, bool $win32=false): string
public static function getRemoteSources(string $scope=Scopes::AUTO): string
{
return self::getDataPath($scope, $win32) . DIRECTORY_SEPARATOR . 'sources';
return self::getDataPath($scope) . DIRECTORY_SEPARATOR . 'sources';
}
/**
* @param string $scope
* @param bool $win32
* @return string
* @throws InvalidScopeException
*/
public static function getSymlinkDictionary(string $scope=Scopes::AUTO, bool $win32=false): string
public static function getSymlinkDictionary(string $scope=Scopes::AUTO): string
{
return self::getDataPath($scope, $win32) . DIRECTORY_SEPARATOR . 'symlinks';
return self::getDataPath($scope) . DIRECTORY_SEPARATOR . 'symlinks';
}
/**
* Returns an array of all the package lock files the current user can access (For global-cross referencing)
*
* @param bool $win32
* @return array
* @throws InvalidScopeException
*/
public static function getPackageLockFiles(bool $win32=false): array
public static function getPackageLockFiles(): array
{
$results = [];
$results[] = self::getPackageLock(Scopes::SYSTEM, $win32);
$results[] = self::getPackageLock(Scopes::SYSTEM);
if(!in_array(self::getPackageLock(Scopes::USER, $win32), $results))
if(!in_array(self::getPackageLock(Scopes::USER), $results, true))
{
$results[] = self::getPackageLock(Scopes::USER, $win32);
$results[] = self::getPackageLock(Scopes::USER);
}
return $results;
@ -241,12 +184,13 @@ namespace ncc\Utilities;
* @param string $package
* @return string
* @throws InvalidPackageNameException
* @throws InvalidScopeException
*/
public static function getPackageDataPath(string $package): string
{
if(!Validate::packageName($package))
{
throw new InvalidPackageNameException($package);
}
return self::getDataPath(Scopes::SYSTEM) . DIRECTORY_SEPARATOR . 'data' . DIRECTORY_SEPARATOR . $package;
}
@ -255,20 +199,17 @@ namespace ncc\Utilities;
* Returns the file path where files for the given extension is stored
*
* @param string $scope
* @param bool $win32
* @return string
* @throws InvalidScopeException
*/
public static function getExtensionPath(string $scope=Scopes::AUTO, bool $win32=false): string
public static function getExtensionPath(string $scope=Scopes::AUTO): string
{
return self::getDataPath($scope, $win32) . DIRECTORY_SEPARATOR . 'ext';
return self::getDataPath($scope) . DIRECTORY_SEPARATOR . 'ext';
}
/**
* Returns the configuration file path (ncc.yaml)
*
* @return string
* @throws InvalidScopeException
*/
public static function getConfigurationFile(): string
{
@ -290,15 +231,18 @@ namespace ncc\Utilities;
if($config_value !== null)
{
if(file_exists($config_value) && is_executable($config_value))
{
return $config_value;
}
Console::outWarning(sprintf('The configured \'%s\' executable path is invalid, trying to find it automatically...', $runner));
}
$exec_path = $executable_finder->find($runner);
if($exec_path !== null)
{
return $exec_path;
}
throw new RunnerExecutionException(sprintf('Unable to find \'%s\' executable', $runner));
}

View file

@ -1,31 +1,34 @@
<?php
/*
* Copyright (c) Nosial 2022-2023, all rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
* associated documentation files (the "Software"), to deal in the Software without restriction, including without
* limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
* Software, and to permit persons to whom the Software is furnished to do so, subject to the following
* conditions:
*
* The above copyright notice and this permission notice shall be included in all copies or substantial portions
* of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
* PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*
*/
namespace ncc;
/** @noinspection PhpMissingFieldTypeInspection */
/*
* Copyright (c) Nosial 2022-2023, all rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
* associated documentation files (the "Software"), to deal in the Software without restriction, including without
* limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
* Software, and to permit persons to whom the Software is furnished to do so, subject to the following
* conditions:
*
* The above copyright notice and this permission notice shall be included in all copies or substantial portions
* of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
* PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*
*/
namespace ncc;
use ncc\Exceptions\AccessDeniedException;
use ncc\Exceptions\FileNotFoundException;
use ncc\Exceptions\IOException;
use ncc\Exceptions\MalformedJsonException;
use ncc\Exceptions\PathNotFoundException;
use ncc\Exceptions\RuntimeException;
use ncc\Objects\NccVersionInformation;
use ncc\Utilities\Functions;
@ -42,15 +45,7 @@ namespace ncc;
*
* @var NccVersionInformation|null
*/
private static $VersionInformation;
/**
* NCC Public Constructor
*/
public function __construct()
{
}
private static $version_information;
/**
* Returns the version information object about the current build of NCC
@ -58,40 +53,41 @@ namespace ncc;
* @param boolean $reload Indicates if the cached version is to be ignored and the version file to be reloaded and validated
* @return NccVersionInformation
* @throws AccessDeniedException
* @throws FileNotFoundException
* @throws IOException
* @throws RuntimeException
* @throws PathNotFoundException
*/
public static function getVersionInformation(bool $reload=False): NccVersionInformation
{
if(self::$VersionInformation !== null && !$reload)
return self::$VersionInformation;
if(self::$version_information !== null && !$reload)
{
return self::$version_information;
}
if(!file_exists(__DIR__ . DIRECTORY_SEPARATOR . 'version.json'))
{
throw new RuntimeException('The file \'version.json\' was not found in \'' . __DIR__ . '\'');
throw new \RuntimeException('The file \'version.json\' was not found in \'' . __DIR__ . '\'');
}
try
{
self::$VersionInformation = NccVersionInformation::fromArray(Functions::loadJsonFile(__DIR__ . DIRECTORY_SEPARATOR . 'version.json', Functions::FORCE_ARRAY));
self::$version_information = NccVersionInformation::fromArray(Functions::loadJsonFile(__DIR__ . DIRECTORY_SEPARATOR . 'version.json', Functions::FORCE_ARRAY));
}
catch(MalformedJsonException $e)
{
throw new RuntimeException('Unable to parse JSON contents of \'version.json\' in \'' . __DIR__ . '\'', $e);
throw new \RuntimeException('Unable to parse JSON contents of \'version.json\' in \'' . __DIR__ . '\'', $e);
}
if(self::$VersionInformation->Version == null)
if(self::$version_information->Version === null)
{
throw new RuntimeException('The version number is not specified in the version information file');
throw new \RuntimeException('The version number is not specified in the version information file');
}
if(self::$VersionInformation->Branch == null)
if(self::$version_information->Branch === null)
{
throw new RuntimeException('The version branch is not specified in the version information file');
throw new \RuntimeException('The version branch is not specified in the version information file');
}
return self::$VersionInformation;
return self::$version_information;
}
/**
@ -99,15 +95,16 @@ namespace ncc;
*
* @return bool
* @throws AccessDeniedException
* @throws FileNotFoundException
* @throws IOException
* @throws RuntimeException
* @throws PathNotFoundException
*/
public static function initialize(): bool
{
if(defined('NCC_INIT'))
{
return false;
}
// Set debugging/troubleshooting constants
define('NCC_EXEC_LOCATION', __DIR__); // The directory of where ncc.php is located
define('NCC_EXEC_IWD', getcwd()); // The initial working directory when NCC was first invoked
@ -130,27 +127,20 @@ namespace ncc;
*/
public static function cliMode(): bool
{
// TODO: Optimize this function to reduce redundant calls
if(defined('NCC_CLI_MODE') && NCC_CLI_MODE == 1)
{
return true;
}
return false;
return defined('NCC_CLI_MODE') && NCC_CLI_MODE === 1;
}
/**
* Returns the constants set by NCC
*
* @return array
* @throws RuntimeException
*/
public static function getConstants(): array
{
if(!defined('NCC_INIT'))
{
throw new RuntimeException('NCC Must be initialized before executing ' . get_called_class() . '::getConstants()');
/** @noinspection ClassConstantCanBeUsedInspection */
throw new \RuntimeException('NCC Must be initialized before executing ' . get_called_class() . '::getConstants()');
}
return [