From e0e60c12743951eb101f067d073197e069c4aeec Mon Sep 17 00:00:00 2001 From: Faiz Surani Date: Fri, 26 Jul 2019 18:55:26 -0700 Subject: [PATCH] Fixed GitLab workspace integration Changed getTree to a recursive function so it iterates through all pages of the GitLab API's response when fetching the tree. --- .../providers/gitlabWorkspaceProvider.js | 2 ++ .../providers/helpers/gitlabHelper.js | 30 +++++++++++++++---- 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/src/services/providers/gitlabWorkspaceProvider.js b/src/services/providers/gitlabWorkspaceProvider.js index bf29c7e0b..0154a6227 100644 --- a/src/services/providers/gitlabWorkspaceProvider.js +++ b/src/services/providers/gitlabWorkspaceProvider.js @@ -106,6 +106,8 @@ export default new Provider({ return gitlabHelper.getTree({ ...store.getters['workspace/currentWorkspace'], token: this.getToken(), + existingBody: [], + page: 1, }); }, prepareChanges(tree) { diff --git a/src/services/providers/helpers/gitlabHelper.js b/src/services/providers/helpers/gitlabHelper.js index 03312e612..40d222be4 100644 --- a/src/services/providers/helpers/gitlabHelper.js +++ b/src/services/providers/helpers/gitlabHelper.js @@ -4,15 +4,19 @@ import store from '../../../store'; import userSvc from '../../userSvc'; import badgeSvc from '../../badgeSvc'; -const request = ({ accessToken, serverUrl }, options) => networkSvc.request({ +const fullRequest = ({ accessToken, serverUrl }, options) => networkSvc.request({ ...options, url: `${serverUrl}/api/v4/${options.url}`, headers: { ...options.headers || {}, Authorization: `Bearer ${accessToken}`, }, -}) - .then(res => res.body); +}); + +const request = ({ accessToken, serverUrl }, options) => fullRequest({ + accessToken, + serverUrl, +}, options).then(res => res.body); const getCommitMessage = (name, path) => { const message = store.getters['data/computedSettings'].git[name]; @@ -114,18 +118,34 @@ export default { * https://docs.gitlab.com/ee/api/repositories.html#list-repository-tree */ async getTree({ + existingBody, // Used for recursive requests, intially empty token, projectId, branch, + page, }) { - return request(token, { + const pageResponse = await fullRequest(token, { url: `projects/${encodeURIComponent(projectId)}/repository/tree`, params: { ref: branch, recursive: true, - per_page: 9999, + per_page: 100, + page, }, }); + const combinedBody = pageResponse.body.concat(existingBody); + const nextPage = new Headers(pageResponse.headers).get('X-Next-Page'); + // eslint-disable-next-line eqeqeq + if (nextPage == '') { + return combinedBody; + } + return this.getTree({ + existingBody: combinedBody, + token, + projectId, + branch, + page: nextPage, + }); }, /**