Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: support an include or exclude list of metadata when building a manifest from an org #1247

Open
wants to merge 6 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions command-snapshot.json
Original file line number Diff line number Diff line change
Expand Up @@ -239,6 +239,7 @@
"flagChars": ["c", "d", "m", "n", "p", "t"],
"flags": [
"api-version",
"exclude-metadata",
shetzel marked this conversation as resolved.
Show resolved Hide resolved
"flags-dir",
"from-org",
"include-packages",
Expand Down
14 changes: 14 additions & 0 deletions messages/manifest.generate.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ Use --name to specify a custom name for the generated manifest if the pre-define

To include multiple metadata components, either set multiple --metadata <name> flags or a single --metadata flag with multiple names separated by spaces. Enclose names that contain spaces in one set of double quotes. The same syntax applies to --include-packages and --source-dir.

To build a manifest from the metadata in an org use the --from-org flag optionally combining it with the --metadata flag to only include certain metadata types, or the --exclude-metadata flag to exclude certain metadata types. When building a manifest from an org, the command makes many API calls concurrently to discover the metadata that exists in the org. To limit the number of concurrent requests use the `SF_LIST_METADATA_BATCH_SIZE` environment variable and set it to a size that works best for your org and environment. If you are experiencing timeouts and/or inconsistent manifest contents then setting this environment variable should improve accuracy. However, the command will take longer to run since it sends fewer requests at a time.
shetzel marked this conversation as resolved.
Show resolved Hide resolved

# examples

- Create a manifest for deploying or retrieving all Apex classes and custom objects:
Expand All @@ -37,10 +39,22 @@ To include multiple metadata components, either set multiple --metadata <name> f

$ <%= config.bin %> <%= command.id %> --from-org [email protected] --include-packages unlocked

- Create a manifest from specific metadata types in an org:

$ <%= config.bin %> <%= command.id %> --from-org [email protected] --metadata ApexClass,CustomObject,CustomLabels

- Create a manifest from all metadata components in an org excluding specific metadata types:

$ <%= config.bin %> <%= command.id %> --from-org [email protected] --exclude-metadata StandardValueSet
shetzel marked this conversation as resolved.
Show resolved Hide resolved

# flags.include-packages.summary

Package types (managed, unlocked) whose metadata is included in the manifest; by default, metadata in managed and unlocked packages is excluded. Metadata in unmanaged packages is always included.

# flags.exclude-metadata.summary

Metadata types (types only; not names) to exclude when building a manifest from an org.
shetzel marked this conversation as resolved.
Show resolved Hide resolved

# flags.from-org.summary

Username or alias of the org that contains the metadata components from which to build a manifest.
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
"@salesforce/kit": "^3.2.3",
"@salesforce/plugin-info": "^3.4.23",
"@salesforce/sf-plugins-core": "^12.1.1",
"@salesforce/source-deploy-retrieve": "^12.10.3",
"@salesforce/source-deploy-retrieve": "12.10.4-dev-17431548.0",
"@salesforce/source-tracking": "^7.1.17",
"@salesforce/ts-types": "^2.0.12",
"ansis": "^3.3.2",
Expand Down
4 changes: 1 addition & 3 deletions src/commands/project/delete/source.ts
Original file line number Diff line number Diff line change
Expand Up @@ -404,9 +404,7 @@ export class Source extends SfCommand<DeleteSourceJson> {
.filter(sourceComponentIsNotInMixedDeployDelete(this.mixedDeployDelete))
.flatMap((c) =>
// for custom labels, print each custom label to be deleted, not the whole file
isNonDecomposedCustomLabelsOrCustomLabel(c)
? [`${c.type.name}:${c.fullName}`]
: [c.xml, ...c.walkContent()] ?? []
isNonDecomposedCustomLabelsOrCustomLabel(c) ? [`${c.type.name}:${c.fullName}`] : [c.xml, ...c.walkContent()]
)
.concat(this.mixedDeployDelete.delete.map((fr) => `${fr.fullName} (${fr.filePath})`));

Expand Down
35 changes: 25 additions & 10 deletions src/commands/project/generate/manifest.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ export type ManifestGenerateCommandResult = {
path: string;
};

const xorFlags = ['metadata', 'source-dir', 'from-org'];
const atLeastOneOfFlags = ['metadata', 'source-dir', 'from-org'];

export class ManifestGenerate extends SfCommand<ManifestGenerateCommandResult> {
public static readonly summary = messages.getMessage('summary');
Expand All @@ -53,14 +53,14 @@ export class ManifestGenerate extends SfCommand<ManifestGenerateCommandResult> {
metadata: arrayWithDeprecation({
char: 'm',
summary: messages.getMessage('flags.metadata.summary'),
exactlyOne: xorFlags,
exclusive: ['source-dir'],
}),
'source-dir': arrayWithDeprecation({
char: 'p',
aliases: ['sourcepath'],
deprecateAliases: true,
summary: messages.getMessage('flags.source-dir.summary'),
exactlyOne: xorFlags,
exclusive: ['metadata'],
}),
name: Flags.string({
char: 'n',
Expand All @@ -85,11 +85,18 @@ export class ManifestGenerate extends SfCommand<ManifestGenerateCommandResult> {
char: 'c',
dependsOn: ['from-org'],
}),
'exclude-metadata': Flags.string({
multiple: true,
delimiter: ',',
summary: messages.getMessage('flags.exclude-metadata.summary'),
dependsOn: ['from-org'],
exclusive: ['metadata'],
}),
'from-org': Flags.custom({
summary: messages.getMessage('flags.from-org.summary'),
exactlyOne: xorFlags,
aliases: ['fromorg'],
deprecateAliases: true,
exclusive: ['source-dir'],
parse: async (input: string | undefined) => (input ? Org.create({ aliasOrUsername: input }) : undefined),
})(),
'output-dir': Flags.string({
Expand All @@ -102,6 +109,12 @@ export class ManifestGenerate extends SfCommand<ManifestGenerateCommandResult> {

public async run(): Promise<ManifestGenerateCommandResult> {
const { flags } = await this.parse(ManifestGenerate);

// We need at least one of these flags (but could be more than 1): 'metadata', 'source-dir', 'from-org'
if (!Object.keys(flags).some((f) => atLeastOneOfFlags.includes(f))) {
throw Error(`provided flags must include at least one of: ${atLeastOneOfFlags.toString()}`);
}

// convert the manifesttype into one of the "official" manifest names
// if no manifesttype flag passed, use the manifestname?flag
// if no manifestname flag, default to 'package.xml'
Expand All @@ -114,12 +127,14 @@ export class ManifestGenerate extends SfCommand<ManifestGenerateCommandResult> {
const componentSet = await ComponentSetBuilder.build({
apiversion: flags['api-version'] ?? (await getSourceApiVersion()),
sourcepath: flags['source-dir'],
metadata: flags.metadata
? {
metadataEntries: flags.metadata,
directoryPaths: await getPackageDirs(),
}
: undefined,
metadata:
flags.metadata ?? flags['exclude-metadata']
? {
metadataEntries: flags.metadata ?? [],
directoryPaths: await getPackageDirs(),
excludedEntries: flags['exclude-metadata'],
}
: undefined,
org: flags['from-org']
? {
username: flags['from-org'].getUsername() as string,
Expand Down
6 changes: 5 additions & 1 deletion test/tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@
"extends": "@salesforce/dev-config/tsconfig-test-strict-esm",
"include": ["./**/*.ts"],
"compilerOptions": {
"skipLibCheck": true
"skipLibCheck": true,
"baseUrl": "..",
"paths": {
"@salesforce/source-deploy-retrieve": ["node_modules/@salesforce/source-deploy-retrieve"]
}
}
}
5 changes: 4 additions & 1 deletion tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,10 @@
"outDir": "lib",
"rootDir": "src",
"skipLibCheck": true,
"baseUrl": "."
"baseUrl": ".",
"paths": {
"@salesforce/source-deploy-retrieve": ["node_modules/@salesforce/source-deploy-retrieve"]
}
},
"include": ["./src/**/*.ts"]
}
Loading
Loading