diff --git a/doc/03-cli.md b/doc/03-cli.md index 7fcafc2d6..dd708100c 100644 --- a/doc/03-cli.md +++ b/doc/03-cli.md @@ -598,9 +598,11 @@ The `COMPOSER_HOME` var allows you to change the composer home directory. This is a hidden, global (per-user on the machine) directory that is shared between all projects. -By default it points to `/home//.composer` on \*nix, -`/Users//.composer` on OSX and -`C:\Users\\AppData\Roaming\Composer` on Windows. +By default it points to `C:\Users\\AppData\Roaming\Composer` on Windows +and `/Users//.composer` on OSX. On *nix systems that follow the [XDG Base +Directory Specifications](http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html), +it points to `$XDG_CONFIG_HOME/composer`. On other *nix systems, it points to +`/home//.composer`. #### COMPOSER_HOME/config.json diff --git a/doc/04-schema.md b/doc/04-schema.md index c768edb72..3a40d5d93 100644 --- a/doc/04-schema.md +++ b/doc/04-schema.md @@ -754,18 +754,9 @@ The following options are supported: `{"github.com": "oauthtoken"}` as the value of this option will use `oauthtoken` to access private repositories on github and to circumvent the low IP-based rate limiting of their API. - [Read more](articles/troubleshooting.md#api-rate-limit-and-oauth-tokens) - on how to get an OAuth token for GitHub. -* **http-basic:** A list of domain names and username/passwords to authenticate - against them. For example using - `{"example.org": {"username": "alice", "password": "foo"}` as the value of this option will let composer authenticate against example.org. -* **vendor-dir:** Defaults to `vendor`. You can install dependencies into a - different directory if you want to. `$HOME` and `~` will be replaced by your - home directory's path in vendor-dir and all `*-dir` options below. -* **bin-dir:** Defaults to `vendor/bin`. If a project includes binaries, they - will be symlinked into this directory. -* **cache-dir:** Defaults to `$home/cache` on unix systems and - `C:\Users\\AppData\Local\Composer` on Windows. Stores all the caches +* **cache-dir:** Defaults to `C:\Users\\AppData\Local\Composer` on Windows, + `$XDG_CACHE_HOME/composer` on unix systems that follow the XDG Base Directory + Specifications, and `$home/cache` on other unix systems. Stores all the caches used by composer. See also [COMPOSER_HOME](03-cli.md#composer-home). * **cache-files-dir:** Defaults to `$cache-dir/files`. Stores the zip archives of packages. diff --git a/src/Composer/Factory.php b/src/Composer/Factory.php index cc20cd575..0dddab3df 100644 --- a/src/Composer/Factory.php +++ b/src/Composer/Factory.php @@ -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'; + + + } else { + $cacheDir = $home . '/.cache'; } } - - 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); - + // 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