Skip to content

Commit

Permalink
refactor: ensure only files in package directories are considered
Browse files Browse the repository at this point in the history
  • Loading branch information
mcarvin8 committed Aug 6, 2024
1 parent 4cbf6a8 commit 09d87e3
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 14 deletions.
22 changes: 22 additions & 0 deletions src/service/getPackageDirectories.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
'use strict';
/* eslint-disable no-await-in-loop */

import { existsSync } from 'node:fs';
import { readFile } from 'node:fs/promises';
import { resolve } from 'node:path';

import { SfdxProject } from './types.js';
import { getRepoRoot } from './getRepoRoot.js';

export async function getPackageDirectories(): Promise<{ repoRoot: string; packageDirectories: string[] }> {
const repoRoot = await getRepoRoot();
const dxConfigFilePath = resolve(repoRoot, 'sfdx-project.json');
if (!existsSync(dxConfigFilePath)) {
throw Error(`Cannot find sfdx-project.json in the root folder: ${repoRoot}`);
}

const sfdxProjectRaw: string = await readFile(dxConfigFilePath, 'utf-8');
const sfdxProject: SfdxProject = JSON.parse(sfdxProjectRaw) as SfdxProject;
const packageDirectories = sfdxProject.packageDirectories.map((directory) => directory.path);
return { repoRoot, packageDirectories };
}
40 changes: 29 additions & 11 deletions src/service/validateClassPaths.ts
Original file line number Diff line number Diff line change
@@ -1,27 +1,32 @@
'use strict';
/* eslint-disable no-await-in-loop */
/* eslint-disable no-console */

import { promises as fsPromises, readFile, stat, readdir } from 'node:fs';
import git from 'isomorphic-git';

import { getRepoRoot } from './getRepoRoot.js';
import { getPackageDirectories } from './getPackageDirectories.js';

export async function validateClassPaths(
unvalidatedClasses: string[],
toCommitHash: string
): Promise<{ validatedClasses: Set<string>; warnings: string[] }> {
const repoRoot = await getRepoRoot();
const { repoRoot, packageDirectories } = await getPackageDirectories();
process.chdir(repoRoot);
const fs = { promises: fsPromises, readFile, stat, readdir };
const repoFiles = await git.listFiles({ fs, dir: repoRoot, ref: toCommitHash });
const warnings: string[] = [];

const validatedClasses: Set<string> = new Set();
for (const unvalidatedClass of unvalidatedClasses) {
let validated: boolean = false;

const fileExists = await fileExistsInCommit(`${unvalidatedClass}.cls`, toCommitHash, repoRoot);
if (fileExists) {
validatedClasses.add(unvalidatedClass);
validated = true;
for (const packageDirectory of packageDirectories) {
const fileExists = fileExistsInCommit(`${unvalidatedClass}.cls`, repoFiles, packageDirectory);
if (fileExists) {
validatedClasses.add(unvalidatedClass);
validated = true;
break;
}
}
if (!validated)
warnings.push(
Expand All @@ -31,12 +36,25 @@ export async function validateClassPaths(
return { validatedClasses, warnings };
}

async function fileExistsInCommit(filePath: string, commitHash: string, directory: string): Promise<boolean> {
function fileExistsInCommit(filePath: string, repoFiles: string[], packageDirectory: string): boolean {
try {
const fs = { promises: fsPromises, readFile, stat, readdir };
const files = await git.listFiles({ fs, dir: directory, ref: commitHash });
return files.some((file) => file.endsWith(filePath));
console.log('Checking files for package directory:', packageDirectory);
console.log('Repo files:', repoFiles);

const filteredFiles = repoFiles.filter((file) => {
const matches = file.startsWith(packageDirectory);
console.log(`Checking if "${file}" starts with "${packageDirectory}": ${matches}`);
return matches;
});

console.log('Filtered files:', filteredFiles);

const fileExists = filteredFiles.some((file) => file.endsWith(filePath));
console.log(`Does file "${filePath}" exist in "${packageDirectory}"?`, fileExists);

return fileExists;
} catch (error) {
console.error('Error in fileExistsInCommit:', error);
return false;
}
}
6 changes: 3 additions & 3 deletions test/commands/delta/warnings.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -48,19 +48,19 @@ describe('confirm warnings are generated when files cannot be found in a package
}
fromSha = await createTemporaryCommit(
'chore: initial commit with Apex::TestClass00::Apex',
'SandboxTes44t.cls',
'SandboxTest.cls',
'dummy 1',
git
);
await createTemporaryCommit(
'chore: initial commit with Apex::SandboxTest::Apex',
'TestClass34.cls',
'TestClass3.cls',
'dummy 11',
git
);
toSha = await createTemporaryCommit(
'chore: adding new tests Apex::TestClass3 TestClass4::Apex',
'TestClass44.cls',
'TestClass4.cls',
'dummy 2',
git
);
Expand Down

0 comments on commit 09d87e3

Please sign in to comment.