/**
* Creates the context of a Puli project.
*
* The home directory is read from the context variable "PULI_HOME".
* If this variable is not set, the home directory defaults to:
*
* * `$HOME/.puli` on Linux, where `$HOME` is the context variable
* "HOME".
* * `$APPDATA/Puli` on Windows, where `$APPDATA` is the context
* variable "APPDATA".
*
* If none of these variables can be found, an exception is thrown.
*
* A .htaccess file is put into the home directory to protect it from web
* access.
*
* @param string $rootDir The path to the project.
*
* @return ProjectContext The project context.
*/
private function createProjectContext($rootDir, $env)
{
Assert::fileExists($rootDir, 'Could not load Puli context: The root %s does not exist.');
Assert::directory($rootDir, 'Could not load Puli context: The root %s is a file. Expected a directory.');
$baseConfig = new DefaultConfig();
$homeDir = self::parseHomeDirectory();
if (null !== ($configFile = $this->loadConfigFile($homeDir, $baseConfig))) {
$baseConfig = $configFile->getConfig();
}
// Create a storage without the factory manager
$moduleFileStorage = new ModuleFileStorage($this->getStorage(), $this->getLegacyModuleFileConverter(), $this->getLegacyRootModuleFileConverter(), $this->getJsonEncoder(), $this->getJsonDecoder());
$rootDir = Path::canonicalize($rootDir);
$rootFilePath = $this->rootDir . '/puli.json';
try {
$rootModuleFile = $moduleFileStorage->loadRootModuleFile($rootFilePath, $baseConfig);
} catch (FileNotFoundException $e) {
$rootModuleFile = new RootModuleFile(null, $rootFilePath, $baseConfig);
}
$config = new EnvConfig($rootModuleFile->getConfig());
return new ProjectContext($homeDir, $rootDir, $config, $rootModuleFile, $configFile, $this->dispatcher, $env);
}