perf: use concurrent promises instead of awaiting them one by one (#59)

This commit is contained in:
Shubh Bapna 2023-07-11 16:15:52 -04:00 committed by GitHub
parent 8c010b43e4
commit 49a7350406
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 147 additions and 222 deletions

126
dist/cli/index.js vendored
View file

@ -665,45 +665,32 @@ class GitHubClient {
if (!data) { if (!data) {
throw new Error("Pull request creation failed"); throw new Error("Pull request creation failed");
} }
const promises = [];
if (backport.labels.length > 0) { if (backport.labels.length > 0) {
try { promises.push(this.octokit.issues.addLabels({
await this.octokit.issues.addLabels({ owner: backport.owner,
owner: backport.owner, repo: backport.repo,
repo: backport.repo, issue_number: data.number,
issue_number: data.number, labels: backport.labels,
labels: backport.labels, }).catch(error => this.logger.error(`Error setting labels: ${error}`)));
});
}
catch (error) {
this.logger.error(`Error setting labels: ${error}`);
}
} }
if (backport.reviewers.length > 0) { if (backport.reviewers.length > 0) {
try { promises.push(this.octokit.pulls.requestReviewers({
await this.octokit.pulls.requestReviewers({ owner: backport.owner,
owner: backport.owner, repo: backport.repo,
repo: backport.repo, pull_number: data.number,
pull_number: data.number, reviewers: backport.reviewers,
reviewers: backport.reviewers, }).catch(error => this.logger.error(`Error requesting reviewers: ${error}`)));
});
}
catch (error) {
this.logger.error(`Error requesting reviewers: ${error}`);
}
} }
if (backport.assignees.length > 0) { if (backport.assignees.length > 0) {
try { promises.push(this.octokit.issues.addAssignees({
await this.octokit.issues.addAssignees({ owner: backport.owner,
owner: backport.owner, repo: backport.repo,
repo: backport.repo, issue_number: data.number,
issue_number: data.number, assignees: backport.assignees,
assignees: backport.assignees, }).catch(error => this.logger.error(`Error setting assignees: ${error}`)));
});
}
catch (error) {
this.logger.error(`Error setting assignees: ${error}`);
}
} }
await Promise.all(promises);
return data.html_url; return data.html_url;
} }
// UTILS // UTILS
@ -892,64 +879,43 @@ class GitLabClient {
assignee_ids: [], assignee_ids: [],
}); });
const mr = data; const mr = data;
const promises = [];
// labels // labels
if (backport.labels.length > 0) { if (backport.labels.length > 0) {
try { this.logger.info("Setting labels: " + backport.labels);
this.logger.info("Setting labels: " + backport.labels); promises.push(this.client.put(`/projects/${projectId}/merge_requests/${mr.iid}`, {
await this.client.put(`/projects/${projectId}/merge_requests/${mr.iid}`, { labels: backport.labels.join(","),
labels: backport.labels.join(","), }).catch(error => this.logger.warn("Failure trying to update labels. " + error)));
});
}
catch (error) {
this.logger.warn("Failure trying to update labels. " + error);
}
} }
// reviewers // reviewers
const reviewerIds = []; const reviewerIds = await Promise.all(backport.reviewers.map(async (r) => {
for (const r of backport.reviewers) { this.logger.debug("Retrieving user: " + r);
try { return this.getUser(r).then(user => user.id).catch(() => {
this.logger.debug("Retrieving user: " + r);
const user = await this.getUser(r);
reviewerIds.push(user.id);
}
catch (error) {
this.logger.warn(`Failed to retrieve reviewer ${r}`); this.logger.warn(`Failed to retrieve reviewer ${r}`);
} return undefined;
} });
}));
if (reviewerIds.length > 0) { if (reviewerIds.length > 0) {
try { this.logger.info("Setting reviewers: " + reviewerIds);
this.logger.info("Setting reviewers: " + reviewerIds); promises.push(this.client.put(`/projects/${projectId}/merge_requests/${mr.iid}`, {
await this.client.put(`/projects/${projectId}/merge_requests/${mr.iid}`, { reviewer_ids: reviewerIds.filter(r => r !== undefined),
reviewer_ids: reviewerIds.filter(r => r !== undefined), }).catch(error => this.logger.warn("Failure trying to update reviewers. " + error)));
});
}
catch (error) {
this.logger.warn("Failure trying to update reviewers. " + error);
}
} }
// assignees // assignees
const assigneeIds = []; const assigneeIds = await Promise.all(backport.assignees.map(async (a) => {
for (const a of backport.assignees) { this.logger.debug("Retrieving user: " + a);
try { return this.getUser(a).then(user => user.id).catch(() => {
this.logger.debug("Retrieving user: " + a);
const user = await this.getUser(a);
assigneeIds.push(user.id);
}
catch (error) {
this.logger.warn(`Failed to retrieve assignee ${a}`); this.logger.warn(`Failed to retrieve assignee ${a}`);
} return undefined;
} });
}));
if (assigneeIds.length > 0) { if (assigneeIds.length > 0) {
try { this.logger.info("Setting assignees: " + assigneeIds);
this.logger.info("Setting assignees: " + assigneeIds); promises.push(this.client.put(`/projects/${projectId}/merge_requests/${mr.iid}`, {
await this.client.put(`/projects/${projectId}/merge_requests/${mr.iid}`, { assignee_ids: assigneeIds.filter(a => a !== undefined),
assignee_ids: assigneeIds.filter(a => a !== undefined), }).catch(error => this.logger.warn("Failure trying to update assignees. " + error)));
});
}
catch (error) {
this.logger.warn("Failure trying to update assignees. " + error);
}
} }
await Promise.all(promises);
return mr.web_url; return mr.web_url;
} }
/** /**

126
dist/gha/index.js vendored
View file

@ -638,45 +638,32 @@ class GitHubClient {
if (!data) { if (!data) {
throw new Error("Pull request creation failed"); throw new Error("Pull request creation failed");
} }
const promises = [];
if (backport.labels.length > 0) { if (backport.labels.length > 0) {
try { promises.push(this.octokit.issues.addLabels({
await this.octokit.issues.addLabels({ owner: backport.owner,
owner: backport.owner, repo: backport.repo,
repo: backport.repo, issue_number: data.number,
issue_number: data.number, labels: backport.labels,
labels: backport.labels, }).catch(error => this.logger.error(`Error setting labels: ${error}`)));
});
}
catch (error) {
this.logger.error(`Error setting labels: ${error}`);
}
} }
if (backport.reviewers.length > 0) { if (backport.reviewers.length > 0) {
try { promises.push(this.octokit.pulls.requestReviewers({
await this.octokit.pulls.requestReviewers({ owner: backport.owner,
owner: backport.owner, repo: backport.repo,
repo: backport.repo, pull_number: data.number,
pull_number: data.number, reviewers: backport.reviewers,
reviewers: backport.reviewers, }).catch(error => this.logger.error(`Error requesting reviewers: ${error}`)));
});
}
catch (error) {
this.logger.error(`Error requesting reviewers: ${error}`);
}
} }
if (backport.assignees.length > 0) { if (backport.assignees.length > 0) {
try { promises.push(this.octokit.issues.addAssignees({
await this.octokit.issues.addAssignees({ owner: backport.owner,
owner: backport.owner, repo: backport.repo,
repo: backport.repo, issue_number: data.number,
issue_number: data.number, assignees: backport.assignees,
assignees: backport.assignees, }).catch(error => this.logger.error(`Error setting assignees: ${error}`)));
});
}
catch (error) {
this.logger.error(`Error setting assignees: ${error}`);
}
} }
await Promise.all(promises);
return data.html_url; return data.html_url;
} }
// UTILS // UTILS
@ -865,64 +852,43 @@ class GitLabClient {
assignee_ids: [], assignee_ids: [],
}); });
const mr = data; const mr = data;
const promises = [];
// labels // labels
if (backport.labels.length > 0) { if (backport.labels.length > 0) {
try { this.logger.info("Setting labels: " + backport.labels);
this.logger.info("Setting labels: " + backport.labels); promises.push(this.client.put(`/projects/${projectId}/merge_requests/${mr.iid}`, {
await this.client.put(`/projects/${projectId}/merge_requests/${mr.iid}`, { labels: backport.labels.join(","),
labels: backport.labels.join(","), }).catch(error => this.logger.warn("Failure trying to update labels. " + error)));
});
}
catch (error) {
this.logger.warn("Failure trying to update labels. " + error);
}
} }
// reviewers // reviewers
const reviewerIds = []; const reviewerIds = await Promise.all(backport.reviewers.map(async (r) => {
for (const r of backport.reviewers) { this.logger.debug("Retrieving user: " + r);
try { return this.getUser(r).then(user => user.id).catch(() => {
this.logger.debug("Retrieving user: " + r);
const user = await this.getUser(r);
reviewerIds.push(user.id);
}
catch (error) {
this.logger.warn(`Failed to retrieve reviewer ${r}`); this.logger.warn(`Failed to retrieve reviewer ${r}`);
} return undefined;
} });
}));
if (reviewerIds.length > 0) { if (reviewerIds.length > 0) {
try { this.logger.info("Setting reviewers: " + reviewerIds);
this.logger.info("Setting reviewers: " + reviewerIds); promises.push(this.client.put(`/projects/${projectId}/merge_requests/${mr.iid}`, {
await this.client.put(`/projects/${projectId}/merge_requests/${mr.iid}`, { reviewer_ids: reviewerIds.filter(r => r !== undefined),
reviewer_ids: reviewerIds.filter(r => r !== undefined), }).catch(error => this.logger.warn("Failure trying to update reviewers. " + error)));
});
}
catch (error) {
this.logger.warn("Failure trying to update reviewers. " + error);
}
} }
// assignees // assignees
const assigneeIds = []; const assigneeIds = await Promise.all(backport.assignees.map(async (a) => {
for (const a of backport.assignees) { this.logger.debug("Retrieving user: " + a);
try { return this.getUser(a).then(user => user.id).catch(() => {
this.logger.debug("Retrieving user: " + a);
const user = await this.getUser(a);
assigneeIds.push(user.id);
}
catch (error) {
this.logger.warn(`Failed to retrieve assignee ${a}`); this.logger.warn(`Failed to retrieve assignee ${a}`);
} return undefined;
} });
}));
if (assigneeIds.length > 0) { if (assigneeIds.length > 0) {
try { this.logger.info("Setting assignees: " + assigneeIds);
this.logger.info("Setting assignees: " + assigneeIds); promises.push(this.client.put(`/projects/${projectId}/merge_requests/${mr.iid}`, {
await this.client.put(`/projects/${projectId}/merge_requests/${mr.iid}`, { assignee_ids: assigneeIds.filter(a => a !== undefined),
assignee_ids: assigneeIds.filter(a => a !== undefined), }).catch(error => this.logger.warn("Failure trying to update assignees. " + error)));
});
}
catch (error) {
this.logger.warn("Failure trying to update assignees. " + error);
}
} }
await Promise.all(promises);
return mr.web_url; return mr.web_url;
} }
/** /**

View file

@ -82,45 +82,43 @@ export default class GitHubClient implements GitClient {
throw new Error("Pull request creation failed"); throw new Error("Pull request creation failed");
} }
const promises = [];
if (backport.labels.length > 0) { if (backport.labels.length > 0) {
try { promises.push(
await this.octokit.issues.addLabels({ this.octokit.issues.addLabels({
owner: backport.owner, owner: backport.owner,
repo: backport.repo, repo: backport.repo,
issue_number: (data as PullRequest).number, issue_number: (data as PullRequest).number,
labels: backport.labels, labels: backport.labels,
}); }).catch(error => this.logger.error(`Error setting labels: ${error}`))
} catch (error) { );
this.logger.error(`Error setting labels: ${error}`);
}
} }
if (backport.reviewers.length > 0) { if (backport.reviewers.length > 0) {
try { promises.push(
await this.octokit.pulls.requestReviewers({ this.octokit.pulls.requestReviewers({
owner: backport.owner, owner: backport.owner,
repo: backport.repo, repo: backport.repo,
pull_number: (data as PullRequest).number, pull_number: (data as PullRequest).number,
reviewers: backport.reviewers, reviewers: backport.reviewers,
}); }).catch(error => this.logger.error(`Error requesting reviewers: ${error}`))
} catch (error) { );
this.logger.error(`Error requesting reviewers: ${error}`);
}
} }
if (backport.assignees.length > 0) { if (backport.assignees.length > 0) {
try { promises.push(
await this.octokit.issues.addAssignees({ this.octokit.issues.addAssignees({
owner: backport.owner, owner: backport.owner,
repo: backport.repo, repo: backport.repo,
issue_number: (data as PullRequest).number, issue_number: (data as PullRequest).number,
assignees: backport.assignees, assignees: backport.assignees,
}); }).catch(error => this.logger.error(`Error setting assignees: ${error}`))
} catch (error) { );
this.logger.error(`Error setting assignees: ${error}`);
}
} }
await Promise.all(promises);
return data.html_url; return data.html_url;
} }

View file

@ -84,65 +84,60 @@ export default class GitLabClient implements GitClient {
}); });
const mr = data as MergeRequestSchema; const mr = data as MergeRequestSchema;
const promises = [];
// labels // labels
if (backport.labels.length > 0) { if (backport.labels.length > 0) {
try { this.logger.info("Setting labels: " + backport.labels);
this.logger.info("Setting labels: " + backport.labels); promises.push(
await this.client.put(`/projects/${projectId}/merge_requests/${mr.iid}`, { this.client.put(`/projects/${projectId}/merge_requests/${mr.iid}`, {
labels: backport.labels.join(","), labels: backport.labels.join(","),
}); }).catch(error => this.logger.warn("Failure trying to update labels. " + error))
} catch(error) { );
this.logger.warn("Failure trying to update labels. " + error);
}
} }
// reviewers // reviewers
const reviewerIds: number[] = []; const reviewerIds = await Promise.all(backport.reviewers.map(async r => {
for(const r of backport.reviewers) { this.logger.debug("Retrieving user: " + r);
try { return this.getUser(r).then(user => user.id).catch(
this.logger.debug("Retrieving user: " + r); () => {
const user = await this.getUser(r); this.logger.warn(`Failed to retrieve reviewer ${r}`);
reviewerIds.push(user.id); return undefined;
} catch(error) { }
this.logger.warn(`Failed to retrieve reviewer ${r}`); );
} }));
}
if (reviewerIds.length > 0) { if (reviewerIds.length > 0) {
try { this.logger.info("Setting reviewers: " + reviewerIds);
this.logger.info("Setting reviewers: " + reviewerIds); promises.push(
await this.client.put(`/projects/${projectId}/merge_requests/${mr.iid}`, { this.client.put(`/projects/${projectId}/merge_requests/${mr.iid}`, {
reviewer_ids: reviewerIds.filter(r => r !== undefined), reviewer_ids: reviewerIds.filter(r => r !== undefined),
}); }).catch(error => this.logger.warn("Failure trying to update reviewers. " + error))
} catch(error) { );
this.logger.warn("Failure trying to update reviewers. " + error);
}
} }
// assignees // assignees
const assigneeIds: number[] = []; const assigneeIds = await Promise.all(backport.assignees.map(async a => {
for(const a of backport.assignees) { this.logger.debug("Retrieving user: " + a);
try { return this.getUser(a).then(user => user.id).catch(
this.logger.debug("Retrieving user: " + a); () => {
const user = await this.getUser(a); this.logger.warn(`Failed to retrieve assignee ${a}`);
assigneeIds.push(user.id); return undefined;
} catch(error) { }
this.logger.warn(`Failed to retrieve assignee ${a}`); );
} }));
}
if (assigneeIds.length > 0) { if (assigneeIds.length > 0) {
try { this.logger.info("Setting assignees: " + assigneeIds);
this.logger.info("Setting assignees: " + assigneeIds); promises.push(
await this.client.put(`/projects/${projectId}/merge_requests/${mr.iid}`, { this.client.put(`/projects/${projectId}/merge_requests/${mr.iid}`, {
assignee_ids: assigneeIds.filter(a => a !== undefined), assignee_ids: assigneeIds.filter(a => a !== undefined),
}); }).catch(error => this.logger.warn("Failure trying to update assignees. " + error))
} catch(error) { );
this.logger.warn("Failure trying to update assignees. " + error);
}
} }
await Promise.all(promises);
return mr.web_url; return mr.web_url;
} }

View file

@ -36,7 +36,7 @@ jest.mock("axios", () => {
iid: 1, // FIXME: I am not testing this atm iid: 1, // FIXME: I am not testing this atm
} }
}), }),
put: jest.fn(), put: async () => undefined,
}), }),
}; };
}); });

View file

@ -36,7 +36,7 @@ jest.mock("axios", () => {
iid: 1, // FIXME: I am not testing this atm iid: 1, // FIXME: I am not testing this atm
} }
}), }),
put: jest.fn(), put: async () => undefined, // make it async so that .catch doesn't throw an error
}), }),
}; };
}); });

View file

@ -59,7 +59,7 @@ export const postAxiosMocked = (_url: string, data?: {source_branch: string,}) =
}; };
}; };
export const putAxiosMocked = (url: string, _data?: unknown) => { export const putAxiosMocked = async (url: string, _data?: unknown) => {
const responseData = undefined; const responseData = undefined;
// gitlab // gitlab