diff options
| -rw-r--r-- | Cargo.lock | 4 | ||||
| -rw-r--r-- | Cargo.toml | 2 | ||||
| -rw-r--r-- | graphql/projects_query.graphql | 9 | ||||
| -rw-r--r-- | src/forge/gitlab/mod.rs | 32 |
4 files changed, 36 insertions, 11 deletions
@@ -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", @@ -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()) |
