Skip to content

Commit a2318c1

Browse files
authored
[summarize-impact] Minor code improvements (#36347)
1 parent 9c6d0f7 commit a2318c1

File tree

7 files changed

+70
-103
lines changed

7 files changed

+70
-103
lines changed

eng/tools/oav-runner/src/cli.ts

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,23 +8,10 @@ import {
88
} from "./formatting.js";
99
import { checkExamples, checkSpecs } from "./runner.js";
1010

11+
import { getRootFolder } from "@azure-tools/specs-shared/simple-git";
1112
import fs from "node:fs/promises";
1213
import { parseArgs, ParseArgsConfig } from "node:util";
1314
import { resolve } from "path";
14-
import { simpleGit } from "simple-git";
15-
16-
export async function getRootFolder(inputPath: string): Promise<string> {
17-
try {
18-
const gitRoot = await simpleGit(inputPath).revparse("--show-toplevel");
19-
return resolve(gitRoot.trim());
20-
} catch (error) {
21-
console.error(
22-
`Error: Unable to determine the root folder of the git repository.`,
23-
`Please ensure you are running this command within a git repository OR providing a targeted directory that is within a git repo.`,
24-
);
25-
process.exit(1);
26-
}
27-
}
2815

2916
export async function main() {
3017
const config: ParseArgsConfig = {

eng/tools/oav-runner/test/cli.test.ts

Lines changed: 0 additions & 31 deletions
This file was deleted.

eng/tools/summarize-impact/src/cli.ts

Lines changed: 7 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,15 @@
1-
#!/usr/bin/env node
2-
31
import { getChangedFilesStatuses } from "@azure-tools/specs-shared/changed-files";
42
import { setOutput } from "@azure-tools/specs-shared/error-reporting";
53
import { evaluateImpact, getRPaaSFolderList } from "./impact.js";
64

75
import { getRootFolder } from "@azure-tools/specs-shared/simple-git";
86
import { Octokit } from "@octokit/rest";
9-
import fs from "fs";
7+
import { writeFile } from "fs/promises";
108
import { parseArgs, ParseArgsConfig } from "node:util";
11-
import { join } from "path";
9+
import { resolve } from "path";
1210
import { LabelContext } from "./labelling-types.js";
1311
import { PRContext } from "./PRContext.js";
1412

15-
export async function getRoot(inputPath: string): Promise<string> {
16-
try {
17-
return await getRootFolder(inputPath);
18-
} catch (error) {
19-
console.error(
20-
`Error: Unable to determine the root folder of the git repository.`,
21-
`Please ensure you are running this command within a git repository OR providing a targeted directory that is within a git repo.`,
22-
);
23-
process.exit(1);
24-
}
25-
}
26-
2713
export async function main() {
2814
const config: ParseArgsConfig = {
2915
options: {
@@ -85,8 +71,8 @@ export async function main() {
8571
// todo: refactor these opts
8672
const sourceDirectory = opts.sourceDirectory as string;
8773
const targetDirectory = opts.targetDirectory as string;
88-
const sourceGitRoot = await getRoot(sourceDirectory);
89-
const targetGitRoot = await getRoot(targetDirectory);
74+
const sourceGitRoot = await getRootFolder(sourceDirectory);
75+
const targetGitRoot = await getRootFolder(targetDirectory);
9076
const fileList = await getChangedFilesStatuses({ cwd: sourceGitRoot, paths: ["specification"] });
9177
const sha = opts.sha as string;
9278
const sourceBranch = opts.sourceBranch as string;
@@ -135,7 +121,8 @@ export async function main() {
135121
console.log("Evaluated impact: ", JSON.stringify(impact, null, 2));
136122

137123
// Write to a temp file that can get picked up later.
138-
const summaryFile = join(process.cwd(), "summary.json");
139-
fs.writeFileSync(summaryFile, JSON.stringify(impact, null, 2));
124+
// Intentionally doesn't use GITHUB_STEP_SUMMARY, since it's not a markdown summary for GH UI
125+
const summaryFile = resolve("summary.json");
126+
await writeFile(summaryFile, JSON.stringify(impact, null, 2));
140127
setOutput("summary", summaryFile);
141128
}

eng/tools/summarize-impact/src/diff-types.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,15 @@
1-
export type FileTypes = "SwaggerFile" | "TypeSpecFile" | "ExampleFile" | "ReadmeFile";
2-
export type ChangeTypes = "Addition" | "Deletion" | "Update";
1+
export enum FileTypes {
2+
ExampleFile = "ExampleFile",
3+
ReadmeFile = "ReadmeFile",
4+
SwaggerFile = "SwaggerFile",
5+
TypeSpecFile = "TypeSpecFile",
6+
}
7+
8+
export enum ChangeTypes {
9+
Addition = "Addition",
10+
Deletion = "Deletion",
11+
Update = "Update",
12+
}
313

414
export type PRChange = {
515
fileType: FileTypes;

eng/tools/summarize-impact/src/impact.ts

Lines changed: 46 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
#!/usr/bin/env node
22

3-
import * as fs from "fs";
3+
import { existsSync, readFileSync } from "fs";
44
import { glob } from "glob";
5-
import * as path from "path";
5+
import { dirname, join, resolve } from "path";
66

77
import * as commonmark from "commonmark";
88
import yaml from "js-yaml";
@@ -23,10 +23,12 @@ import { Label, LabelContext, PRType } from "./labelling-types.js";
2323
import { ImpactAssessment } from "./ImpactAssessment.js";
2424
import { PRContext } from "./PRContext.js";
2525

26+
import { dataPlane, resourceManager } from "@azure-tools/specs-shared/changed-files";
2627
import { Readme } from "@azure-tools/specs-shared/readme";
2728
import { Octokit } from "@octokit/rest";
2829

2930
// todo: we need to populate this so that we can tell if it's a new APIVersion down stream
31+
// TODO: move to .github/shared
3032
export async function isNewApiVersion(context: PRContext): Promise<boolean> {
3133
const handlers: ChangeHandler[] = [];
3234
let isAddingNewApiVersion = false;
@@ -36,7 +38,7 @@ export async function isNewApiVersion(context: PRContext): Promise<boolean> {
3638

3739
const createSwaggerFileHandler = () => {
3840
return (e: PRChange) => {
39-
if (e.changeType === "Addition") {
41+
if (e.changeType === ChangeTypes.Addition) {
4042
const apiVersion = getApiVersionFromSwaggerFile(e.filePath);
4143
if (apiVersion) {
4244
apiVersionSet.add(apiVersion);
@@ -46,7 +48,7 @@ export async function isNewApiVersion(context: PRContext): Promise<boolean> {
4648
rpFolders.add(rpFolder);
4749
}
4850
console.log(`apiVersion: ${apiVersion}, rpFolder: ${rpFolder}`);
49-
} else if (e.changeType === "Update") {
51+
} else if (e.changeType === ChangeTypes.Update) {
5052
const rpFolder = getRPFolderFromSwaggerFile(e.filePath);
5153
if (rpFolder !== undefined) {
5254
rpFolders.add(rpFolder);
@@ -69,7 +71,7 @@ export async function isNewApiVersion(context: PRContext): Promise<boolean> {
6971
return false;
7072
}
7173

72-
const targetBranchRPFolder = path.resolve(context.targetDirectory, firstRPFolder);
74+
const targetBranchRPFolder = resolve(context.targetDirectory, firstRPFolder);
7375

7476
console.log(`targetBranchRPFolder: ${targetBranchRPFolder}`);
7577

@@ -156,11 +158,11 @@ export async function evaluateImpact(
156158
}
157159

158160
export function isManagementPR(filePaths: string[]): boolean {
159-
return filePaths.some((it) => it.includes("resource-manager"));
161+
return filePaths.some(resourceManager);
160162
}
161163

162164
export function isDataPlanePR(filePaths: string[]): boolean {
163-
return filePaths.some((it) => it.includes("data-plane"));
165+
return filePaths.some(dataPlane);
164166
}
165167

166168
export function getAllApiVersionFromRPFolder(rpFolder: string): string[] {
@@ -181,7 +183,7 @@ export function getAllApiVersionFromRPFolder(rpFolder: string): string[] {
181183
}
182184

183185
export function getApiVersionFromSwaggerFile(swaggerFile: string): string | undefined {
184-
const swagger = fs.readFileSync(swaggerFile).toString();
186+
const swagger = readFileSync(swaggerFile).toString();
185187
const swaggerObject = JSON.parse(swagger);
186188
if (swaggerObject["info"] && swaggerObject["info"]["version"]) {
187189
return swaggerObject["info"]["version"];
@@ -250,7 +252,10 @@ async function processTypeSpec(ctx: PRContext, labelContext: LabelContext): Prom
250252
};
251253
const swaggerFileHandler = () => {
252254
return (prChange: PRChange) => {
253-
if (prChange.changeType !== "Deletion" && isSwaggerGeneratedByTypeSpec(prChange.filePath)) {
255+
if (
256+
prChange.changeType !== ChangeTypes.Deletion &&
257+
isSwaggerGeneratedByTypeSpec(prChange.filePath)
258+
) {
254259
typeSpecLabel.shouldBePresent = true;
255260
}
256261
};
@@ -268,7 +273,7 @@ async function processTypeSpec(ctx: PRContext, labelContext: LabelContext): Prom
268273

269274
function isSwaggerGeneratedByTypeSpec(swaggerFilePath: string): boolean {
270275
try {
271-
return !!JSON.parse(fs.readFileSync(swaggerFilePath).toString())?.info["x-typespec-generated"];
276+
return !!JSON.parse(readFileSync(swaggerFilePath).toString())?.info["x-typespec-generated"];
272277
} catch {
273278
return false;
274279
}
@@ -329,22 +334,28 @@ export async function getPRChanges(ctx: PRContext): Promise<PRChange[]> {
329334
}
330335

331336
function genChanges(type: FileTypes, diffs: DiffResult<string>) {
332-
newChanges(type, "Addition", diffs.additions);
333-
newChanges(type, "Deletion", diffs.deletions);
334-
newChanges(type, "Update", diffs.changes);
337+
newChanges(type, ChangeTypes.Addition, diffs.additions);
338+
newChanges(type, ChangeTypes.Deletion, diffs.deletions);
339+
newChanges(type, ChangeTypes.Update, diffs.changes);
335340
}
336341

337342
function genReadmeChanges(readmeDiffs?: DiffResult<ReadmeTag>) {
338343
if (readmeDiffs) {
339-
readmeDiffs.additions?.forEach((d) => newChange("ReadmeFile", "Addition", d.readme, d.tags));
340-
readmeDiffs.changes?.forEach((d) => newChange("ReadmeFile", "Update", d.readme, d.tags));
341-
readmeDiffs.deletions?.forEach((d) => newChange("ReadmeFile", "Deletion", d.readme, d.tags));
344+
readmeDiffs.additions?.forEach((d) =>
345+
newChange(FileTypes.ReadmeFile, ChangeTypes.Addition, d.readme, d.tags),
346+
);
347+
readmeDiffs.changes?.forEach((d) =>
348+
newChange(FileTypes.ReadmeFile, ChangeTypes.Update, d.readme, d.tags),
349+
);
350+
readmeDiffs.deletions?.forEach((d) =>
351+
newChange(FileTypes.ReadmeFile, ChangeTypes.Deletion, d.readme, d.tags),
352+
);
342353
}
343354
}
344355

345-
genChanges("SwaggerFile", ctx.getSwaggerDiffs());
346-
genChanges("TypeSpecFile", ctx.getTypeSpecDiffs());
347-
genChanges("ExampleFile", ctx.getExampleDiffs());
356+
genChanges(FileTypes.SwaggerFile, ctx.getSwaggerDiffs());
357+
genChanges(FileTypes.TypeSpecFile, ctx.getTypeSpecDiffs());
358+
genChanges(FileTypes.ExampleFile, ctx.getExampleDiffs());
348359
genReadmeChanges(await ctx.getReadmeDiffs());
349360

350361
console.log("RETURN definition getPRChanges");
@@ -362,11 +373,11 @@ async function processPRType(
362373
const types: PRType[] = await getPRType(context);
363374

364375
const resourceManagerLabelShouldBePresent = processPRTypeLabel(
365-
"resource-manager",
376+
PRType.ResourceManager,
366377
types,
367378
labelContext,
368379
);
369-
const dataPlaneShouldBePresent = processPRTypeLabel("data-plane", types, labelContext);
380+
const dataPlaneShouldBePresent = processPRTypeLabel(PRType.DataPlane, types, labelContext);
370381

371382
console.log("RETURN definition processPRType");
372383
return { resourceManagerLabelShouldBePresent, dataPlaneShouldBePresent };
@@ -383,10 +394,10 @@ async function getPRType(context: PRContext): Promise<PRType[]> {
383394
const prTypes: PRType[] = [];
384395
if (changedFilePaths.length > 0) {
385396
if (isDataPlanePR(changedFilePaths)) {
386-
prTypes.push("data-plane");
397+
prTypes.push(PRType.DataPlane);
387398
}
388399
if (isManagementPR(changedFilePaths)) {
389-
prTypes.push("resource-manager");
400+
prTypes.push(PRType.ResourceManager);
390401
}
391402
}
392403
console.log("RETURN definition getPRType");
@@ -432,11 +443,11 @@ async function processSuppression(context: PRContext, labelContext: LabelContext
432443
const createReadmeFileHandler = () => {
433444
return (e: PRChange) => {
434445
if (
435-
(e.changeType === "Addition" && getSuppressions(e.filePath).length) ||
436-
(e.changeType === "Update" &&
446+
(e.changeType === ChangeTypes.Addition && getSuppressions(e.filePath).length) ||
447+
(e.changeType === ChangeTypes.Update &&
437448
diffSuppression(
438-
path.resolve(context.targetDirectory, e.filePath),
439-
path.resolve(context.sourceDirectory, e.filePath),
449+
resolve(context.targetDirectory, e.filePath),
450+
resolve(context.sourceDirectory, e.filePath),
440451
).length)
441452
) {
442453
suppressionReviewRequiredLabel.shouldBePresent = true;
@@ -484,7 +495,7 @@ function getSuppressions(readmePath: string) {
484495
};
485496
let suppressionResult: any[] = [];
486497
try {
487-
const readme = fs.readFileSync(readmePath).toString();
498+
const readme = readFileSync(readmePath).toString();
488499
const codeBlocks = getAllCodeBlockNodes(new commonmark.Parser().parse(readme));
489500
for (const block of codeBlocks) {
490501
if (block.literal) {
@@ -534,8 +545,8 @@ async function processRPaaS(
534545
const createReadmeFileHandler = () => {
535546
return async (e: PRChange) => {
536547
if (
537-
e.changeType !== "Deletion" &&
538-
(await isRPSaaS(path.join(context.sourceDirectory, e.filePath)))
548+
e.changeType !== ChangeTypes.Deletion &&
549+
(await isRPSaaS(join(context.sourceDirectory, e.filePath)))
539550
) {
540551
rpaasLabel.shouldBePresent = true;
541552
}
@@ -583,12 +594,12 @@ async function processNewRPNamespace(
583594
if (!skip) {
584595
const createSwaggerFileHandler = () => {
585596
return (e: PRChange) => {
586-
if (e.changeType === "Addition") {
587-
const rpFolder = getRPFolderFromSwaggerFile(path.dirname(e.filePath));
597+
if (e.changeType === ChangeTypes.Addition) {
598+
const rpFolder = getRPFolderFromSwaggerFile(dirname(e.filePath));
588599
console.log(`Processing newRPNameSpace rpFolder: ${rpFolder}`);
589600
if (rpFolder !== undefined) {
590-
const rpFolderFullPath = path.resolve(context.targetDirectory, rpFolder);
591-
if (!fs.existsSync(rpFolderFullPath)) {
601+
const rpFolderFullPath = resolve(context.targetDirectory, rpFolder);
602+
if (!existsSync(rpFolderFullPath)) {
592603
console.log(`Adding newRPNameSpace rpFolder: ${rpFolder}`);
593604
newRPNamespaceLabel.shouldBePresent = true;
594605
}
@@ -756,7 +767,7 @@ async function processRpaasRpNotInPrivateRepoLabel(
756767

757768
const processPrChange = () => {
758769
return (e: PRChange) => {
759-
if (e.changeType === "Addition") {
770+
if (e.changeType === ChangeTypes.Addition) {
760771
const rpFolderName = getRPRootFolderName(e.filePath);
761772
console.log(
762773
`Processing processRpaasRpNotInPrivateRepoLabel rpFolderName: ${rpFolderName}`,

eng/tools/summarize-impact/src/labelling-types.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
export type PRType = "resource-manager" | "data-plane";
1+
export enum PRType {
2+
DataPlane = "data-plane",
3+
ResourceManager = "resource-manager",
4+
}
25

36
/**
47
* The LabelContext is used by prSummary.ts / summary() and downstream invocations.

eng/tools/summarize-impact/src/types.ts

Whitespace-only changes.

0 commit comments

Comments
 (0)