Browse Source

Use github user tokens when available

Jordi Boggiano 8 years ago
parent
commit
fbb548b65f

+ 4 - 4
composer.lock

@@ -68,12 +68,12 @@
             "source": {
                 "type": "git",
                 "url": "https://github.com/composer/composer.git",
-                "reference": "36e283be680c1e012f0ce819efc1c7bc32a00c7a"
+                "reference": "0040498e2516c6ea020b03ce94a5620b63b1f8db"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/composer/composer/zipball/36e283be680c1e012f0ce819efc1c7bc32a00c7a",
-                "reference": "36e283be680c1e012f0ce819efc1c7bc32a00c7a",
+                "url": "https://api.github.com/repos/composer/composer/zipball/0040498e2516c6ea020b03ce94a5620b63b1f8db",
+                "reference": "0040498e2516c6ea020b03ce94a5620b63b1f8db",
                 "shasum": ""
             },
             "require": {
@@ -137,7 +137,7 @@
                 "dependency",
                 "package"
             ],
-            "time": "2016-05-08 17:23:21"
+            "time": "2016-05-09 09:31:09"
         },
         {
             "name": "composer/semver",

+ 5 - 0
src/Packagist/WebBundle/Command/UpdatePackagesCommand.php

@@ -96,6 +96,7 @@ class UpdatePackagesCommand extends ContainerAwareCommand
         $io = $verbose ? new ConsoleIO($input, $output, $this->getApplication()->getHelperSet()) : new BufferIO('');
         $io->loadConfiguration($config);
         $loader = new ValidatingArrayLoader(new ArrayLoader());
+        $auths = $io->getAuthentications();
 
         while ($ids) {
             $packages = $doctrine->getRepository('PackagistWebBundle:Package')->getPackagesWithVersions(array_splice($ids, 0, 50));
@@ -108,6 +109,10 @@ class UpdatePackagesCommand extends ContainerAwareCommand
                     if (null === $io || $io instanceof BufferIO) {
                         $io = new BufferIO('');
                         $io->loadConfiguration($config);
+                    } else {
+                        foreach ($auths as $domain => $auth) {
+                            $io->setAuthentication($domain, $auth['username'], $auth['password']);
+                        }
                     }
                     $repository = new VcsRepository(array('url' => $package->getRepository()), $io, $config);
                     $repository->setLoader($loader);

+ 28 - 1
src/Packagist/WebBundle/Package/Updater.php

@@ -15,6 +15,7 @@ namespace Packagist\WebBundle\Package;
 use Composer\Package\AliasPackage;
 use Composer\Package\PackageInterface;
 use Composer\Repository\RepositoryInterface;
+use Composer\Repository\VcsRepository;
 use Composer\Repository\InvalidRepositoryException;
 use Composer\Util\ErrorHandler;
 use Composer\Util\RemoteFilesystem;
@@ -100,9 +101,35 @@ class Updater
         $pruneDate = clone $start;
         $pruneDate->modify('-1min');
 
-        $versions = $repository->getPackages();
         $em = $this->doctrine->getManager();
 
+        if ($repository instanceof VcsRepository) {
+            $cfg = $repository->getRepoConfig();
+            if (isset($cfg['url']) && preg_match('{\bgithub\.com\b}', $cfg['url'])) {
+                foreach ($package->getMaintainers() as $maintainer) {
+                    if ($newGithubToken = $maintainer->getGithubToken()) {
+                        $context = stream_context_create(['http' => ['header' => 'User-agent: packagist-token-check']]);
+                        $rate = json_decode(@file_get_contents('https://api.github.com/rate_limit?access_token='.$newGithubToken, false, $context), true);
+                        // invalid/outdated token, wipe it so we don't try it again
+                        if (!$rate && (strpos($http_response_header[0], '403') || strpos($http_response_header[0], '401'))) {
+                            $maintainer->setGithubToken(null);
+                            $em->flush($maintainer);
+                            continue;
+                        }
+                        // not enough limit left
+                        if (is_array($rate) && $rate['resources']['core']['remaining'] < 100) {
+                            continue;
+                        }
+
+                        $io->setAuthentication('github.com', $newGithubToken, 'x-oauth-basic');
+                        break;
+                    }
+                }
+            }
+        }
+
+        $versions = $repository->getPackages();
+
         usort($versions, function ($a, $b) {
             $aVersion = $a->getVersion();
             $bVersion = $b->getVersion();