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: add per manager known list of issues #15791

Merged
Merged
16 changes: 16 additions & 0 deletions tools/docs/github-query-items.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
export type GithubApiQueryResponse = {
rarkins marked this conversation as resolved.
Show resolved Hide resolved
total_count: number;
incomplete_results: boolean;
items: ItemsEntity[];
};

export type ItemsEntity = {
Gabriel-Ladzaretti marked this conversation as resolved.
Show resolved Hide resolved
html_url: string;
number: number;
title: string;
labels: LabelsEntity[];
};

export type LabelsEntity = {
name: string;
};
111 changes: 111 additions & 0 deletions tools/docs/manager.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,20 @@
import { DateTime } from 'luxon';
rarkins marked this conversation as resolved.
Show resolved Hide resolved
import type { RenovateConfig } from '../../lib/config/types';
import { logger } from '../../lib/logger';
import { getManagers } from '../../lib/modules/manager';
import { GithubHttp } from '../../lib/util/http/github';
import { getQueryString } from '../../lib/util/url';
import { readFile, updateFile } from '../utils';
import type { GithubApiQueryResponse, ItemsEntity } from './github-query-items';
import { getDisplayName, getNameWithUrl, replaceContent } from './utils';

const gitHubApiUrl = 'https://api.github.com/search/issues?';

interface ManagerIssues {
bugs: ItemsEntity[];
features: ItemsEntity[];
}

function getTitle(manager: string, displayName: string): string {
if (manager === 'regex') {
return `Custom Manager Support using Regex`;
Expand All @@ -14,8 +26,84 @@ function getManagerLink(manager: string): string {
return `[\`${manager}\`](${manager}/)`;
}

function stringifyIssues(items: ItemsEntity[]): [string, number] {
if (!items) {
return ['', 0];
}
let list = '';
for (const item of items) {
list += ` - ${item.title} [#${item.number}](${item.html_url})\n`;
}
return [list, items.length];
}

function extractIssues(
managerIssuesMap: Record<string, ManagerIssues>,
items: ItemsEntity[]
): void {
if (!items || !managerIssuesMap) {
return;
}
for (const item of items) {
const type = item.labels
.find((l) => l.name.startsWith('type:'))
?.name.split(':')[1];
if (!type) {
continue;
}
const manager = item.labels
.find((l) => l.name.startsWith('manager:'))
?.name.split(':')[1];
if (!manager) {
continue;
}
if (!managerIssuesMap[manager]) {
managerIssuesMap[manager] = { bugs: [], features: [] };
}
switch (type) {
case 'bug':
managerIssuesMap[manager].bugs.push(item);
break;
case 'feature':
managerIssuesMap[manager].features.push(item);
break;
default:
break;
}
}
}

export async function getManagersGitHubIssues(): Promise<
Record<string, ManagerIssues>
> {
const q = `repo:renovatebot/renovate type:issue is:open -label:priority-5-triage`;
const per_page = 100;
const managerIssuesMap: Record<string, ManagerIssues> = {};
const githubApi = new GithubHttp('manager-issues');
try {
const query = getQueryString({ q, per_page });
const res = await githubApi.getJson<GithubApiQueryResponse>(
gitHubApiUrl + query,
{
paginationField: 'items',
paginate: true,
}
);
const items = res.body?.items ?? [];
extractIssues(
managerIssuesMap,
items.sort((a, b) => a.number - b.number)
);
} catch (err) {
logger.error({ err }, 'Error getting query results');
throw err;
}
return managerIssuesMap;
}

export async function generateManagers(dist: string): Promise<void> {
const managers = getManagers();
const managerIssuesMap = await getManagersGitHubIssues();
const allLanguages: Record<string, string[]> = {};
for (const [manager, definition] of managers) {
const language = definition.language ?? 'other';
Expand Down Expand Up @@ -73,6 +161,29 @@ sidebar_label: ${displayName}
}
md += managerReadmeContent + '\n\n';

const [featureList] = stringifyIssues(managerIssuesMap[manager]?.features);
if (featureList) {
md += '## Open feature requests\n\n';
md += featureList;
md += '\n';
}

const [bugList] = stringifyIssues(managerIssuesMap[manager]?.bugs);
if (bugList) {
md += '## Open bug reports\n\n';
md += bugList;
md += '\n';
}

if (featureList || bugList) {
const now = DateTime.utc().toFormat('MMMM dd, yyyy');
const lists = `list of ${featureList ? 'features' : ''}${
featureList && bugList ? ' and ' : ''
}${bugList ? 'bugs' : ''}`;
md += '\n\n';
md += `The above ${lists} were current at time of page generation on ${now}.\n`;
rarkins marked this conversation as resolved.
Show resolved Hide resolved
}

await updateFile(`${dist}/modules/manager/${manager}/index.md`, md);
}
const languages = Object.keys(allLanguages).filter(
Expand Down