Browse Source

GitlabDriver V4 Paging

V4 of gitlab api requires paging in tags/branches
Helmut Januschka 7 years ago
parent
commit
be1f675992
1 changed files with 26 additions and 8 deletions
  1. 26 8
      src/Composer/Repository/Vcs/GitLabDriver.php

+ 26 - 8
src/Composer/Repository/Vcs/GitLabDriver.php

@@ -280,17 +280,20 @@ class GitLabDriver extends VcsDriver
     {
         $resource = $this->getApiUrl().'/repository/'.$type;
 
-        $data = JsonFile::parseJson($this->getContents($resource), $resource);
+        do {
+            $data = JsonFile::parseJson($this->getContents($resource), $resource);
 
-        $references = array();
+            $references = array();
 
-        foreach ($data as $datum) {
-            $references[$datum['name']] = $datum['commit']['id'];
+            foreach ($data as $datum) {
+                $references[$datum['name']] = $datum['commit']['id'];
 
-            // Keep the last commit date of a reference to avoid
-            // unnecessary API call when retrieving the composer file.
-            $this->commits[$datum['commit']['id']] = $datum['commit'];
-        }
+              // Keep the last commit date of a reference to avoid
+             // unnecessary API call when retrieving the composer file.
+              $this->commits[$datum['commit']['id']] = $datum['commit'];
+            }
+            $resource = $this->getNextPage();
+        } while ($resource);
 
         return $references;
     }
@@ -444,6 +447,21 @@ class GitLabDriver extends VcsDriver
         return true;
     }
 
+    protected function getNextPage()
+    {
+        $headers = $this->remoteFilesystem->getLastHeaders();
+        foreach ($headers as $header) {
+            if (substr($header, 0, 5) === 'Link:') {
+                $links = explode(',', substr($header, 5));
+                foreach ($links as $link) {
+                    if (preg_match('{<(.+?)>; *rel="next"}', $link, $match)) {
+                        return $match[1];
+                    }
+                }
+            }
+        }
+    }
+
     /**
      * @param  array       $configuredDomains
      * @param  string      $guessedDomain