Skip to content

Commit c60493d

Browse files
Use alternative way of computing last page of search results
1 parent 6687eb1 commit c60493d

File tree

3 files changed

+53
-2
lines changed

3 files changed

+53
-2
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
export function getLinkHeaderLastPage(
2+
linkHeader: string | undefined,
3+
): number | undefined {
4+
if (!linkHeader) {
5+
return undefined;
6+
}
7+
8+
const lastPage = linkHeader
9+
.split(", ")
10+
.find((link) => link.includes('rel="last"'))
11+
?.match(/&page=(\d+)/);
12+
13+
if (!lastPage) {
14+
return undefined;
15+
}
16+
17+
return parseInt(lastPage[1], 10);
18+
}

extensions/ql-vscode/src/databases/code-search-api.ts

+8-2
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import type { ProgressCallback } from "../common/vscode/progress";
88
import { UserCancellationException } from "../common/vscode/progress";
99
import type { EndpointDefaults } from "@octokit/types";
1010
import { getOctokitBaseUrl } from "../common/vscode/octokit";
11+
import { getLinkHeaderLastPage } from "../common/github-api-response-helper";
1112

1213
export async function getCodeSearchRepositories(
1314
query: string,
@@ -29,9 +30,14 @@ export async function getCodeSearchRepositories(
2930
)) {
3031
i++;
3132
nwos.push(...response.data.map((item) => item.repository.full_name));
32-
const totalNumberOfResultPages = Math.ceil(response.data.total_count / 100);
33+
34+
// If we can't find the last page, then default to 10 because that's
35+
// the maximum number of pages we can get when using `per_page: 100`.
36+
// This means the progress bar might complete earlier than expected
37+
// but that's better experience for the user than underestimating.
3338
const totalNumberOfRequests =
34-
totalNumberOfResultPages > 10 ? 10 : totalNumberOfResultPages;
39+
getLinkHeaderLastPage(response.headers.link) ?? 10;
40+
3541
progress({
3642
maxStep: totalNumberOfRequests,
3743
step: i,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import { getLinkHeaderLastPage } from "../../src/common/github-api-response-helper";
2+
3+
describe("getLinkHeaderLastPage", () => {
4+
it("should return undefined when passed undefined", () => {
5+
expect(getLinkHeaderLastPage(undefined)).toBeUndefined();
6+
});
7+
8+
it("should return undefined when passed an invalid string", () => {
9+
expect(getLinkHeaderLastPage("foobar")).toBeUndefined();
10+
});
11+
12+
it("should return undefined when passed a valid link header without a last page", () => {
13+
expect(
14+
getLinkHeaderLastPage(
15+
'<https://api.github.com/search/code?q=foo+language%3Ajava&per_page=100&page=2>; rel="next"',
16+
),
17+
).toBeUndefined();
18+
});
19+
20+
it("should parse last page number when passed a valid link header with a last page", () => {
21+
expect(
22+
getLinkHeaderLastPage(
23+
'<https://api.github.com/search/code?q=foo+language%3Ajava&per_page=100&page=2>; rel="prev", <https://api.github.com/search/code?q=foo+language%3Ajava&per_page=100&page=4>; rel="next", <https://api.github.com/search/code?q=foo+language%3Ajava&per_page=100&page=8>; rel="last"',
24+
),
25+
).toBe(8);
26+
});
27+
});

0 commit comments

Comments
 (0)