|
@@ -43,18 +43,22 @@ class Factory
|
|
|
protected static function getHomeDir()
|
|
|
{
|
|
|
$home = getenv('COMPOSER_HOME');
|
|
|
+ $cacheDir = getenv('COMPOSER_CACHE_DIR');
|
|
|
+ $userDir = rtrim(getenv('HOME'), '/');
|
|
|
+ $followXDG = false;
|
|
|
if (!$home) {
|
|
|
if (defined('PHP_WINDOWS_VERSION_MAJOR')) {
|
|
|
- if (!getenv('APPDATA')) {
|
|
|
- throw new \RuntimeException('The APPDATA or COMPOSER_HOME environment variable must be set for composer to run correctly');
|
|
|
- }
|
|
|
- $home = strtr(getenv('APPDATA'), '\\', '/') . '/Composer';
|
|
|
- } else {
|
|
|
+ $home = getenv('APPDATA') . '/Composer';
|
|
|
+ } elseif (getenv('XDG_CONFIG_DIRS')) {
|
|
|
+ // XDG Base Directory Specifications
|
|
|
+ $followXDG = true;
|
|
|
$xdgConfig = getenv('XDG_CONFIG_HOME');
|
|
|
if (!$xdgConfig) {
|
|
|
- $xdgConfig = rtrim(getenv('HOME'), '/') . '/.config';
|
|
|
+ $xdgConfig = $userDir . '/.config';
|
|
|
}
|
|
|
$home = $xdgConfig . '/composer';
|
|
|
+ } else {
|
|
|
+ $home = $userDir . '/.composer';
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -76,29 +80,20 @@ class Factory
|
|
|
} else {
|
|
|
$cacheDir = $home . '/cache';
|
|
|
}
|
|
|
- $cacheDir = strtr($cacheDir, '\\', '/');
|
|
|
- } else {
|
|
|
+ } elseif (getenv('XDG_CONFIG_DIRS')) {
|
|
|
+ $followXDG = true;
|
|
|
$xdgCache = getenv('XDG_CACHE_HOME');
|
|
|
if (!$xdgCache) {
|
|
|
- $xdgCache = rtrim(getenv('HOME'), '/') . '/.cache';
|
|
|
+ $xdgCache = $userDir . '/.cache';
|
|
|
}
|
|
|
$cacheDir = $xdgCache . '/composer';
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- return $cacheDir;
|
|
|
- }
|
|
|
|
|
|
- /**
|
|
|
- * @param IOInterface|null $io
|
|
|
- * @return Config
|
|
|
- */
|
|
|
- public static function createConfig(IOInterface $io = null)
|
|
|
- {
|
|
|
- // determine home and cache dirs
|
|
|
- $home = self::getHomeDir();
|
|
|
- $cacheDir = self::getCacheDir($home);
|
|
|
|
|
|
+ } else {
|
|
|
+ $cacheDir = $home . '/.cache';
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
// Protect directory against web access. Since HOME could be
|
|
|
// the www-data's user home and be web-accessible it is a
|
|
|
// potential security risk
|
|
@@ -111,6 +106,19 @@ class Factory
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ // Move content of old composer dir to XDG
|
|
|
+ if ($followXDG && file_exists($userDir . '/.composer')) {
|
|
|
+ // migrate to XDG
|
|
|
+ @rename($userDir . '/.composer/config.json', $home . '/config.json');
|
|
|
+ @unlink($userDir . '/.composer/.htaccess');
|
|
|
+ @unlink($userDir . '/.composer/cache/.htaccess');
|
|
|
+ foreach (glob($userDir . '/.composer/cache/*') as $oldCacheDir) {
|
|
|
+ @rename($oldCacheDir, $cacheDir . '/' . basename($oldCacheDir));
|
|
|
+ }
|
|
|
+ @rmdir($userDir . '/.composer/cache');
|
|
|
+ @rmdir($userDir . '/.composer');
|
|
|
+ }
|
|
|
+
|
|
|
$config = new Config();
|
|
|
|
|
|
// add dirs to the config
|