Skip to content
Snippets Groups Projects
Unverified Commit db8581f4 authored by RahulGautamSingh's avatar RahulGautamSingh Committed by GitHub
Browse files

docs: use issueType field for docs generation (#33718)


Co-authored-by: default avatarRhys Arkins <rhys@arkins.net>
parent 8f975309
No related branches found
No related tags found
No related merge requests found
...@@ -182,6 +182,9 @@ You can run `pnpm build:docs` to generate the docs. ...@@ -182,6 +182,9 @@ You can run `pnpm build:docs` to generate the docs.
Then use `pnpm mkdocs serve` to preview the documentation locally. 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. 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 cli](https://cli.github.com/manual/gh_issue_list) 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 ## 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`. First of all, never commit to the `main` branch of your fork - always use a "feature" branch like `feat/1234-add-yarn-parsing`.
......
import { DateTime } from 'luxon'; import { DateTime } from 'luxon';
import { z } from 'zod';
import { logger } from '../../lib/logger'; import { logger } from '../../lib/logger';
import * as hostRules from '../../lib/util/host-rules'; import { exec } from '../../lib/util/exec';
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[];
};
export type ItemsEntity = { export type ItemsEntity = {
html_url: string; url: string;
number: number; number: number;
title: string; title: string;
labels: LabelsEntity[]; labels: LabelsEntity[];
issueType: 'Bug' | 'Feature';
}; };
export type LabelsEntity = { export type LabelsEntity = {
...@@ -46,6 +29,34 @@ export interface Items { ...@@ -46,6 +29,34 @@ export interface Items {
features: ItemsEntity[]; 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`;
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 };
});
}
export async function getOpenGitHubItems(): Promise<RenovateOpenItems> { export async function getOpenGitHubItems(): Promise<RenovateOpenItems> {
const result: RenovateOpenItems = { const result: RenovateOpenItems = {
managers: {}, managers: {},
...@@ -59,18 +70,21 @@ export async function getOpenGitHubItems(): Promise<RenovateOpenItems> { ...@@ -59,18 +70,21 @@ export async function getOpenGitHubItems(): Promise<RenovateOpenItems> {
return result; return result;
} }
const q = `repo:renovatebot/renovate type:issue is:open`; if (!process.env.GITHUB_TOKEN) {
const per_page = 100; logger.warn(
'No GITHUB_TOKEN found in env, cannot fetch Github issues. Skipping...',
);
return result;
}
if (process.env.CI) {
return result;
}
try { try {
const query = getQueryString({ q, per_page }); const rawItems = (await getIssuesByIssueType('Bug')).concat(
const res = await githubApi.getJsonUnchecked<GithubApiQueryResponse>( await getIssuesByIssueType('Feature'),
gitHubApiUrl + query,
{
paginationField: 'items',
paginate: true,
},
); );
const rawItems = res.body?.items ?? [];
result.managers = extractIssues(rawItems, 'manager:'); result.managers = extractIssues(rawItems, 'manager:');
result.platforms = extractIssues(rawItems, 'platform:'); result.platforms = extractIssues(rawItems, 'platform:');
...@@ -91,9 +105,8 @@ function extractIssues(items: ItemsEntity[], labelPrefix: string): OpenItems { ...@@ -91,9 +105,8 @@ function extractIssues(items: ItemsEntity[], labelPrefix: string): OpenItems {
const issuesMap: OpenItems = {}; const issuesMap: OpenItems = {};
for (const item of items) { for (const item of items) {
const type = item.labels const type = item.issueType;
.find((l) => l.name.startsWith('type:'))
?.name.split(':')[1];
if (!type) { if (!type) {
continue; continue;
} }
...@@ -107,10 +120,10 @@ function extractIssues(items: ItemsEntity[], labelPrefix: string): OpenItems { ...@@ -107,10 +120,10 @@ function extractIssues(items: ItemsEntity[], labelPrefix: string): OpenItems {
issuesMap[label] = { bugs: [], features: [] }; issuesMap[label] = { bugs: [], features: [] };
} }
switch (type) { switch (type) {
case 'bug': case 'Bug':
issuesMap[label]?.bugs.push(item); issuesMap[label]?.bugs.push(item);
break; break;
case 'feature': case 'Feature':
issuesMap[label]?.features.push(item); issuesMap[label]?.features.push(item);
break; break;
default: default:
...@@ -127,7 +140,7 @@ function stringifyIssues(items: ItemsEntity[] | undefined): string { ...@@ -127,7 +140,7 @@ function stringifyIssues(items: ItemsEntity[] | undefined): string {
} }
let list = ''; let list = '';
for (const item of items) { for (const item of items) {
list += ` - ${item.title} [#${item.number}](${item.html_url})\n`; list += ` - ${item.title} [#${item.number}](${item.url})\n`;
} }
return list; return list;
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment