Skip to content

Commit b7bb548

Browse files
committed
[server] add searchString to getRepositoriesForAutomatedPrebuilds
1 parent b95a468 commit b7bb548

File tree

4 files changed

+32
-20
lines changed

4 files changed

+32
-20
lines changed

components/server/src/bitbucket-server/bitbucket-server-api.ts

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -280,34 +280,43 @@ export class BitbucketServerApi {
280280
}
281281

282282
/**
283+
* If `searchString` is provided, this tries to match projects and repositorys by name,
284+
* otherwise it returns the first n repositories.
285+
*
286+
* Based on:
283287
* https://developer.atlassian.com/server/bitbucket/rest/v811/api-group-repository/#api-api-latest-repos-get
284288
*/
285289
async getRepos(
286290
userOrToken: User | string,
287291
query: {
288292
permission?: "REPO_READ" | "REPO_WRITE" | "REPO_ADMIN";
293+
searchString?: string;
289294
},
290295
) {
291-
const result: BitbucketServer.Repository[] = [];
292296
const permission = query.permission ? `permission=${query.permission}&` : "";
293-
let isLastPage = false;
294-
let start = 0;
295-
while (!isLastPage) {
296-
const pageResult = await this.runQuery<BitbucketServer.Paginated<BitbucketServer.Repository>>(
297+
const runQuery = async (params: string) =>
298+
this.runQuery<BitbucketServer.Paginated<BitbucketServer.Repository>>(
297299
userOrToken,
298-
`/repos?${permission}start=${start}`,
300+
`/repos?${permission}${params}`,
299301
);
300-
if (pageResult.values) {
301-
result.push(...pageResult.values);
302-
}
303-
isLastPage =
304-
typeof pageResult.isLastPage === "undefined" || // a fuse to prevent infinite loop
305-
!!pageResult.isLastPage;
306-
if (pageResult.nextPageStart) {
307-
start = pageResult.nextPageStart;
302+
303+
if (query.searchString?.trim()) {
304+
const result: BitbucketServer.Repository[] = [];
305+
const ids = new Set<number>(); // used to deduplicate
306+
for (const param of ["name", "projectname", "projectkey"]) {
307+
const pageResult = await runQuery(`limit=1000&${param}=${query.searchString}`);
308+
for (const repo of pageResult.values || []) {
309+
if (!ids.has(repo.id)) {
310+
ids.add(repo.id);
311+
result.push(repo);
312+
}
313+
}
308314
}
315+
return result;
316+
} else {
317+
const pageResult = await runQuery(`limit=1000`);
318+
return pageResult.values || [];
309319
}
310-
return result;
311320
}
312321

313322
async getPullRequest(

components/server/src/prebuilds/bitbucket-server-service.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ export class BitbucketServerService extends RepositoryService {
2424
@inject(TokenService) protected tokenService: TokenService;
2525
@inject(BitbucketServerContextParser) protected contextParser: BitbucketServerContextParser;
2626

27-
async getRepositoriesForAutomatedPrebuilds(user: User): Promise<ProviderRepository[]> {
28-
const repos = await this.api.getRepos(user, { permission: "REPO_ADMIN" });
27+
async getRepositoriesForAutomatedPrebuilds(user: User, searchString?: string): Promise<ProviderRepository[]> {
28+
const repos = await this.api.getRepos(user, { permission: "REPO_ADMIN", searchString });
2929
return repos.map((r) => {
3030
const cloneUrl = r.links.clone.find((u) => u.name === "http")?.href!;
3131
// const webUrl = r.links?.self[0]?.href?.replace("/browse", "");

components/server/src/repohost/repo-service.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import { injectable } from "inversify";
99

1010
@injectable()
1111
export class RepositoryService {
12-
async getRepositoriesForAutomatedPrebuilds(user: User): Promise<ProviderRepository[]> {
12+
async getRepositoriesForAutomatedPrebuilds(user: User, searchString?: string): Promise<ProviderRepository[]> {
1313
return [];
1414
}
1515

components/server/src/workspace/gitpod-server-impl.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1464,7 +1464,7 @@ export class GitpodServerImpl implements GitpodServerWithTracing, Disposable {
14641464
// Projects
14651465
async getProviderRepositoriesForUser(
14661466
ctx: TraceContext,
1467-
params: { provider: string; hints?: object },
1467+
params: { provider: string; hints?: object; searchString?: string },
14681468
): Promise<ProviderRepository[]> {
14691469
traceAPIParams(ctx, { params });
14701470

@@ -1489,7 +1489,10 @@ export class GitpodServerImpl implements GitpodServerWithTracing, Disposable {
14891489
const hostContext = this.hostContextProvider.get(providerHost);
14901490
if (hostContext?.services) {
14911491
repositories.push(
1492-
...(await hostContext.services.repositoryService.getRepositoriesForAutomatedPrebuilds(user)),
1492+
...(await hostContext.services.repositoryService.getRepositoriesForAutomatedPrebuilds(
1493+
user,
1494+
params.searchString,
1495+
)),
14931496
);
14941497
}
14951498
} else if (provider?.authProviderType === "GitLab") {

0 commit comments

Comments
 (0)