Change detection of config/cache/data dirs

main
Nicolas Toniazzi 9 years ago
parent 7d63eb5718
commit e8a6cb536b

@ -35,6 +35,21 @@ use Composer\Package\Version\VersionParser;
*/ */
class Factory class Factory
{ {
/**
*
* @return boolean
*/
private static function useXdg()
{
foreach (array_keys($_SERVER) as $key) {
if (substr($key, 0, 4) === 'XDG_') {
return true;
}
}
return false;
}
/** /**
* @return string * @return string
* @throws \RuntimeException * @throws \RuntimeException
@ -56,28 +71,40 @@ class Factory
protected static function getHomeDir() protected static function getHomeDir()
{ {
$home = getenv('COMPOSER_HOME'); $home = getenv('COMPOSER_HOME');
if (!$home) { if ($home) {
if (defined('PHP_WINDOWS_VERSION_MAJOR')) { return $home;
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 {
$userDir = self::getUserDir();
if (getenv('XDG_CONFIG_DIRS')) { if (defined('PHP_WINDOWS_VERSION_MAJOR')) {
// XDG Base Directory Specifications if (!getenv('APPDATA')) {
$xdgConfig = getenv('XDG_CONFIG_HOME'); throw new \RuntimeException('The APPDATA or COMPOSER_HOME environment variable must be set for composer to run correctly');
if (!$xdgConfig) {
$xdgConfig = $userDir . '/.config';
}
$home = $xdgConfig . '/composer';
} else {
$home = $userDir . '/.composer';
}
} }
$home = strtr(getenv('APPDATA'), '\\', '/') . '/Composer';
return $home;
}
$userDir = self::getUserDir();
if (is_dir($userDir . '/.composer')) {
$home = $userDir . '/.composer';
return $home;
} }
if (self::useXdg()) {
// XDG Base Directory Specifications
$xdgConfig = getenv('XDG_CONFIG_HOME');
if (!$xdgConfig) {
$xdgConfig = $userDir . '/.config';
}
$home = $xdgConfig . '/composer';
return $home;
}
$home = $userDir . '/.composer';
return $home; return $home;
} }
@ -89,29 +116,41 @@ class Factory
protected static function getCacheDir($home) protected static function getCacheDir($home)
{ {
$cacheDir = getenv('COMPOSER_CACHE_DIR'); $cacheDir = getenv('COMPOSER_CACHE_DIR');
if (!$cacheDir) { if ($cacheDir) {
if (defined('PHP_WINDOWS_VERSION_MAJOR')) { return $cacheDir;
if ($cacheDir = getenv('LOCALAPPDATA')) { }
$cacheDir .= '/Composer';
} else { if (defined('PHP_WINDOWS_VERSION_MAJOR')) {
$cacheDir = $home . '/cache'; if ($cacheDir = getenv('LOCALAPPDATA')) {
} $cacheDir .= '/Composer';
$cacheDir = strtr($cacheDir, '\\', '/');
} else { } else {
$userDir = self::getUserDir(); $cacheDir = $home . '/cache';
}
$cacheDir = strtr($cacheDir, '\\', '/');
if (getenv('XDG_CONFIG_DIRS')) { return $cacheDir;
$xdgCache = getenv('XDG_CACHE_HOME'); }
if (!$xdgCache) {
$xdgCache = $userDir . '/.cache'; $userDir = self::getUserDir();
}
$cacheDir = $xdgCache . '/composer'; if ($home === $userDir . '/.composer' && is_dir($home . '/cache')) {
} else { $cacheDir = $home . '/cache';
$cacheDir = $home . '/cache';
} return $cacheDir;
}
if (self::useXdg()) {
$xdgCache = getenv('XDG_CACHE_HOME');
if (!$xdgCache) {
$xdgCache = $userDir . '/.cache';
} }
$cacheDir = $xdgCache . '/composer';
return $cacheDir;
} }
$cacheDir = $home . '/cache';
return $cacheDir; return $cacheDir;
} }
@ -124,17 +163,31 @@ class Factory
{ {
if (defined('PHP_WINDOWS_VERSION_MAJOR')) { if (defined('PHP_WINDOWS_VERSION_MAJOR')) {
$dataDir = strtr($home, '\\', '/'); $dataDir = strtr($home, '\\', '/');
} elseif (getenv('XDG_CONFIG_DIRS')) {
return $dataDir;
}
$userDir = self::getUserDir();
if ($home === $userDir . '/.composer') {
$cacheDir = $home;
return $cacheDir;
}
if (self::useXdg()) {
$xdgData = getenv('XDG_DATA_HOME'); $xdgData = getenv('XDG_DATA_HOME');
if (!$xdgData) { if (!$xdgData) {
$userDir = self::getUserDir(); $userDir = self::getUserDir();
$xdgData = $userDir . '/.local/share'; $xdgData = $userDir . '/.local/share';
} }
$dataDir = $xdgData . '/composer'; $dataDir = $xdgData . '/composer';
} else {
$dataDir = $home; return $dataDir;
} }
$dataDir = $home;
return $dataDir; return $dataDir;
} }
@ -163,31 +216,6 @@ class Factory
} }
} }
// Move content of old composer dir to XDG
if (getenv('XDG_CONFIG_DIRS') !== false && getenv('COMPOSER_HOME') === false && getenv('COMPOSER_CACHE_DIR') === false) {
$userDir = rtrim(getenv('HOME'), '/');
$oldComposerHome = $userDir . '/.composer';
if (file_exists($oldComposerHome)) {
// migrate to XDG
foreach (glob($oldComposerHome . '/*.json') as $file) {
rename($file, $home . '/' . basename($file));
}
foreach (glob($oldComposerHome . '/*.phar') as $file) {
rename($file, $dataDir . '/' . basename($file));
}
foreach (glob($oldComposerHome . '/cache/*') as $oldCacheDir) {
rename($oldCacheDir, $cacheDir . '/' . basename($oldCacheDir));
}
unlink($oldComposerHome . '/.htaccess');
unlink($oldComposerHome . '/cache/.htaccess');
rmdir($oldComposerHome . '/cache');
rmdir($oldComposerHome);
}
}
$config = new Config(true, $cwd); $config = new Config(true, $cwd);
// add dirs to the config // add dirs to the config

Loading…
Cancel
Save