Merge pull request #10012 from backstage/rugvip/build-since
cli: add --since flag for repo build
This commit is contained in:
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/cli': patch
|
||||
---
|
||||
|
||||
Added `--since <ref>` flag for `repo build` command.`
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user