Skip to content

Commit 2b0dbaf

Browse files
authored
NEW @W-19365711@ Converted package versioning enforcement to git hooks (#339)
1 parent 4ed3bfa commit 2b0dbaf

File tree

7 files changed

+54
-10
lines changed

7 files changed

+54
-10
lines changed

.github/workflows/verify-pr.yml

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,20 +49,21 @@ jobs:
4949
- uses: actions/setup-node@v4
5050
with:
5151
node-version: 'lts/*'
52+
- run: npm install
5253
- name: Validate that changed packages are versioned as snapshots
5354
if: ${{ needs.check_for_postrelease_keyword.outputs.is-postrelease == 'false' }}
5455
run: |
5556
BASE_SHA=${{ github.event.pull_request.base.sha }}
5657
HEAD_SHA=${{ github.event.pull_request.head.sha }}
57-
git diff --name-only $HEAD_SHA $BASE_SHA > changed_files.txt
58-
node ./.github/workflows/verify-pr/validate-changed-package-versions.js changed_files.txt
58+
git diff --name-only $HEAD_SHA $BASE_SHA > `pwd`/changed_files.txt
59+
node ./.node-scripts/validate-changed-package-versions.js `pwd`/changed_files.txt
5960
- name: Validate that packages properly depend on each other
6061
if: ${{ needs.check_for_postrelease_keyword.outputs.is-postrelease == 'false' }}
6162
run: |
6263
cd packages
6364
PACKAGE_NAMES=`ls`
6465
cd ..
65-
node ./.github/workflows/verify-pr/validate-package-interdependencies.js "$PACKAGE_NAMES"
66+
node ./.node-scripts/validate-package-interdependencies.js "$PACKAGE_NAMES"
6667
run_tests:
6768
runs-on: ${{ matrix.os }}
6869
strategy:

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,5 @@ dist/
55
coverage/
66
*.tsbuildinfo
77
*.tgz
8-
.sfdx
8+
.sfdx
9+
.scratchfile

.husky/pre-commit

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
git diff --name-only --cached --diff-filter=ACMR > `pwd`/.scratchfile
2+
node ./.node-scripts/validate-changed-package-versions.js `pwd`/.scratchfile
3+
cd packages
4+
PACKAGE_NAMES=`ls`
5+
cd ..
6+
node ./.node-scripts/validate-package-interdependencies.js "$PACKAGE_NAMES"

.github/workflows/verify-pr/validate-changed-package-versions.js renamed to .node-scripts/validate-changed-package-versions.js

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
const path = require('path');
22
const fs = require('fs');
3+
const cp = require('child_process');
4+
const semver = require('semver');
35

46
function main() {
57
const changedFiles = readChangedFilesFile(process.argv[2]);
@@ -39,7 +41,7 @@ function displayList(header, list) {
3941
}
4042

4143
function readChangedFilesFile(changedFilesFileName) {
42-
return fs.readFileSync(path.join(__dirname, '..', '..', '..', changedFilesFileName), 'utf-8').split('\n').map(s => s.trim());
44+
return fs.readFileSync(changedFilesFileName, 'utf-8').split('\n').map(s => s.trim());
4345
}
4446

4547
function identifyMeaningfullyChangedPackages(changedFiles) {
@@ -74,18 +76,31 @@ function isFileInTestFolder(changedFile) {
7476
function identifyIncorrectlyVersionedPackages(changedPackages) {
7577
const incorrectlyVersionedPackages = [];
7678
for (const changedPackage of changedPackages) {
77-
//A temporary workaround for the rename of the flowtest-engine package to flow-engine
78-
if (changedPackage === 'packages/code-analyzer-flowtest-engine') {
79-
continue;
80-
}
8179
const packageVersion = getPackageVersion(changedPackage);
8280
if (!packageVersion.endsWith('-SNAPSHOT')) {
8381
incorrectlyVersionedPackages.push(`${changedPackage} (currently versioned as ${packageVersion}) lacks a trailing "-SNAPSHOT"`);
82+
continue;
83+
}
84+
const releasedPackageVersion = getLatestReleasedVersion(changedPackage);
85+
if (semver.lte(semver.parse(packageVersion.slice(0, packageVersion.length - 9)), semver.parse(releasedPackageVersion))) {
86+
incorrectlyVersionedPackages.push(`${changedPackage} (currently versioned as ${packageVersion}) is not semantically ahead of latest published release ${releasedPackageVersion}`);
8487
}
8588
}
8689
return incorrectlyVersionedPackages;
8790
}
8891

92+
function getLatestReleasedVersion(changedPackage) {
93+
const publishedPackageName = JSON.parse(fs.readFileSync(path.join(changedPackage, 'package.json'), 'utf-8')).name;
94+
try {
95+
96+
return cp.execSync(`npm view ${publishedPackageName} version`, {
97+
encoding: 'utf-8'
98+
});
99+
} catch (e) {
100+
console.log(`NOTE: Could not fetch latest release version of ${publishedPackageName} (located in ${changedPackage}). Is that an error?`);
101+
return undefined;
102+
}
103+
}
89104

90105
function getPackageVersion(changedPackage) {
91106
const packageJsonPath = path.join(changedPackage, 'package.json');

.github/workflows/verify-pr/validate-package-interdependencies.js renamed to .node-scripts/validate-package-interdependencies.js

File renamed without changes.

package-lock.json

Lines changed: 18 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,15 @@
1717
"scrub": "npm run clean && npm run scrub --workspaces --if-present && rimraf node_modules && rimraf package-lock.json",
1818
"showcoverage-java": "npm run showcoverage-java --workspaces --if-present",
1919
"showcoverage-typescript": "open ./coverage/lcov-report/index.html",
20-
"showcoverage": "npm run showcoverage-java && npm run showcoverage-typescript"
20+
"showcoverage": "npm run showcoverage-java && npm run showcoverage-typescript",
21+
"prepare": "husky"
2122
},
2223
"devDependencies": {
2324
"cross-env": "^10.0.0",
25+
"husky": "^9.1.7",
2426
"jest": "^30.0.5",
2527
"rimraf": "^6.0.1",
28+
"semver": "^7.7.2",
2629
"ts-jest": "^29.4.1"
2730
},
2831
"jest": {

0 commit comments

Comments
 (0)