mirror of
https://github.com/renovatebot/renovate.git
synced 2025-01-11 22:46:27 +00:00
Revert "fix: Revert "feat(github): use graphql instead of rest api for issue list (#3808)""
This reverts commit dc194219d9
.
This commit is contained in:
parent
a91e3d39f3
commit
2243b54f60
2 changed files with 299 additions and 134 deletions
|
@ -631,27 +631,75 @@ async function setBranchStatus(
|
|||
|
||||
// Issue
|
||||
|
||||
/* istanbul ignore next */
|
||||
async function getGraphqlIssues(afterCursor = null) {
|
||||
const url = 'graphql';
|
||||
const headers = {
|
||||
accept: 'application/vnd.github.merge-info-preview+json',
|
||||
};
|
||||
// prettier-ignore
|
||||
const query = `
|
||||
query {
|
||||
repository(owner: "${config.repositoryOwner}", name: "${config.repositoryName}") {
|
||||
issues(first: 100, after:${afterCursor}, orderBy: {field: UPDATED_AT, direction: DESC}, filterBy: {createdBy: "${config.renovateUsername}"}) {
|
||||
pageInfo {
|
||||
startCursor
|
||||
hasNextPage
|
||||
}
|
||||
nodes {
|
||||
number
|
||||
state
|
||||
title
|
||||
body
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
`;
|
||||
|
||||
const options = {
|
||||
headers,
|
||||
body: JSON.stringify({ query }),
|
||||
json: false,
|
||||
};
|
||||
|
||||
try {
|
||||
const res = JSON.parse((await get.post(url, options)).body);
|
||||
|
||||
if (!res.data) {
|
||||
logger.info({ query, res }, 'No graphql res.data');
|
||||
return [false, [], null];
|
||||
}
|
||||
|
||||
const cursor = res.data.repository.issues.pageInfo.hasNextPage
|
||||
? res.data.repository.issues.pageInfo.startCursor
|
||||
: null;
|
||||
|
||||
return [true, res.data.repository.issues.nodes, cursor];
|
||||
} catch (err) {
|
||||
logger.warn({ query, err }, 'getGraphqlIssues error');
|
||||
return [false, [], null];
|
||||
}
|
||||
}
|
||||
|
||||
async function getIssueList() {
|
||||
if (!config.issueList) {
|
||||
logger.debug('Retrieving issueList');
|
||||
const res = await get(
|
||||
`repos/${config.parentRepo || config.repository}/issues?creator=${
|
||||
config.renovateUsername
|
||||
}&state=all&per_page=100&sort=created&direction=asc`,
|
||||
{ paginate: 'all', useCache: false }
|
||||
);
|
||||
// istanbul ignore if
|
||||
if (!is.array(res.body)) {
|
||||
logger.warn({ responseBody: res.body }, 'Could not retrieve issue list');
|
||||
return [];
|
||||
|
||||
let [success, issues, cursor] = await getGraphqlIssues();
|
||||
config.issueList = [];
|
||||
while (success) {
|
||||
for (const issue of issues) {
|
||||
issue.state = issue.state.toLowerCase();
|
||||
config.issueList.push(issue);
|
||||
}
|
||||
|
||||
if (!cursor) {
|
||||
break;
|
||||
}
|
||||
// istanbul ignore next
|
||||
[success, issues, cursor] = await getGraphqlIssues(cursor);
|
||||
}
|
||||
config.issueList = res.body
|
||||
.filter(issue => !issue.pull_request)
|
||||
.map(i => ({
|
||||
number: i.number,
|
||||
state: i.state,
|
||||
title: i.title,
|
||||
}));
|
||||
logger.debug('Retrieved ' + config.issueList.length + ' issues');
|
||||
}
|
||||
return config.issueList;
|
||||
|
|
|
@ -716,20 +716,33 @@ describe('platform/github', () => {
|
|||
expect(res).toBeNull();
|
||||
});
|
||||
it('finds issue', async () => {
|
||||
get.mockReturnValueOnce({
|
||||
body: [
|
||||
{
|
||||
number: 1,
|
||||
title: 'title-1',
|
||||
state: 'open',
|
||||
get.post.mockImplementationOnce(() => ({
|
||||
body: JSON.stringify({
|
||||
data: {
|
||||
repository: {
|
||||
issues: {
|
||||
pageInfo: {
|
||||
startCursor: null,
|
||||
hasNextPage: false,
|
||||
endCursor: null,
|
||||
},
|
||||
nodes: [
|
||||
{
|
||||
number: 2,
|
||||
state: 'open',
|
||||
title: 'title-2',
|
||||
},
|
||||
{
|
||||
number: 1,
|
||||
state: 'open',
|
||||
title: 'title-1',
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
number: 2,
|
||||
title: 'title-2',
|
||||
state: 'open',
|
||||
},
|
||||
],
|
||||
});
|
||||
}),
|
||||
}));
|
||||
get.mockReturnValueOnce({ body: { body: 'new-content' } });
|
||||
const res = await github.findIssue('title-2');
|
||||
expect(res).not.toBeNull();
|
||||
|
@ -737,137 +750,228 @@ describe('platform/github', () => {
|
|||
});
|
||||
describe('ensureIssue()', () => {
|
||||
it('creates issue', async () => {
|
||||
get.mockImplementationOnce(() => ({
|
||||
body: [
|
||||
{
|
||||
number: 1,
|
||||
title: 'title-1',
|
||||
state: 'open',
|
||||
get.post.mockImplementationOnce(() => ({
|
||||
body: JSON.stringify({
|
||||
data: {
|
||||
repository: {
|
||||
issues: {
|
||||
pageInfo: {
|
||||
startCursor: null,
|
||||
hasNextPage: false,
|
||||
endCursor: null,
|
||||
},
|
||||
nodes: [
|
||||
{
|
||||
number: 2,
|
||||
state: 'open',
|
||||
title: 'title-2',
|
||||
},
|
||||
{
|
||||
number: 1,
|
||||
state: 'open',
|
||||
title: 'title-1',
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
number: 2,
|
||||
title: 'title-2',
|
||||
state: 'open',
|
||||
},
|
||||
],
|
||||
}),
|
||||
}));
|
||||
const res = await github.ensureIssue('new-title', 'new-content');
|
||||
expect(res).toEqual('created');
|
||||
});
|
||||
it('creates issue if not ensuring only once', async () => {
|
||||
get.mockImplementationOnce(() => ({
|
||||
body: [
|
||||
{
|
||||
number: 1,
|
||||
title: 'title-1',
|
||||
state: 'closed',
|
||||
get.post.mockImplementationOnce(() => ({
|
||||
body: JSON.stringify({
|
||||
data: {
|
||||
repository: {
|
||||
issues: {
|
||||
pageInfo: {
|
||||
startCursor: null,
|
||||
hasNextPage: false,
|
||||
endCursor: null,
|
||||
},
|
||||
nodes: [
|
||||
{
|
||||
number: 2,
|
||||
state: 'open',
|
||||
title: 'title-2',
|
||||
},
|
||||
{
|
||||
number: 1,
|
||||
state: 'closed',
|
||||
title: 'title-1',
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
number: 2,
|
||||
title: 'title-2',
|
||||
state: 'open',
|
||||
},
|
||||
],
|
||||
}),
|
||||
}));
|
||||
const res = await github.ensureIssue('title-1', 'new-content');
|
||||
expect(res).toBeNull();
|
||||
});
|
||||
it('does not create issue if ensuring only once', async () => {
|
||||
get.mockImplementationOnce(() => ({
|
||||
body: [
|
||||
{
|
||||
number: 1,
|
||||
title: 'title-1',
|
||||
state: 'closed',
|
||||
get.post.mockImplementationOnce(() => ({
|
||||
body: JSON.stringify({
|
||||
data: {
|
||||
repository: {
|
||||
issues: {
|
||||
pageInfo: {
|
||||
startCursor: null,
|
||||
hasNextPage: false,
|
||||
endCursor: null,
|
||||
},
|
||||
nodes: [
|
||||
{
|
||||
number: 2,
|
||||
state: 'open',
|
||||
title: 'title-2',
|
||||
},
|
||||
{
|
||||
number: 1,
|
||||
state: 'closed',
|
||||
title: 'title-1',
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
number: 2,
|
||||
title: 'title-2',
|
||||
state: 'open',
|
||||
},
|
||||
],
|
||||
}),
|
||||
}));
|
||||
const once = true;
|
||||
const res = await github.ensureIssue('title-1', 'new-content', once);
|
||||
expect(res).toBeNull();
|
||||
});
|
||||
it('closes others if ensuring only once', async () => {
|
||||
get.mockImplementationOnce(() => ({
|
||||
body: [
|
||||
{
|
||||
number: 1,
|
||||
title: 'title-1',
|
||||
state: 'closed',
|
||||
get.post.mockImplementationOnce(() => ({
|
||||
body: JSON.stringify({
|
||||
data: {
|
||||
repository: {
|
||||
issues: {
|
||||
pageInfo: {
|
||||
startCursor: null,
|
||||
hasNextPage: false,
|
||||
endCursor: null,
|
||||
},
|
||||
nodes: [
|
||||
{
|
||||
number: 3,
|
||||
state: 'open',
|
||||
title: 'title-1',
|
||||
},
|
||||
{
|
||||
number: 2,
|
||||
state: 'open',
|
||||
title: 'title-2',
|
||||
},
|
||||
{
|
||||
number: 1,
|
||||
state: 'closed',
|
||||
title: 'title-1',
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
number: 2,
|
||||
title: 'title-2',
|
||||
state: 'open',
|
||||
},
|
||||
{
|
||||
number: 3,
|
||||
title: 'title-1',
|
||||
state: 'open',
|
||||
},
|
||||
],
|
||||
}),
|
||||
}));
|
||||
const once = true;
|
||||
const res = await github.ensureIssue('title-1', 'new-content', once);
|
||||
expect(res).toBeNull();
|
||||
});
|
||||
it('updates issue', async () => {
|
||||
get.mockReturnValueOnce({
|
||||
body: [
|
||||
{
|
||||
number: 1,
|
||||
title: 'title-1',
|
||||
state: 'open',
|
||||
get.post.mockImplementationOnce(() => ({
|
||||
body: JSON.stringify({
|
||||
data: {
|
||||
repository: {
|
||||
issues: {
|
||||
pageInfo: {
|
||||
startCursor: null,
|
||||
hasNextPage: false,
|
||||
endCursor: null,
|
||||
},
|
||||
nodes: [
|
||||
{
|
||||
number: 2,
|
||||
state: 'open',
|
||||
title: 'title-2',
|
||||
},
|
||||
{
|
||||
number: 1,
|
||||
state: 'open',
|
||||
title: 'title-1',
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
number: 2,
|
||||
title: 'title-2',
|
||||
state: 'open',
|
||||
},
|
||||
],
|
||||
});
|
||||
}),
|
||||
}));
|
||||
get.mockReturnValueOnce({ body: { body: 'new-content' } });
|
||||
const res = await github.ensureIssue('title-2', 'newer-content');
|
||||
expect(res).toEqual('updated');
|
||||
});
|
||||
it('skips update if unchanged', async () => {
|
||||
get.mockReturnValueOnce({
|
||||
body: [
|
||||
{
|
||||
number: 1,
|
||||
title: 'title-1',
|
||||
state: 'open',
|
||||
get.post.mockImplementationOnce(() => ({
|
||||
body: JSON.stringify({
|
||||
data: {
|
||||
repository: {
|
||||
issues: {
|
||||
pageInfo: {
|
||||
startCursor: null,
|
||||
hasNextPage: false,
|
||||
endCursor: null,
|
||||
},
|
||||
nodes: [
|
||||
{
|
||||
number: 2,
|
||||
state: 'open',
|
||||
title: 'title-2',
|
||||
},
|
||||
{
|
||||
number: 1,
|
||||
state: 'open',
|
||||
title: 'title-1',
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
number: 2,
|
||||
title: 'title-2',
|
||||
state: 'open',
|
||||
},
|
||||
],
|
||||
});
|
||||
}),
|
||||
}));
|
||||
get.mockReturnValueOnce({ body: { body: 'newer-content' } });
|
||||
const res = await github.ensureIssue('title-2', 'newer-content');
|
||||
expect(res).toBeNull();
|
||||
});
|
||||
it('deletes if duplicate', async () => {
|
||||
get.mockReturnValueOnce({
|
||||
body: [
|
||||
{
|
||||
number: 1,
|
||||
title: 'title-1',
|
||||
state: 'open',
|
||||
get.post.mockImplementationOnce(() => ({
|
||||
body: JSON.stringify({
|
||||
data: {
|
||||
repository: {
|
||||
issues: {
|
||||
pageInfo: {
|
||||
startCursor: null,
|
||||
hasNextPage: false,
|
||||
endCursor: null,
|
||||
},
|
||||
nodes: [
|
||||
{
|
||||
number: 2,
|
||||
state: 'open',
|
||||
title: 'title-1',
|
||||
},
|
||||
{
|
||||
number: 1,
|
||||
state: 'open',
|
||||
title: 'title-1',
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
number: 2,
|
||||
title: 'title-1',
|
||||
state: 'open',
|
||||
},
|
||||
],
|
||||
});
|
||||
}),
|
||||
}));
|
||||
get.mockReturnValueOnce({ body: { body: 'newer-content' } });
|
||||
const res = await github.ensureIssue('title-1', 'newer-content');
|
||||
expect(res).toBeNull();
|
||||
|
@ -875,19 +979,32 @@ describe('platform/github', () => {
|
|||
});
|
||||
describe('ensureIssueClosing()', () => {
|
||||
it('closes issue', async () => {
|
||||
get.mockImplementationOnce(() => ({
|
||||
body: [
|
||||
{
|
||||
number: 1,
|
||||
title: 'title-1',
|
||||
state: 'open',
|
||||
get.post.mockImplementationOnce(() => ({
|
||||
body: JSON.stringify({
|
||||
data: {
|
||||
repository: {
|
||||
issues: {
|
||||
pageInfo: {
|
||||
startCursor: null,
|
||||
hasNextPage: false,
|
||||
endCursor: null,
|
||||
},
|
||||
nodes: [
|
||||
{
|
||||
number: 2,
|
||||
state: 'open',
|
||||
title: 'title-2',
|
||||
},
|
||||
{
|
||||
number: 1,
|
||||
state: 'open',
|
||||
title: 'title-1',
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
number: 2,
|
||||
title: 'title-2',
|
||||
state: 'open',
|
||||
},
|
||||
],
|
||||
}),
|
||||
}));
|
||||
await github.ensureIssueClosing('title-2');
|
||||
});
|
||||
|
|
Loading…
Reference in a new issue