From d9c55b990063c40a568dcf99ba5ded1dae945261 Mon Sep 17 00:00:00 2001 From: dejan-crocoder Date: Mon, 12 Feb 2024 11:02:12 +0100 Subject: [PATCH 1/2] dont insert empty value arrays --- packages/functions/extract/src/get-members.ts | 5 +++++ packages/functions/extract/src/get-namespace-members.ts | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/packages/functions/extract/src/get-members.ts b/packages/functions/extract/src/get-members.ts index ba7102851..b39fed164 100644 --- a/packages/functions/extract/src/get-members.ts +++ b/packages/functions/extract/src/get-members.ts @@ -33,6 +33,11 @@ export const getMembers: GetMembersFunction = async ( const { members, pagination } = await integrations.sourceControl.fetchMembers(externalRepositoryId, namespaceName, repositoryName, perPage, page); + if (members.length === 0 && pagination.totalPages === 1) return { + members: [], + paginationInfo: pagination, + } + const insertedMembers = await db.transaction(async (tx) => { return Promise.all(members.map(member => tx.insert(entities.members).values(member) diff --git a/packages/functions/extract/src/get-namespace-members.ts b/packages/functions/extract/src/get-namespace-members.ts index 7f0f8d3a4..98a1bc4b2 100644 --- a/packages/functions/extract/src/get-namespace-members.ts +++ b/packages/functions/extract/src/get-namespace-members.ts @@ -33,6 +33,11 @@ export const getNamespaceMembers: GetNamespaceMembersFunction = async ( const { members, pagination } = await integrations.sourceControl.fetchNamespaceMembers(externalNamespaceId, namespaceName, perPage, page); + if (members.length === 0 && pagination.totalPages === 1) return { + members: [], + paginationInfo: pagination, + } + // TODO: Deki is not a wizard const insertedMembers = await db.transaction(async (tx) => { return Promise.all(members.map(member => From 27c28bec7705b05dca2a43db3ff0b84b8b13ee3a Mon Sep 17 00:00:00 2001 From: dejan-crocoder Date: Mon, 12 Feb 2024 11:27:37 +0100 Subject: [PATCH 2/2] suppress push access github error --- package-lock.json | 21 ++++++++++-- .../integrations/source-control/package.json | 1 + .../source-control/src/github/index.ts | 32 +++++++++++++++---- 3 files changed, 44 insertions(+), 10 deletions(-) diff --git a/package-lock.json b/package-lock.json index 24c03ec62..bfd5a61e5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5495,10 +5495,11 @@ } }, "node_modules/@octokit/request-error": { - "version": "5.0.0", - "license": "MIT", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.0.1.tgz", + "integrity": "sha512-X7pnyTMV7MgtGmiXBwmO6M5kIPrntOXdyKZLigNfQWSEQzVxR4a4vo49vJjTWX70mPndj8KhfT4Dx+2Ng3vnBQ==", "dependencies": { - "@octokit/types": "^11.0.0", + "@octokit/types": "^12.0.0", "deprecation": "^2.0.0", "once": "^1.4.0" }, @@ -5506,6 +5507,19 @@ "node": ">= 18" } }, + "node_modules/@octokit/request-error/node_modules/@octokit/openapi-types": { + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-19.1.0.tgz", + "integrity": "sha512-6G+ywGClliGQwRsjvqVYpklIfa7oRPA0vyhPQG/1Feh+B+wU0vGH1JiJ5T25d3g1JZYBHzR2qefLi9x8Gt+cpw==" + }, + "node_modules/@octokit/request-error/node_modules/@octokit/types": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-12.4.0.tgz", + "integrity": "sha512-FLWs/AvZllw/AGVs+nJ+ELCDZZJk+kY0zMen118xhL2zD0s1etIUHm1odgjP7epxYU1ln7SZxEUWYop5bhsdgQ==", + "dependencies": { + "@octokit/openapi-types": "^19.1.0" + } + }, "node_modules/@octokit/rest": { "version": "20.0.2", "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-20.0.2.tgz", @@ -19539,6 +19553,7 @@ "@acme/extract-schema": "*", "@gitbeaker/core": "^39.34.2", "@gitbeaker/rest": "^39.34.2", + "@octokit/request-error": "^5.0.1", "@octokit/rest": "^20.0.2", "@types/parse-link-header": "^2.0.3", "fuse.js": "^7.0.0", diff --git a/packages/integrations/source-control/package.json b/packages/integrations/source-control/package.json index 19a9f803c..5ea060d89 100644 --- a/packages/integrations/source-control/package.json +++ b/packages/integrations/source-control/package.json @@ -14,6 +14,7 @@ "@acme/extract-schema": "*", "@gitbeaker/core": "^39.34.2", "@gitbeaker/rest": "^39.34.2", + "@octokit/request-error": "^5.0.1", "@octokit/rest": "^20.0.2", "@types/parse-link-header": "^2.0.3", "fuse.js": "^7.0.0", diff --git a/packages/integrations/source-control/src/github/index.ts b/packages/integrations/source-control/src/github/index.ts index 68760ef26..9510fb6cc 100644 --- a/packages/integrations/source-control/src/github/index.ts +++ b/packages/integrations/source-control/src/github/index.ts @@ -6,6 +6,7 @@ import type { NewRepository, NewNamespace, NewMergeRequest, NewMember, NewMergeR import type { Pagination, TimePeriod } from '../source-control'; import type { components } from '@octokit/openapi-types'; import { TimelineEventTypes } from '../../../../../packages/schemas/extract/src/timeline-events'; +import { RequestError } from '@octokit/request-error'; const FILE_STATUS_FLAGS_MAPPING: Record< "added" @@ -137,13 +138,30 @@ export class GitHubSourceControl implements SourceControl { async fetchMembers(externalRepositoryId: number, namespaceName: string, repositoryName: string, perPage: number, page?: number): Promise<{ members: NewMember[], pagination: Pagination }> { page = page || 1; - const result = await this.api.repos.listCollaborators({ - owner: namespaceName, - repo: repositoryName, - page, - per_page: perPage, - affiliation: 'all', - }); + let result: Awaited>; + try { + result = await this.api.repos.listCollaborators({ + owner: namespaceName, + repo: repositoryName, + page, + per_page: perPage, + affiliation: 'all', + }); + } catch (error) { + if (error instanceof RequestError && error.message === "Must have push access to view repository collaborators."){ + console.log("SUPPRESSED: Must have push access to view repository collaborators.") + return { + members: [], + pagination: { + page: 1, + perPage: perPage, + totalPages: 1, + } + } + } + + throw error; + } const linkHeader = parseLinkHeader(result.headers.link) || { next: { per_page: perPage } };