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 #15956

Merged
Merged
Show file tree
Hide file tree
Changes from 14 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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 = {
total_count: number;
incomplete_results: boolean;
items: ItemsEntity[];
};

export type ItemsEntity = {
html_url: string;
number: number;
title: string;
labels: LabelsEntity[];
};

export type LabelsEntity = {
name: string;
};
119 changes: 119 additions & 0 deletions tools/docs/manager.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,28 @@
import { DateTime } from 'luxon';
import type { RenovateConfig } from '../../lib/config/types';
import { logger } from '../../lib/logger';
import { getManagers } from '../../lib/modules/manager';
import * as hostRules from '../../lib/util/host-rules';
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?';
Gabriel-Ladzaretti marked this conversation as resolved.
Show resolved Hide resolved

if (process.env.GITHUB_TOKEN) {
hostRules.add({
Gabriel-Ladzaretti marked this conversation as resolved.
Show resolved Hide resolved
matchHost: 'api.github.com',
token: process.env.GITHUB_TOKEN,
});
}

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 +34,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 +169,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 when this page was generated on ${now}.\n`;
}

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