From dcfc8aebc8dca4e2bac6e37843954d619d240c84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Tron=C3=AD=C4=8Dek?= Date: Wed, 2 Oct 2024 14:55:57 +0000 Subject: [PATCH 1/5] Fix repo names for Bitbucket (Server) --- .../gitpod-protocol/src/gitpod-service.ts | 2 -- components/gitpod-protocol/src/protocol.ts | 4 ++++ .../src/api/configuration-service-api.ts | 20 ++++++++++--------- .../bitbucket-server-context-parser.ts | 3 ++- .../src/bitbucket/bitbucket-context-parser.ts | 1 + .../src/projects/projects-service.spec.db.ts | 1 - .../server/src/projects/projects-service.ts | 6 +++--- .../src/user/env-var-service.spec.db.ts | 1 - .../src/workspace/context-service.spec.db.ts | 1 - .../workspace/workspace-factory.spec.db.ts | 1 - .../workspace/workspace-service.spec.db.ts | 1 - 11 files changed, 21 insertions(+), 20 deletions(-) diff --git a/components/gitpod-protocol/src/gitpod-service.ts b/components/gitpod-protocol/src/gitpod-service.ts index 43a16bf067f6f5..efbf5dd900ecbd 100644 --- a/components/gitpod-protocol/src/gitpod-service.ts +++ b/components/gitpod-protocol/src/gitpod-service.ts @@ -311,8 +311,6 @@ export interface GetDefaultWorkspaceImageResult { export interface CreateProjectParams { name: string; - /** @deprecated unused */ - slug: string; cloneUrl: string; teamId: string; appInstallationId: string; diff --git a/components/gitpod-protocol/src/protocol.ts b/components/gitpod-protocol/src/protocol.ts index 64f7cad9eacbe6..c61512abcd8fab 100644 --- a/components/gitpod-protocol/src/protocol.ts +++ b/components/gitpod-protocol/src/protocol.ts @@ -1286,6 +1286,10 @@ export interface Repository { * Optional date when the repository was last pushed to. */ pushedAt?: string; + /** + * Optional display name (e.g. for Bitbucket) + */ + displayName?: string; } export interface RepositoryInfo { diff --git a/components/server/src/api/configuration-service-api.ts b/components/server/src/api/configuration-service-api.ts index 237898151c3008..195279ea2f8dc2 100644 --- a/components/server/src/api/configuration-service-api.ts +++ b/components/server/src/api/configuration-service-api.ts @@ -27,9 +27,9 @@ import { PaginationToken, generatePaginationToken, parsePaginationToken } from " import { ctxUserId } from "../util/request-context"; import { UserService } from "../user/user-service"; import { SortOrder } from "@gitpod/public-api/lib/gitpod/v1/sorting_pb"; -import { Project } from "@gitpod/gitpod-protocol"; +import { CommitContext, Project } from "@gitpod/gitpod-protocol"; import { DeepPartial } from "@gitpod/gitpod-protocol/lib/util/deep-partial"; -import { ContextService } from "../workspace/context-service"; +import { ContextParser } from "../workspace/context-parser-service"; function buildUpdateObject>(obj: T): Partial { const update: Partial = {}; @@ -56,8 +56,8 @@ export class ConfigurationServiceAPI implements ServiceImpl u.name === "http")?.href!; const webUrl = repo.links?.self[0]?.href?.replace(/\/browse$/, ""); @@ -298,6 +298,7 @@ export class BitbucketServerContextParser extends AbstractContextParser implemen repoKind, private: !repo.public, defaultBranch: defaultBranch.displayId || DEFAULT_BRANCH, + displayName: repo.name, }; return result; diff --git a/components/server/src/bitbucket/bitbucket-context-parser.ts b/components/server/src/bitbucket/bitbucket-context-parser.ts index 419f1d681d540d..8d6856f14d4056 100644 --- a/components/server/src/bitbucket/bitbucket-context-parser.ts +++ b/components/server/src/bitbucket/bitbucket-context-parser.ts @@ -328,6 +328,7 @@ export class BitbucketContextParser extends AbstractContextParser implements ICo owner, private: !!repo.isPrivate, defaultBranch: repo.mainbranch ? repo.mainbranch.name : DEFAULT_BRANCH, + displayName: repo.name, }; if (!!repo.parent && !!repo.parent.full_name) { const api = await this.api(user); diff --git a/components/server/src/projects/projects-service.spec.db.ts b/components/server/src/projects/projects-service.spec.db.ts index b160a6301004ad..8f20f79287afcc 100644 --- a/components/server/src/projects/projects-service.spec.db.ts +++ b/components/server/src/projects/projects-service.spec.db.ts @@ -319,7 +319,6 @@ describe("ProjectsService", async () => { let project = await ps.createProject( { name: partial.name!, - slug: "deprecated", teamId: org.id, cloneUrl: partial.cloneUrl!, appInstallationId: "noid", diff --git a/components/server/src/projects/projects-service.ts b/components/server/src/projects/projects-service.ts index 98d2c79936bf20..9a5bb727965b4a 100644 --- a/components/server/src/projects/projects-service.ts +++ b/components/server/src/projects/projects-service.ts @@ -224,7 +224,7 @@ export class ProjectsService { } async createProject( - { name, slug, cloneUrl, teamId, appInstallationId }: CreateProjectParams, + { name, cloneUrl, teamId, appInstallationId }: CreateProjectParams, installer: User, projectSettingsDefaults: ProjectSettings = { prebuilds: Project.PREBUILD_SETTINGS_DEFAULTS }, ): Promise { @@ -257,14 +257,14 @@ export class ProjectsService { if (!hostContext || !hostContext.services) { throw new ApplicationError( ErrorCodes.BAD_REQUEST, - "No GIT provider has been configured for the provided repository.", + "No Git provider has been configured for the provided repository.", ); } const repoProvider = hostContext.services.repositoryProvider; if (!repoProvider) { throw new ApplicationError( ErrorCodes.BAD_REQUEST, - "No GIT provider has been configured for the provided repository.", + "No Git provider has been configured for the provided repository.", ); } const canRead = await repoProvider.hasReadAccess(installer, parsedUrl.owner, parsedUrl.repo); diff --git a/components/server/src/user/env-var-service.spec.db.ts b/components/server/src/user/env-var-service.spec.db.ts index 64ffa332267713..0330bdc302a8ce 100644 --- a/components/server/src/user/env-var-service.spec.db.ts +++ b/components/server/src/user/env-var-service.spec.db.ts @@ -121,7 +121,6 @@ describe("EnvVarService", async () => { project = await projectsService.createProject( { name: "my-project", - slug: "my-project", teamId: org.id, cloneUrl: "https://github.com/gitpod-io/gitpod.git", appInstallationId: "noid", diff --git a/components/server/src/workspace/context-service.spec.db.ts b/components/server/src/workspace/context-service.spec.db.ts index c86981a5723808..3d8f8aa8240520 100644 --- a/components/server/src/workspace/context-service.spec.db.ts +++ b/components/server/src/workspace/context-service.spec.db.ts @@ -198,7 +198,6 @@ describe("ContextService", async () => { project = await projectService.createProject( { name: "my-project", - slug: "my-project", teamId: org.id, cloneUrl: "https://github.com/gitpod-io/empty", appInstallationId: "noid", diff --git a/components/server/src/workspace/workspace-factory.spec.db.ts b/components/server/src/workspace/workspace-factory.spec.db.ts index 948eae5260f19c..8d5a0b82234f3f 100644 --- a/components/server/src/workspace/workspace-factory.spec.db.ts +++ b/components/server/src/workspace/workspace-factory.spec.db.ts @@ -110,7 +110,6 @@ describe("WorkspaceFactory", async () => { project = await projectService.createProject( { name: "my-project", - slug: "my-project", teamId: org.id, cloneUrl: "https://github.com/gitpod-io/gitpod", appInstallationId: "noid", diff --git a/components/server/src/workspace/workspace-service.spec.db.ts b/components/server/src/workspace/workspace-service.spec.db.ts index 23e55f533e476d..5e6293ef00eb60 100644 --- a/components/server/src/workspace/workspace-service.spec.db.ts +++ b/components/server/src/workspace/workspace-service.spec.db.ts @@ -81,7 +81,6 @@ describe("WorkspaceService", async () => { project = await projectService.createProject( { name: "my-project", - slug: "my-project", teamId: org.id, cloneUrl: "https://github.com/gitpod-io/gitpod", appInstallationId: "noid", From 88b9ee0bccc507c1a3f03624062032370478000d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Tron=C3=AD=C4=8Dek?= Date: Wed, 2 Oct 2024 15:30:11 +0000 Subject: [PATCH 2/5] remove unused project mutation --- .../data/projects/create-project-mutation.ts | 35 ------------------- 1 file changed, 35 deletions(-) delete mode 100644 components/dashboard/src/data/projects/create-project-mutation.ts diff --git a/components/dashboard/src/data/projects/create-project-mutation.ts b/components/dashboard/src/data/projects/create-project-mutation.ts deleted file mode 100644 index 170b7563904c97..00000000000000 --- a/components/dashboard/src/data/projects/create-project-mutation.ts +++ /dev/null @@ -1,35 +0,0 @@ -/** - * Copyright (c) 2023 Gitpod GmbH. All rights reserved. - * Licensed under the GNU Affero General Public License (AGPL). - * See License.AGPL.txt in the project root for license information. - */ - -import { useMutation } from "@tanstack/react-query"; -import { getGitpodService } from "../../service/service"; -import { useCurrentOrg } from "../organizations/orgs-query"; -import { CreateProjectParams, Project } from "@gitpod/gitpod-protocol"; - -export type CreateProjectArgs = Omit; - -export const useCreateProject = () => { - const { data: org } = useCurrentOrg(); - - return useMutation(async ({ name, slug, cloneUrl, appInstallationId }) => { - if (!org) { - throw new Error("No org currently selected"); - } - - // ensure a .git suffix - const normalizedCloneURL = cloneUrl.endsWith(".git") ? cloneUrl : `${cloneUrl}.git`; - - const newProject = await getGitpodService().server.createProject({ - name, - slug, - cloneUrl: normalizedCloneURL, - teamId: org.id, - appInstallationId, - }); - - return newProject; - }); -}; From b7c832fdf41920ae2496fbc3921e01ee6e1b1905 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Tron=C3=AD=C4=8Dek?= Date: Wed, 2 Oct 2024 19:15:52 +0000 Subject: [PATCH 3/5] Update tests --- .../bitbucket-server-context-parser.spec.ts | 14 ++++++++++++ .../bitbucket-context-parser.spec.ts | 22 +++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/components/server/src/bitbucket-server/bitbucket-server-context-parser.spec.ts b/components/server/src/bitbucket-server/bitbucket-server-context-parser.spec.ts index 599b1a8f12fabc..d2ff2a17fa45a0 100644 --- a/components/server/src/bitbucket-server/bitbucket-server-context-parser.spec.ts +++ b/components/server/src/bitbucket-server/bitbucket-server-context-parser.spec.ts @@ -96,6 +96,7 @@ class TestBitbucketServerContextParser { host: "bitbucket.gitpod-dev.com", owner: "GIT", name: "gitpod-test-repo", + displayName: "Gitpod Test Repo", cloneUrl: "https://bitbucket.gitpod-dev.com/scm/git/gitpod-test-repo.git", webUrl: "https://bitbucket.gitpod-dev.com/projects/GIT/repos/gitpod-test-repo", defaultBranch: "master", @@ -123,6 +124,7 @@ class TestBitbucketServerContextParser { host: "bitbucket.gitpod-dev.com", owner: "GIT", name: "gitpod-test-repo", + displayName: "Gitpod Test Repo", cloneUrl: "https://bitbucket.gitpod-dev.com/scm/git/gitpod-test-repo.git", webUrl: "https://bitbucket.gitpod-dev.com/projects/GIT/repos/gitpod-test-repo", defaultBranch: "master", @@ -150,6 +152,7 @@ class TestBitbucketServerContextParser { host: "bitbucket.gitpod-dev.com", owner: "geropl", name: "test-user-repo", + displayName: "test-user-repo", cloneUrl: "https://bitbucket.gitpod-dev.com/scm/~geropl/test-user-repo.git", webUrl: "https://bitbucket.gitpod-dev.com/users/geropl/repos/test-user-repo", defaultBranch: "main", @@ -177,6 +180,7 @@ class TestBitbucketServerContextParser { defaultBranch: "main", host: "bitbucket.gitpod-dev.com", name: "test-user-repo", + displayName: "test-user-repo", owner: "geropl", private: true, repoKind: "users", @@ -203,6 +207,7 @@ class TestBitbucketServerContextParser { defaultBranch: "master", host: "bitbucket.gitpod-dev.com", name: "gitpod-test-repo", + displayName: "Gitpod Test Repo", owner: "GIT", private: true, repoKind: "projects", @@ -229,6 +234,7 @@ class TestBitbucketServerContextParser { defaultBranch: "master", host: "bitbucket.gitpod-dev.com", name: "gitpod-test-repo", + displayName: "Gitpod Test Repo", owner: "GIT", private: true, repoKind: "projects", @@ -256,6 +262,7 @@ class TestBitbucketServerContextParser { defaultBranch: "main", host: "bitbucket.gitpod-dev.com", name: "browser-extension-test", + displayName: "browser-extension-test", owner: "svenefftinge", repoKind: "users", private: false, @@ -284,6 +291,7 @@ class TestBitbucketServerContextParser { defaultBranch: "main", host: "bitbucket.gitpod-dev.com", name: "browser-extension-test", + displayName: "browser-extension-test", owner: "svenefftinge", repoKind: "users", private: false, @@ -310,6 +318,7 @@ class TestBitbucketServerContextParser { host: "bitbucket.gitpod-dev.com", owner: "GIT", name: "gitpod-test-repo", + displayName: "Gitpod Test Repo", cloneUrl: "https://bitbucket.gitpod-dev.com/scm/git/gitpod-test-repo.git", webUrl: "https://bitbucket.gitpod-dev.com/projects/GIT/repos/gitpod-test-repo", defaultBranch: "master", @@ -323,6 +332,7 @@ class TestBitbucketServerContextParser { host: "bitbucket.gitpod-dev.com", owner: "GIT", name: "gitpod-test-repo", + displayName: "Gitpod Test Repo", cloneUrl: "https://bitbucket.gitpod-dev.com/scm/git/gitpod-test-repo.git", webUrl: "https://bitbucket.gitpod-dev.com/projects/GIT/repos/gitpod-test-repo", defaultBranch: "master", @@ -350,6 +360,7 @@ class TestBitbucketServerContextParser { host: "bitbucket.gitpod-dev.com", owner: "GIT", name: "gitpod-test-repo", + displayName: "Gitpod Test Repo", cloneUrl: "https://bitbucket.gitpod-dev.com/scm/git/gitpod-test-repo.git", webUrl: "https://bitbucket.gitpod-dev.com/projects/GIT/repos/gitpod-test-repo", defaultBranch: "master", @@ -363,6 +374,7 @@ class TestBitbucketServerContextParser { host: "bitbucket.gitpod-dev.com", owner: "GIT", name: "gitpod-test-repo", + displayName: "Gitpod Test Repo", cloneUrl: "https://bitbucket.gitpod-dev.com/scm/git/gitpod-test-repo.git", webUrl: "https://bitbucket.gitpod-dev.com/projects/GIT/repos/gitpod-test-repo", defaultBranch: "master", @@ -389,6 +401,7 @@ class TestBitbucketServerContextParser { host: "bitbucket.gitpod-dev.com", owner: "GIT", name: "gitpod-test-repo", + displayName: "Gitpod Test Repo", cloneUrl: "https://bitbucket.gitpod-dev.com/scm/git/gitpod-test-repo.git", webUrl: "https://bitbucket.gitpod-dev.com/projects/GIT/repos/gitpod-test-repo", defaultBranch: "master", @@ -415,6 +428,7 @@ class TestBitbucketServerContextParser { host: "bitbucket.gitpod-dev.com", owner: "GIT", name: "gitpod-test-repo", + displayName: "Gitpod Test Repo", cloneUrl: "https://bitbucket.gitpod-dev.com/scm/git/gitpod-test-repo.git", webUrl: "https://bitbucket.gitpod-dev.com/projects/GIT/repos/gitpod-test-repo", defaultBranch: "master", diff --git a/components/server/src/bitbucket/bitbucket-context-parser.spec.ts b/components/server/src/bitbucket/bitbucket-context-parser.spec.ts index 862f08b8381347..b20868aacc409e 100644 --- a/components/server/src/bitbucket/bitbucket-context-parser.spec.ts +++ b/components/server/src/bitbucket/bitbucket-context-parser.spec.ts @@ -85,6 +85,7 @@ class TestBitbucketContextParser { host: "bitbucket.org", owner: "gitpod", name: "integration-tests", + displayName: "Integration Tests", cloneUrl: "https://bitbucket.org/gitpod/integration-tests.git", defaultBranch: "master", private: false, @@ -109,6 +110,7 @@ class TestBitbucketContextParser { host: "bitbucket.org", owner: "gitpod", name: "integration-tests", + displayName: "Integration Tests", cloneUrl: "https://bitbucket.org/gitpod/integration-tests.git", defaultBranch: "master", private: false, @@ -133,6 +135,7 @@ class TestBitbucketContextParser { host: "bitbucket.org", owner: "gitpod", name: "integration-tests", + displayName: "Integration Tests", cloneUrl: "https://bitbucket.org/gitpod/integration-tests.git", defaultBranch: "master", private: false, @@ -157,6 +160,7 @@ class TestBitbucketContextParser { host: "bitbucket.org", owner: "gitpod", name: "integration-tests", + displayName: "Integration Tests", cloneUrl: "https://bitbucket.org/gitpod/integration-tests.git", defaultBranch: "master", private: false, @@ -181,6 +185,7 @@ class TestBitbucketContextParser { host: "bitbucket.org", owner: "gitpod", name: "integration-tests", + displayName: "Integration Tests", cloneUrl: "https://bitbucket.org/gitpod/integration-tests.git", defaultBranch: "master", private: false, @@ -205,6 +210,7 @@ class TestBitbucketContextParser { host: "bitbucket.org", owner: "gitpod", name: "integration-tests", + displayName: "Integration Tests", cloneUrl: "https://bitbucket.org/gitpod/integration-tests.git", defaultBranch: "master", private: false, @@ -229,6 +235,7 @@ class TestBitbucketContextParser { host: "bitbucket.org", owner: "gitpod", name: "integration-tests", + displayName: "Integration Tests", cloneUrl: "https://bitbucket.org/gitpod/integration-tests.git", defaultBranch: "master", private: false, @@ -253,6 +260,7 @@ class TestBitbucketContextParser { host: "bitbucket.org", owner: "gitpod", name: "integration-tests", + displayName: "Integration Tests", cloneUrl: "https://bitbucket.org/gitpod/integration-tests.git", defaultBranch: "master", private: false, @@ -277,6 +285,7 @@ class TestBitbucketContextParser { host: "bitbucket.org", owner: "gitpod", name: "integration-tests", + displayName: "Integration Tests", cloneUrl: "https://bitbucket.org/gitpod/integration-tests.git", defaultBranch: "master", private: false, @@ -301,6 +310,7 @@ class TestBitbucketContextParser { host: "bitbucket.org", owner: "gitpod", name: "integration-tests", + displayName: "Integration Tests", cloneUrl: "https://bitbucket.org/gitpod/integration-tests.git", defaultBranch: "master", private: false, @@ -325,6 +335,7 @@ class TestBitbucketContextParser { host: "bitbucket.org", owner: "gitpod", name: "integration-tests", + displayName: "Integration Tests", cloneUrl: "https://bitbucket.org/gitpod/integration-tests.git", defaultBranch: "master", private: false, @@ -349,6 +360,7 @@ class TestBitbucketContextParser { host: "bitbucket.org", owner: "gitpod", name: "integration-tests", + displayName: "Integration Tests", cloneUrl: "https://bitbucket.org/gitpod/integration-tests.git", defaultBranch: "master", private: false, @@ -373,6 +385,7 @@ class TestBitbucketContextParser { host: "bitbucket.org", owner: "gitpod", name: "integration-tests", + displayName: "Integration Tests", cloneUrl: "https://bitbucket.org/gitpod/integration-tests.git", defaultBranch: "master", private: false, @@ -397,6 +410,7 @@ class TestBitbucketContextParser { host: "bitbucket.org", owner: "gitpod", name: "integration-tests", + displayName: "Integration Tests", cloneUrl: "https://bitbucket.org/gitpod/integration-tests.git", defaultBranch: "master", private: false, @@ -417,6 +431,7 @@ class TestBitbucketContextParser { host: "bitbucket.org", owner: "gitpod", name: "integration-tests", + displayName: "Integration Tests", cloneUrl: "https://bitbucket.org/gitpod/integration-tests.git", defaultBranch: "master", private: false, @@ -430,6 +445,7 @@ class TestBitbucketContextParser { host: "bitbucket.org", owner: "gitpod", name: "integration-tests", + displayName: "Integration Tests", cloneUrl: "https://bitbucket.org/gitpod/integration-tests.git", defaultBranch: "master", private: false, @@ -452,6 +468,7 @@ class TestBitbucketContextParser { host: "bitbucket.org", owner: "corneliusltf", name: "sample-repository", + displayName: "Sample Repository", cloneUrl: "https://bitbucket.org/corneliusltf/sample-repository.git", defaultBranch: "master", private: false, @@ -461,6 +478,7 @@ class TestBitbucketContextParser { defaultBranch: "master", host: "bitbucket.org", name: "integration-tests", + displayName: "Integration Tests", owner: "gitpod", private: false, }, @@ -475,6 +493,7 @@ class TestBitbucketContextParser { host: "bitbucket.org", owner: "gitpod", name: "integration-tests", + displayName: "Integration Tests", cloneUrl: "https://bitbucket.org/gitpod/integration-tests.git", defaultBranch: "master", private: false, @@ -497,6 +516,7 @@ class TestBitbucketContextParser { host: "bitbucket.org", owner: "gitpod", name: "integration-tests", + displayName: "Integration Tests", cloneUrl: "https://bitbucket.org/gitpod/integration-tests.git", defaultBranch: "master", private: false, @@ -525,6 +545,7 @@ class TestBitbucketContextParser { host: "bitbucket.org", owner: "gitpod", name: "integration-tests-forked-repository", + displayName: "integration-tests-forked-repository", cloneUrl: "https://bitbucket.org/gitpod/integration-tests-forked-repository.git", defaultBranch: "master", private: false, @@ -534,6 +555,7 @@ class TestBitbucketContextParser { defaultBranch: "master", host: "bitbucket.org", name: "my-sample-repo", + displayName: "my-sample-repo", owner: "corneliusludmann", private: false, }, From a66cd7d0efb5116f50465a80adc94096dcb96334 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Tron=C3=AD=C4=8Dek?= Date: Thu, 3 Oct 2024 10:59:04 +0000 Subject: [PATCH 4/5] Improve handling missing files for BB and BBS --- .../bitbucket-server-file-provider.ts | 7 +++++- .../src/bitbucket/bitbucket-file-provider.ts | 23 ++++++++++++++----- 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/components/server/src/bitbucket-server/bitbucket-server-file-provider.ts b/components/server/src/bitbucket-server/bitbucket-server-file-provider.ts index c4978981c9b38f..ffdd9429d8594d 100644 --- a/components/server/src/bitbucket-server/bitbucket-server-file-provider.ts +++ b/components/server/src/bitbucket-server/bitbucket-server-file-provider.ts @@ -35,7 +35,12 @@ export class BitbucketServerFileProvider implements FileProvider { repositorySlug: name, query: { limit: 1, path, shaOrRevision: revisionOrBranch }, }); - return result.values![0].id; + const lastCommit = result.values?.[0]?.id; + if (!lastCommit) { + throw new Error(`File ${path} does not exist in repository ${repository.owner}/${repository.name}`); + } + + return lastCommit; } public async getFileContent(commit: Commit, user: User, path: string) { diff --git a/components/server/src/bitbucket/bitbucket-file-provider.ts b/components/server/src/bitbucket/bitbucket-file-provider.ts index be653300169f2f..87791308478418 100644 --- a/components/server/src/bitbucket/bitbucket-file-provider.ts +++ b/components/server/src/bitbucket/bitbucket-file-provider.ts @@ -31,16 +31,26 @@ export class BitbucketFileProvider implements FileProvider { try { const api = await this.apiFactory.create(user); const fileMetaData = ( - await api.repositories.readSrc({ + await api.repositories.listFileHistory({ workspace: repository.owner, repo_slug: repository.name, commit: revisionOrBranch, + pagelen: 1, + renames: "false", path, - format: "meta", }) ).data; - return (fileMetaData as any).commit.hash; + const lastCommit = fileMetaData.values?.[0].commit?.hash; + if (!lastCommit) { + throw new Error(`No commits found for ${path} in repository ${repository.owner}/${repository.name}`); + } + + return lastCommit; } catch (err) { + if (err.status && err.status === 404) { + throw new Error(`File ${path} does not exist in repository ${repository.owner}/${repository.name}`); + } + log.error({ userId: user.id }, err); throw new Error(`Could not fetch ${path} of repository ${repository.owner}/${repository.name}: ${err}`); } @@ -51,13 +61,14 @@ export class BitbucketFileProvider implements FileProvider { return undefined; } + const { repository, revision } = commit; try { const api = await this.apiFactory.create(user); const contents = ( await api.repositories.readSrc({ - workspace: commit.repository.owner, - repo_slug: commit.repository.name, - commit: commit.revision, + workspace: repository.owner, + repo_slug: repository.name, + commit: revision, path, }) ).data; From af1d5f6b5a620108a9a3cc6a304b2b876232f62f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Tron=C3=AD=C4=8Dek?= Date: Fri, 4 Oct 2024 08:13:41 +0000 Subject: [PATCH 5/5] add tests --- .../bitbucket-server-file-provider.spec.ts | 60 +++++++++++++------ .../bitbucket/bitbucket-file-provider.spec.ts | 18 +++++- 2 files changed, 59 insertions(+), 19 deletions(-) diff --git a/components/server/src/bitbucket-server/bitbucket-server-file-provider.spec.ts b/components/server/src/bitbucket-server/bitbucket-server-file-provider.spec.ts index 7ba41572f06526..2bbae16e5b24cc 100644 --- a/components/server/src/bitbucket-server/bitbucket-server-file-provider.spec.ts +++ b/components/server/src/bitbucket-server/bitbucket-server-file-provider.spec.ts @@ -31,7 +31,7 @@ class TestBitbucketServerFileProvider { verified: true, description: "", icon: "", - host: "bitbucket.gitpod-self-hosted.com", + host: "bitbucket.gitpod-dev.com", oauth: { callBackUrl: "", clientId: "not-used", @@ -45,7 +45,7 @@ class TestBitbucketServerFileProvider { public before() { const container = new Container(); container.load( - new ContainerModule((bind, unbind, isBound, rebind) => { + new ContainerModule((bind) => { bind(BitbucketServerFileProvider).toSelf().inSingletonScope(); bind(BitbucketServerContextParser).toSelf().inSingletonScope(); bind(AuthProviderParams).toConstantValue(TestBitbucketServerFileProvider.AUTH_HOST_CONFIG); @@ -93,13 +93,13 @@ class TestBitbucketServerFileProvider { const result = await this.service.getGitpodFileContent( // eslint-disable-next-line @typescript-eslint/no-unsafe-argument { - revision: "master", + revision: "main", repository: { - cloneUrl: "https://bitbucket.gitpod-self-hosted.com/projects/FOO/repos/repo123", - webUrl: "https://bitbucket.gitpod-self-hosted.com/projects/FOO/repos/repo123", - name: "repo123", - repoKind: "projects", - owner: "FOO", + cloneUrl: "https://bitbucket.gitpod-dev.com/users/filip/repos/spring-petclinic", + webUrl: "https://bitbucket.gitpod-dev.com/users/filip/repos/spring-petclinic", + name: "spring-petclinic", + repoKind: "users", + owner: "filip", }, } as any, this.user, @@ -111,19 +111,43 @@ class TestBitbucketServerFileProvider { @test async test_getLastChangeRevision_ok() { const result = await this.service.getLastChangeRevision( { - owner: "FOO", - name: "repo123", - repoKind: "projects", - revision: "foo", - host: "bitbucket.gitpod-self-hosted.com", - cloneUrl: "https://bitbucket.gitpod-self-hosted.com/projects/FOO/repos/repo123", - webUrl: "https://bitbucket.gitpod-self-hosted.com/projects/FOO/repos/repo123", + owner: "filip", + name: "spring-petclinic", + repoKind: "users", + revision: "ft/invalid-docker", + host: "bitbucket.gitpod-dev.com", + cloneUrl: "https://bitbucket.gitpod-dev.com/users/filip/repos/spring-petclinic", + webUrl: "https://bitbucket.gitpod-dev.com/users/filip/repos/spring-petclinic", } as Repository, - "foo", + "ft/invalid-docker", this.user, - "folder/sub/test.txt", + ".gitpod.yml", ); - expect(result).to.equal("1384b6842d73b8705feaf45f3e8aa41f00529042"); + expect(result).to.equal("7e38d77cc599682f543f71da36328307e35caa94"); + } + + @test async test_getLastChangeRevision_not_found() { + // it looks like expecting a promise to throw doesn't work, so we hack it with a try-catch + let didThrow = false; + try { + await this.service.getLastChangeRevision( + { + owner: "filip", + name: "spring-petclinic", + repoKind: "users", + revision: "ft/invalid-docker", + host: "bitbucket.gitpod-dev.com", + cloneUrl: "https://bitbucket.gitpod-dev.com/users/filip/repos/spring-petclinic", + webUrl: "https://bitbucket.gitpod-dev.com/users/filip/repos/spring-petclinic", + } as Repository, + "ft/invalid-docker", + this.user, + "gitpod.Dockerfile", + ); + } catch (err) { + didThrow = true; + } + expect(didThrow).to.be.true; } } diff --git a/components/server/src/bitbucket/bitbucket-file-provider.spec.ts b/components/server/src/bitbucket/bitbucket-file-provider.spec.ts index 82d63196cd5391..cebee6cc8e8cfb 100644 --- a/components/server/src/bitbucket/bitbucket-file-provider.spec.ts +++ b/components/server/src/bitbucket/bitbucket-file-provider.spec.ts @@ -75,7 +75,7 @@ class TestBitbucketFileProvider { This is the readme of the second branch.`); } - @test public async testGetLastChangeRevision() { + @test public async testGetLastChangeRevision_ok() { const result = await this.fileProvider.getLastChangeRevision( { owner: "gitpod", name: "integration-tests" } as Repository, "second-branch", @@ -84,6 +84,22 @@ This is the readme of the second branch.`); ); expect(result).to.equal("5a24a0c8a7b42c2e6418593d788e17cb987bda25"); } + + @test public async testGetLastChangeRevision_not_found() { + // it looks like expecting a promise to throw doesn't work, so we hack it with a try-catch + let didThrow = false; + try { + await this.fileProvider.getLastChangeRevision( + { owner: "gitpod", name: "integration-tests" } as Repository, + "da2119f51b0e744cb6b36399f8433b477a4174ef", // a pinned commit on master + this.user, + "gitpod.Dockerfile", + ); + } catch (err) { + didThrow = true; + } + expect(didThrow).to.be.true; + } } module.exports = new TestBitbucketFileProvider();