Skip to content
This repository was archived by the owner on Mar 18, 2024. It is now read-only.

Commit c9316dd

Browse files
author
sfopsbot
committed
feat(diff): add an option for override
Add an option to ovveride diff package baseline from JSON file stored in the repo
1 parent 941b69c commit c9316dd

File tree

1 file changed

+88
-108
lines changed

1 file changed

+88
-108
lines changed

packages/core/src/package/packageCreators/CreateDiffPackageImpl.ts

Lines changed: 88 additions & 108 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,6 @@ import Component from '../../dependency/Component';
1818
import PackageComponentDiff from '../diff/PackageComponentDiff';
1919

2020
export default class CreateDiffPackageImp extends CreateSourcePackageImpl {
21-
22-
23-
24-
2521
public constructor(
2622
protected projectDirectory: string,
2723
protected sfpPackage: SfpPackage,
@@ -36,104 +32,97 @@ export default class CreateDiffPackageImp extends CreateSourcePackageImpl {
3632
return PackageType.Diff;
3733
}
3834

39-
printAdditionalPackageSpecificHeaders() { }
35+
printAdditionalPackageSpecificHeaders() {}
4036

4137
isEmptyPackage(projectDirectory: string, packageDirectory: string) {
4238
return PackageEmptyChecker.isEmptyFolder(projectDirectory, packageDirectory);
4339
}
4440

4541
async preCreatePackage(sfpPackage: SfpPackage) {
46-
4742
const devhubOrg = await SFPOrg.create({ aliasOrUsername: this.packageCreationParams.devHub });
43+
4844
//Fetch Baseline commit from DevHub
4945
let commitsOfPackagesInstalledInDevHub = await this.getCommitsOfPackagesInstalledInDevHub(devhubOrg);
5046

5147
if (this.packageCreationParams.revisionFrom) {
5248
this.sfpPackage.commitSHAFrom = this.packageCreationParams.revisionFrom;
53-
}
54-
else if (commitsOfPackagesInstalledInDevHub[this.sfpPackage.packageName]) {
49+
} else if (commitsOfPackagesInstalledInDevHub[this.sfpPackage.packageName]) {
5550
this.sfpPackage.commitSHAFrom = commitsOfPackagesInstalledInDevHub[this.sfpPackage.packageName];
5651
} else {
5752
this.sfpPackage.commitSHAFrom = this.sfpPackage.sourceVersion;
5853
}
5954

60-
6155
if (this.packageCreationParams.revisionTo) {
6256
this.sfpPackage.commitSHATo = this.packageCreationParams.revisionTo;
63-
}
64-
else {
57+
} else {
6558
this.sfpPackage.commitSHATo = this.sfpPackage.sourceVersion;
6659
}
6760
}
6861

69-
7062
private async getCommitsOfPackagesInstalledInDevHub(diffTargetSfpOrg: SFPOrg) {
7163
let installedArtifacts = await diffTargetSfpOrg.getInstalledArtifacts();
72-
let packagesInstalledInOrgMappedToCommits =
73-
await this.mapInstalledArtifactstoPkgAndCommits(installedArtifacts);
64+
let packagesInstalledInOrgMappedToCommits = await this.mapInstalledArtifactstoPkgAndCommits(installedArtifacts);
7465
return packagesInstalledInOrgMappedToCommits;
7566
}
7667

77-
7868
public async createPackage(sfpPackage: SfpPackage) {
79-
80-
8169
//Unresolved SHAs can be same if the package is not installed in the org or is the same
82-
if(this.sfpPackage.commitSHAFrom!=this.sfpPackage.commitSHATo)
83-
{
84-
try {
85-
let packageComponentDiffer: PackageComponentDiff = new PackageComponentDiff(
86-
this.logger,
87-
this.sfpPackage.packageName,
88-
this.sfpPackage.commitSHAFrom,
89-
this.sfpPackage.commitSHATo,
90-
true
91-
);
92-
await packageComponentDiffer.build(path.join(sfpPackage.workingDirectory, 'diff'));
93-
} catch (error) {
94-
//if both are same after git resolution.. just do nothing, treat is a normal source package
95-
if (error.message.includes("Unable to compute diff, as both commits are same"))
96-
{
97-
SFPLogger.log(
98-
`Both commits are same, treating it as an empty package`,
99-
LoggerLevel.WARN,
100-
this.logger
70+
if (this.sfpPackage.commitSHAFrom != this.sfpPackage.commitSHATo) {
71+
try {
72+
let packageComponentDiffer: PackageComponentDiff = new PackageComponentDiff(
73+
this.logger,
74+
this.sfpPackage.packageName,
75+
this.sfpPackage.commitSHAFrom,
76+
this.sfpPackage.commitSHATo,
77+
true
10178
);
102-
//Create an empty diff directory to force skip of packages
103-
const diffSrcDir = path.join( sfpPackage.workingDirectory, `diff/${sfpPackage.packageDirectory}`);
104-
fs.mkdirpSync(diffSrcDir);
105-
}
106-
else
107-
throw error;
108-
}
79+
await packageComponentDiffer.build(path.join(sfpPackage.workingDirectory, 'diff'));
80+
} catch (error) {
81+
//if both are same after git resolution.. just do nothing, treat is a normal source package
82+
if (error.message.includes('Unable to compute diff, as both commits are same')) {
83+
SFPLogger.log(
84+
`Both commits are same, treating it as an empty package`,
85+
LoggerLevel.WARN,
86+
this.logger
87+
);
88+
//Create an empty diff directory to force skip of packages
89+
const diffSrcDir = path.join(sfpPackage.workingDirectory, `diff/${sfpPackage.packageDirectory}`);
90+
fs.mkdirpSync(diffSrcDir);
91+
} else throw error;
92+
}
10993

110-
await this.introspectDiffPackageCreated(sfpPackage, this.params, this.logger);
94+
await this.introspectDiffPackageCreated(sfpPackage, this.params, this.logger);
11195

112-
await this.replaceSourceWithDiff(sfpPackage.workingDirectory, sfpPackage.packageDirectory, `diff/${sfpPackage.packageDirectory}`)
96+
await this.replaceSourceWithDiff(
97+
sfpPackage.workingDirectory,
98+
sfpPackage.packageDirectory,
99+
`diff/${sfpPackage.packageDirectory}`
100+
);
113101

114-
SFPStatsSender.logGauge('package.metadatacount', sfpPackage.metadataCount, {
115-
package: sfpPackage.packageName,
116-
type: sfpPackage.packageType,
117-
});
118-
}
102+
SFPStatsSender.logGauge('package.metadatacount', sfpPackage.metadataCount, {
103+
package: sfpPackage.packageName,
104+
type: sfpPackage.packageType,
105+
});
106+
}
119107
}
120108

121-
postCreatePackage(sfpPackage) { }
122-
109+
postCreatePackage(sfpPackage) {}
123110

124-
125-
private async replaceSourceWithDiff(workingDirectory: string, packageDirectory: string, diffPackageDirectory: string) {
111+
private async replaceSourceWithDiff(
112+
workingDirectory: string,
113+
packageDirectory: string,
114+
diffPackageDirectory: string
115+
) {
126116
const srcDir = path.join(workingDirectory, packageDirectory);
127117
const diffSrcDir = path.join(workingDirectory, diffPackageDirectory);
128118

129119
// Check if src directories exist, if so remove them
130-
if (fs.pathExistsSync(srcDir))
131-
await fs.remove(srcDir);
120+
if (fs.pathExistsSync(srcDir)) await fs.remove(srcDir);
132121

133122
// Rename diff/src directory to src
134-
if (fs.pathExistsSync(diffSrcDir))
135-
await fs.move(diffSrcDir, srcDir);
136-
else { // Ensure package directory exists
123+
if (fs.pathExistsSync(diffSrcDir)) await fs.move(diffSrcDir, srcDir);
124+
else {
125+
// Ensure package directory exists
137126
await fs.mkdirpSync(diffSrcDir);
138127
await fs.move(diffSrcDir, srcDir);
139128
}
@@ -147,69 +136,66 @@ export default class CreateDiffPackageImp extends CreateSourcePackageImpl {
147136
//remove diffSrcDir
148137
if (fs.pathExistsSync(path.join(workingDirectory, 'diff')))
149138
fs.rmSync(path.join(workingDirectory, 'diff'), { recursive: true, force: true });
150-
151-
152139
}
153140

154-
155-
async mapInstalledArtifactstoPkgAndCommits(
156-
installedArtifacts: any,
157-
) {
141+
async mapInstalledArtifactstoPkgAndCommits(installedArtifacts: any) {
158142
let packagesMappedToLastKnownCommitId: { [p: string]: string } = {};
159-
if (installedArtifacts != null) {
160-
packagesMappedToLastKnownCommitId =
161-
getPackagesToCommits(installedArtifacts);
162-
}
143+
packagesMappedToLastKnownCommitId = await getPackagesToCommits(installedArtifacts);
144+
163145
return packagesMappedToLastKnownCommitId;
164146

165-
function getPackagesToCommits(installedArtifacts: any): {
166-
[p: string]: string;
167-
} {
147+
async function getPackagesToCommits(installedArtifacts: any): Promise<{ [p: string]: string }> {
168148
const packagesToCommits: { [p: string]: string } = {};
149+
let jsonOverrides = {};
150+
151+
// Add an option to override diff package from during debugging
152+
// Also useful for when the record is yet to be baselined
153+
try {
154+
const jsonData = await fs.readFile('diffPackageOverrides.json', 'utf8');
155+
jsonOverrides = JSON.parse(jsonData);
156+
} catch (error) {
157+
console.log('No JSON override file found or there is an error reading it');
158+
}
169159

170-
// Construct map of artifact and associated commit Id
171-
installedArtifacts.forEach((artifact) => {
172-
packagesToCommits[artifact.Name] = artifact.CommitId__c;
173-
//Override for debugging purposes
174-
if (process.env.VALIDATE_OVERRIDE_PKG)
175-
packagesToCommits[process.env.VALIDATE_OVERRIDE_PKG] =
176-
process.env.VALIDATE_PKG_COMMIT_ID;
160+
// Merge the installedArtifacts data with the JSON overrides
161+
if (installedArtifacts) {
162+
installedArtifacts.forEach((artifact) => {
163+
packagesToCommits[artifact.Name] = artifact.CommitId__c;
164+
});
165+
}
166+
167+
// Add additional packages from the JSON overrides that are not in installedArtifacts
168+
Object.keys(jsonOverrides).forEach((pkgName) => {
169+
if (!packagesToCommits.hasOwnProperty(pkgName)) {
170+
packagesToCommits[pkgName] = jsonOverrides[pkgName];
171+
}
177172
});
178173

179-
if (process.env.VALIDATE_REMOVE_PKG)
180-
delete packagesToCommits[process.env.VALIDATE_REMOVE_PKG];
174+
if (process.env.VALIDATE_REMOVE_PKG) delete packagesToCommits[process.env.VALIDATE_REMOVE_PKG];
181175

182176
return packagesToCommits;
183177
}
184178
}
185179

186-
187-
188180
private async introspectDiffPackageCreated(
189181
sfpPackage: SfpPackage,
190182
packageParams: SfpPackageParams,
191183
logger: Logger
192184
): Promise<void> {
193-
194-
195185
let workingDirectory = path.join(sfpPackage.workingDirectory, 'diff');
196186
if (fs.existsSync(path.join(workingDirectory, sfpPackage.packageDirectory))) {
197187
let changedComponents = new PackageToComponent(
198188
sfpPackage.packageName,
199189
path.join(workingDirectory, sfpPackage.packageDirectory)
200190
).generateComponents();
201191

202-
203-
204192
let impactedApexTestClassFetcher: ImpactedApexTestClassFetcher = new ImpactedApexTestClassFetcher(
205193
sfpPackage,
206194
changedComponents,
207195
logger
208196
);
209197
let impactedTestClasses = await impactedApexTestClassFetcher.getImpactedTestClasses();
210198

211-
212-
213199
//Convert again for finding the values in the diff package
214200
let sourceToMdapiConvertor = new SourceToMDAPIConvertor(
215201
workingDirectory,
@@ -222,24 +208,23 @@ export default class CreateDiffPackageImp extends CreateSourcePackageImpl {
222208

223209
const packageManifest: PackageManifest = await PackageManifest.create(mdapiDirPath);
224210

225-
226211
sfpPackage.payload = packageManifest.manifestJson;
227212
sfpPackage.apexTestClassses = impactedTestClasses;
228-
sfpPackage.apexClassWithOutTestClasses = getOnlyChangedClassesFromPackage(changedComponents, sfpPackage.apexClassesSortedByTypes);
213+
sfpPackage.apexClassWithOutTestClasses = getOnlyChangedClassesFromPackage(
214+
changedComponents,
215+
sfpPackage.apexClassesSortedByTypes
216+
);
229217
sfpPackage.isApexFound = packageManifest.isApexInPackage();
230218
sfpPackage.isProfilesFound = packageManifest.isProfilesInPackage();
231219
sfpPackage.isPermissionSetGroupFound = packageManifest.isPermissionSetGroupsFoundInPackage();
232220
sfpPackage.isPayLoadContainTypesSupportedByProfiles = packageManifest.isPayLoadContainTypesSupportedByProfiles();
233221

234-
235222
sfpPackage.metadataCount = await MetadataCount.getMetadataCount(
236223
workingDirectory,
237224
sfpPackage.packageDescriptor.path
238225
);
239226
rimraf.sync(mdapiDirPath);
240-
}
241-
else {
242-
227+
} else {
243228
//Souce Diff Directory is empty
244229
sfpPackage.payload = {};
245230
sfpPackage.apexTestClassses = [];
@@ -251,7 +236,6 @@ export default class CreateDiffPackageImp extends CreateSourcePackageImpl {
251236
sfpPackage.metadataCount = 0;
252237
}
253238

254-
255239
function getOnlyChangedClassesFromPackage(
256240
changedComponents: Component[],
257241
apexClassesSortedByTypes: ApexSortedByType
@@ -267,25 +251,21 @@ export default class CreateDiffPackageImp extends CreateSourcePackageImpl {
267251
}
268252

269253
// Get the names of all classes in the ApexSortedByType
270-
let apexClassNames = apexClassesSortedByTypes.class.map(cls => cls.name);
271-
let interfaces = apexClassesSortedByTypes.interface.map(cls => cls.name);
272-
const apexTestClassNames = apexClassesSortedByTypes.testClass.map(cls => cls.name);
273-
apexClassNames = apexClassNames.filter(name => !apexTestClassNames.includes(name));
274-
apexClassNames = apexClassNames.filter(name => !interfaces.includes(name));
275-
254+
let apexClassNames = apexClassesSortedByTypes.class.map((cls) => cls.name);
255+
let interfaces = apexClassesSortedByTypes.interface.map((cls) => cls.name);
256+
const apexTestClassNames = apexClassesSortedByTypes.testClass.map((cls) => cls.name);
257+
apexClassNames = apexClassNames.filter((name) => !apexTestClassNames.includes(name));
258+
apexClassNames = apexClassNames.filter((name) => !interfaces.includes(name));
276259

277260
// Filter changedComponents based on class names in ApexSortedByType and type === 'ApexClass'
278-
const filteredComponents = changedComponents.filter(component =>
279-
apexClassNames.includes(component.fullName) && component.type === 'ApexClass'
261+
const filteredComponents = changedComponents.filter(
262+
(component) => apexClassNames.includes(component.fullName) && component.type === 'ApexClass'
280263
);
281264

282265
// Extract the fullName property from the filtered components
283-
const filteredChangedClasses = filteredComponents.map(component => component.fullName);
266+
const filteredChangedClasses = filteredComponents.map((component) => component.fullName);
284267

285268
return filteredChangedClasses;
286269
}
287-
288270
}
289-
290-
291271
}

0 commit comments

Comments
 (0)