Merge pull request #10012 from backstage/rugvip/build-since

cli: add --since flag for repo build
This commit is contained in:
Patrik Oldsberg
2022-03-05 16:49:17 +01:00
committed by GitHub
5 changed files with 72 additions and 1 deletions
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/cli': patch
---
Added `--since <ref>` flag for `repo build` command.`
+4
View File
@@ -41,6 +41,10 @@ export function registerRepoCommand(program: CommanderStatic) {
'--all',
'Build all packages, including bundled app and backend packages.',
)
.option(
'--since <ref>',
'Only build packages and their dev dependents that changed since the specified ref',
)
.action(lazy(() => import('./repo/build').then(m => m.command)));
command
+12 -1
View File
@@ -78,7 +78,18 @@ function createScriptOptionsParser(anyCmd: Command, commandPath: string[]) {
}
export async function command(cmd: Command): Promise<void> {
const packages = await PackageGraph.listTargetPackages();
let packages = await PackageGraph.listTargetPackages();
if (cmd.since) {
const graph = PackageGraph.fromPackages(packages);
const changedPackages = await graph.listChangedPackages({ ref: cmd.since });
const withDevDependents = graph.collectPackageNames(
changedPackages.map(pkg => pkg.name),
pkg => pkg.localDevDependents.keys(),
);
packages = Array.from(withDevDependents).map(name => graph.get(name)!);
}
const apps = new Array<ExtendedPackage>();
const backends = new Array<ExtendedPackage>();
@@ -87,6 +87,11 @@ describe('PackageGraph', () => {
localDependencies: new Map([['b', b]]),
localDevDependencies: new Map([['c', c]]),
localOptionalDependencies: new Map(),
allLocalDependents: new Map(),
publishedLocalDependents: new Map(),
localDependents: new Map(),
localDevDependents: new Map(),
localOptionalDependents: new Map(),
});
expect(b).toMatchObject({
name: 'b',
@@ -96,6 +101,11 @@ describe('PackageGraph', () => {
localDependencies: new Map(),
localDevDependencies: new Map([['c', c]]),
localOptionalDependencies: new Map(),
allLocalDependents: new Map([['a', a]]),
publishedLocalDependents: new Map([['a', a]]),
localDependents: new Map([['a', a]]),
localDevDependents: new Map(),
localOptionalDependents: new Map(),
});
expect(c).toMatchObject({
name: 'c',
@@ -105,6 +115,17 @@ describe('PackageGraph', () => {
localDependencies: new Map(),
localDevDependencies: new Map(),
localOptionalDependencies: new Map(),
allLocalDependents: new Map([
['a', a],
['b', b],
]),
publishedLocalDependents: new Map(),
localDependents: new Map(),
localDevDependents: new Map([
['a', a],
['b', b],
]),
localOptionalDependents: new Map(),
});
});
@@ -47,6 +47,7 @@ export type PackageGraphNode = {
dir: string;
/** The package data of the package itself */
packageJson: ExtendedPackageJSON;
/** All direct local dependencies of the package */
allLocalDependencies: Map<string, PackageGraphNode>;
/** All direct local dependencies that will be present in the published package */
@@ -57,6 +58,17 @@ export type PackageGraphNode = {
localDevDependencies: Map<string, PackageGraphNode>;
/** Local optionalDependencies */
localOptionalDependencies: Map<string, PackageGraphNode>;
/** All direct incoming local dependencies of the package */
allLocalDependents: Map<string, PackageGraphNode>;
/** All direct incoming local dependencies that will be present in the published package */
publishedLocalDependents: Map<string, PackageGraphNode>;
/** Incoming local dependencies */
localDependents: Map<string, PackageGraphNode>;
/** Incoming local devDependencies */
localDevDependents: Map<string, PackageGraphNode>;
/** Incoming local optionalDependencies */
localOptionalDependents: Map<string, PackageGraphNode>;
};
export class PackageGraph extends Map<string, PackageGraphNode> {
@@ -82,11 +94,18 @@ export class PackageGraph extends Map<string, PackageGraphNode> {
name,
dir: pkg.dir,
packageJson: pkg.packageJson as ExtendedPackageJSON,
allLocalDependencies: new Map(),
publishedLocalDependencies: new Map(),
localDependencies: new Map(),
localDevDependencies: new Map(),
localOptionalDependencies: new Map(),
allLocalDependents: new Map(),
publishedLocalDependents: new Map(),
localDependents: new Map(),
localDevDependents: new Map(),
localOptionalDependents: new Map(),
});
}
@@ -98,6 +117,10 @@ export class PackageGraph extends Map<string, PackageGraphNode> {
node.allLocalDependencies.set(depName, depPkg);
node.publishedLocalDependencies.set(depName, depPkg);
node.localDependencies.set(depName, depPkg);
depPkg.allLocalDependents.set(node.name, node);
depPkg.publishedLocalDependents.set(node.name, node);
depPkg.localDependents.set(node.name, node);
}
}
for (const depName of Object.keys(
@@ -107,6 +130,9 @@ export class PackageGraph extends Map<string, PackageGraphNode> {
if (depPkg) {
node.allLocalDependencies.set(depName, depPkg);
node.localDevDependencies.set(depName, depPkg);
depPkg.allLocalDependents.set(node.name, node);
depPkg.localDevDependents.set(node.name, node);
}
}
for (const depName of Object.keys(
@@ -117,6 +143,10 @@ export class PackageGraph extends Map<string, PackageGraphNode> {
node.allLocalDependencies.set(depName, depPkg);
node.publishedLocalDependencies.set(depName, depPkg);
node.localOptionalDependencies.set(depName, depPkg);
depPkg.allLocalDependents.set(node.name, node);
depPkg.publishedLocalDependents.set(node.name, node);
depPkg.localOptionalDependents.set(node.name, node);
}
}
}