Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

docs: use issueType field for docs generation #33718

Open
wants to merge 13 commits into
base: main
Choose a base branch
from
3 changes: 3 additions & 0 deletions docs/development/local-development.md
Original file line number Diff line number Diff line change
Expand Up @@ -181,6 +181,9 @@ You can run `pnpm build:docs` to generate the docs.
Then use `pnpm mkdocs serve` to preview the documentation locally.
The docs will update automatically when you run `pnpm build:docs` again, no need to stop the `pnpm mkdocs serve` command.

Also, make sure to set the `GITHUB_TOKEN` in your environment as we use `gh` to fetch the issues.
If you wish to skip fetching the issues, then set `SKIP_GITHUB_ISSUES` to `true` before building the docs.

## Keeping your Renovate fork up to date

First of all, never commit to the `main` branch of your fork - always use a "feature" branch like `feat/1234-add-yarn-parsing`.
Expand Down
87 changes: 50 additions & 37 deletions tools/docs/github-query-items.ts
Original file line number Diff line number Diff line change
@@ -1,31 +1,14 @@
import { DateTime } from 'luxon';
import { z } from 'zod';
import { logger } from '../../lib/logger';
import * as hostRules from '../../lib/util/host-rules';
import { GithubHttp } from '../../lib/util/http/github';
import { getQueryString } from '../../lib/util/url';

const gitHubApiUrl = 'https://api.github.com/search/issues?';
const githubApi = new GithubHttp();

if (process.env.GITHUB_TOKEN) {
logger.info('Using GITHUB_TOKEN from env');
hostRules.add({
matchHost: 'api.github.com',
token: process.env.GITHUB_TOKEN,
});
}

type GithubApiQueryResponse = {
total_count: number;
incomplete_results: boolean;
items: ItemsEntity[];
};
import { exec } from '../../lib/util/exec';

export type ItemsEntity = {
html_url: string;
url: string;
number: number;
title: string;
labels: LabelsEntity[];
issueType: 'Bug' | 'Feature';
};

export type LabelsEntity = {
Expand All @@ -46,6 +29,34 @@ export interface Items {
features: ItemsEntity[];
}

const GhOutputSchema = z.array(
z.object({
url: z.string(),
title: z.string(),
labels: z.array(
z.object({
name: z.string(),
}),
),
number: z.number(),
}),
);

async function getIssuesByIssueType(
issueType: 'Bug' | 'Feature',
): Promise<ItemsEntity[]> {
const command = `gh issue list --json "title,number,url,labels" --search "type:${issueType}" --limit 1000`;
RahulGautamSingh marked this conversation as resolved.
Show resolved Hide resolved
viceice marked this conversation as resolved.
Show resolved Hide resolved
RahulGautamSingh marked this conversation as resolved.
Show resolved Hide resolved
const execRes = await exec(command);
const res = GhOutputSchema.safeParse(JSON.parse(execRes.stdout));
if (res.error) {
throw res.error;
}

return res.data.map((issue) => {
return { ...issue, issueType };
RahulGautamSingh marked this conversation as resolved.
Show resolved Hide resolved
});
}

export async function getOpenGitHubItems(): Promise<RenovateOpenItems> {
const result: RenovateOpenItems = {
managers: {},
Expand All @@ -59,18 +70,21 @@ export async function getOpenGitHubItems(): Promise<RenovateOpenItems> {
return result;
}

const q = `repo:renovatebot/renovate type:issue is:open`;
const per_page = 100;
if (!process.env.GITHUB_TOKEN) {
logger.warn(
RahulGautamSingh marked this conversation as resolved.
Show resolved Hide resolved
'No GITHUB_TOKEN found in env, cannot fetch Github issues. Skipping...',
);
return result;
}
viceice marked this conversation as resolved.
Show resolved Hide resolved

if (process.env.CI) {
return result;
}

try {
const query = getQueryString({ q, per_page });
const res = await githubApi.getJsonUnchecked<GithubApiQueryResponse>(
gitHubApiUrl + query,
{
paginationField: 'items',
paginate: true,
},
const rawItems = (await getIssuesByIssueType('Bug')).concat(
await getIssuesByIssueType('Feature'),
);
const rawItems = res.body?.items ?? [];

result.managers = extractIssues(rawItems, 'manager:');
result.platforms = extractIssues(rawItems, 'platform:');
Expand All @@ -91,9 +105,8 @@ function extractIssues(items: ItemsEntity[], labelPrefix: string): OpenItems {
const issuesMap: OpenItems = {};

for (const item of items) {
const type = item.labels
.find((l) => l.name.startsWith('type:'))
?.name.split(':')[1];
const type = item.issueType;

if (!type) {
continue;
}
Expand All @@ -107,10 +120,10 @@ function extractIssues(items: ItemsEntity[], labelPrefix: string): OpenItems {
issuesMap[label] = { bugs: [], features: [] };
}
switch (type) {
case 'bug':
case 'Bug':
issuesMap[label]?.bugs.push(item);
break;
case 'feature':
case 'Feature':
issuesMap[label]?.features.push(item);
break;
default:
Expand All @@ -127,7 +140,7 @@ function stringifyIssues(items: ItemsEntity[] | undefined): string {
}
let list = '';
for (const item of items) {
list += ` - ${item.title} [#${item.number}](${item.html_url})\n`;
list += ` - ${item.title} [#${item.number}](${item.url})\n`;
}
return list;
}
Expand Down