aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMax Audron <audron@cocaine.farm>2022-07-06 12:19:43 +0200
committerMax Audron <audron@cocaine.farm>2022-07-06 12:29:58 +0200
commiteea9a69b48bcd20a9cd14b7acc1ef6c1f2357ed7 (patch)
treef1e13ff44e4ad4e428e9a5d237c69a45f05bd3c2
parentadd gitlab upload command (diff)
paginate results from gitlab api
Diffstat (limited to '')
-rw-r--r--Cargo.lock4
-rw-r--r--Cargo.toml2
-rw-r--r--graphql/projects_query.graphql9
-rw-r--r--src/forge/gitlab/mod.rs32
4 files changed, 36 insertions, 11 deletions
diff --git a/Cargo.lock b/Cargo.lock
index 9eedc59..d410884 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -487,9 +487,9 @@ dependencies = [
[[package]]
name = "gitlab"
-version = "0.1500.0"
+version = "0.1501.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f08237694a401bfbbb23d768c0cce275ea0f2a3ebdafa8397d37482ecb4b7be5"
+checksum = "f8e268c1fd0cf2b8143b192247a7d9739452d5182535c1fa79b8739c33f6f773"
dependencies = [
"async-trait",
"base64",
diff --git a/Cargo.toml b/Cargo.toml
index 2dce05e..90a9bd3 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -16,7 +16,7 @@ itertools = "0.10"
num_cpus = "1"
once_cell = "1"
-gitlab = "0.1500"
+gitlab = "0.1501"
graphql_client = "0.10"
git2 = { version = "0.14" }
diff --git a/graphql/projects_query.graphql b/graphql/projects_query.graphql
index dee251a..ae12957 100644
--- a/graphql/projects_query.graphql
+++ b/graphql/projects_query.graphql
@@ -1,5 +1,5 @@
-query Projects($scope: String!) {
- projects(membership: true, searchNamespaces: true, search: $scope) {
+query Projects($scope: String!, $after: String!) {
+ projects(membership: true, searchNamespaces: true, search: $scope, after: $after) {
nodes {
id
name
@@ -7,5 +7,10 @@ query Projects($scope: String!) {
sshUrlToRepo
httpUrlToRepo
}
+
+ pageInfo {
+ endCursor
+ hasNextPage
+ }
}
}
diff --git a/src/forge/gitlab/mod.rs b/src/forge/gitlab/mod.rs
index dec3b49..cf5fc16 100644
--- a/src/forge/gitlab/mod.rs
+++ b/src/forge/gitlab/mod.rs
@@ -35,15 +35,35 @@ impl super::ForgeTrait for Gitlab {
async fn projects(&self, scope: &str) -> Result<Vec<super::Project>> {
let query = Projects::build_query(projects::Variables {
scope: scope.to_owned(),
+ after: "".to_owned(),
});
- // debug!("query: {:#?}", query);
+
let res = self.client.graphql::<Projects>(&query).await?;
- let res = res
- .projects
- .unwrap()
- .nodes
- .unwrap()
+ let projects = res.projects.unwrap();
+
+ let mut page = projects.page_info.end_cursor.unwrap();
+ let mut has_next_page = projects.page_info.has_next_page;
+
+ let mut nodes = projects.nodes.unwrap().clone();
+
+ while has_next_page {
+ let query = Projects::build_query(projects::Variables {
+ scope: scope.to_owned(),
+ after: page,
+ });
+
+ let res = self.client.graphql::<Projects>(&query).await?;
+
+ let projects = res.projects.unwrap();
+
+ page = projects.page_info.end_cursor.unwrap();
+ has_next_page = projects.page_info.has_next_page;
+
+ nodes.append(&mut projects.nodes.unwrap());
+ }
+
+ let res = nodes
.into_iter()
.filter(|x| x.is_some())
.map(|x| x.unwrap().into())