浏览代码

Merge pull request #3272 from bashofmann/master

Added cacheCredentials config flag for saved SVN credentials
Nils Adermann 10 年之前
父节点
当前提交
eba04dc211
共有 4 个文件被更改,包括 95 次插入1 次删除
  1. 32 1
      doc/05-repositories.md
  2. 9 0
      src/Composer/Repository/Vcs/SvnDriver.php
  3. 8 0
      src/Composer/Util/Svn.php
  4. 46 0
      tests/Composer/Test/Util/SvnTest.php

+ 32 - 1
doc/05-repositories.md

@@ -345,6 +345,37 @@ If the package is in a sub-directory, e.g. `/trunk/foo/bar/composer.json` and
 setting the `"package-path"` option to the sub-directory, in this example it
 would be `"package-path": "foo/bar/"`.
 
+If you have a private Subversion repository you can save credentials in the
+http-basic section of your config (See [Schema](04-schema.md)):
+
+```json
+{
+    "http-basic": {
+        "svn.example.org": {
+            "username": "username",
+            "password": "password"
+        }
+    }
+}
+```
+
+If your Subversion client is configured to store credentials by default these
+credentials will be saved for the current user and existing saved credentials
+for this server will be overwritten. To change this behavior by setting the
+`"svn-cache-credentials"` option in your repository configuration:
+
+```json
+{
+    "repositories": [
+        {
+            "type": "vcs",
+            "url": "http://svn.example.org/projectA/",
+            "svn-cache-credentials": false
+        }
+    ]
+}
+```
+
 ### PEAR
 
 It is possible to install packages from any PEAR channel by using the `pear`
@@ -494,7 +525,7 @@ there are some use cases for hosting your own repository.
   might want to keep them separate to packagist. An example of this would be
   wordpress plugins.
 
-For hosting your own packages, a native `composer` type of repository is 
+For hosting your own packages, a native `composer` type of repository is
 recommended, which provides the best performance.
 
 There are a few tools that can help you create a `composer` repository.

+ 9 - 0
src/Composer/Repository/Vcs/SvnDriver.php

@@ -27,6 +27,10 @@ use Composer\Downloader\TransportException;
  */
 class SvnDriver extends VcsDriver
 {
+
+    /**
+     * @var Cache
+     */
     protected $cache;
     protected $baseUrl;
     protected $tags;
@@ -38,6 +42,7 @@ class SvnDriver extends VcsDriver
     protected $branchesPath = 'branches';
     protected $tagsPath     = 'tags';
     protected $packagePath   = '';
+    protected $cacheCredentials = true;
 
     /**
      * @var \Composer\Util\Svn
@@ -62,6 +67,9 @@ class SvnDriver extends VcsDriver
         if (isset($this->repoConfig['tags-path'])) {
             $this->tagsPath = $this->repoConfig['tags-path'];
         }
+        if (array_key_exists('svn-cache-credentials', $this->repoConfig)) {
+            $this->cacheCredentials = (bool) $this->repoConfig['svn-cache-credentials'];
+        }
         if (isset($this->repoConfig['package-path'])) {
             $this->packagePath = '/' . trim($this->repoConfig['package-path'], '/');
         }
@@ -307,6 +315,7 @@ class SvnDriver extends VcsDriver
     {
         if (null === $this->util) {
             $this->util = new SvnUtil($this->baseUrl, $this->io, $this->config, $this->process);
+            $this->util->setCacheCredentials($this->cacheCredentials);
         }
 
         try {

+ 8 - 0
src/Composer/Util/Svn.php

@@ -147,6 +147,14 @@ class Svn
         );
     }
 
+    /**
+     * @param boolean $cacheCredentials
+     */
+    public function setCacheCredentials($cacheCredentials)
+    {
+        $this->cacheCredentials = $cacheCredentials;
+    }
+
     /**
      * Repositories requests credentials, let's put them in.
      *

+ 46 - 0
tests/Composer/Test/Util/SvnTest.php

@@ -72,6 +72,52 @@ class SvnTest extends \PHPUnit_Framework_TestCase
         $this->assertEquals($this->getCmd(" --username 'foo' --password 'bar' "), $reflMethod->invoke($svn));
     }
 
+    public function testCredentialsFromConfigWithCacheCredentialsTrue()
+    {
+        $url = 'http://svn.apache.org';
+
+        $config = new Config();
+        $config->merge(
+            array(
+                'config' => array(
+                    'http-basic' => array(
+                        'svn.apache.org' => array('username' => 'foo', 'password' => 'bar')
+                    )
+                )
+            )
+        );
+
+        $svn = new Svn($url, new NullIO, $config);
+        $svn->setCacheCredentials(true);
+        $reflMethod = new \ReflectionMethod('Composer\\Util\\Svn', 'getCredentialString');
+        $reflMethod->setAccessible(true);
+
+        $this->assertEquals($this->getCmd(" --username 'foo' --password 'bar' "), $reflMethod->invoke($svn));
+    }
+
+    public function testCredentialsFromConfigWithCacheCredentialsFalse()
+    {
+        $url = 'http://svn.apache.org';
+
+        $config = new Config();
+        $config->merge(
+            array(
+                'config' => array(
+                    'http-basic' => array(
+                        'svn.apache.org' => array('username' => 'foo', 'password' => 'bar')
+                    )
+                )
+            )
+        );
+
+        $svn = new Svn($url, new NullIO, $config);
+        $svn->setCacheCredentials(false);
+        $reflMethod = new \ReflectionMethod('Composer\\Util\\Svn', 'getCredentialString');
+        $reflMethod->setAccessible(true);
+
+        $this->assertEquals($this->getCmd(" --no-auth-cache --username 'foo' --password 'bar' "), $reflMethod->invoke($svn));
+    }
+
     private function getCmd($cmd)
     {
         if (defined('PHP_WINDOWS_VERSION_BUILD')) {