mirror of
https://github.com/abhigyanpatwari/GitNexus.git
synced 2026-09-06 08:16:02 +00:00
* fix: restore tree-sitter-swift postinstall patch for macOS ARM64 PR #516 (77dcb06) deleted `scripts/patch-tree-sitter-swift.cjs` and the `postinstall` script entry when bumping to `tree-sitter-swift@0.7.1`, since 0.7.1 ships prebuilt darwin-arm64 binaries and no longer needs the patch. PR #538 (01ddc3e) then had to revert `tree-sitter-swift` back to `^0.6.0` (and `tree-sitter` back to `^0.21.1`) because `npm overrides` doesn't apply when gitnexus is installed via `npx -y` (gitnexus isn't the root project, so overrides are silently ignored, producing ERESOLVE errors). PR #538 reverted the grammar package changes but did not restore the patch script, leaving `tree-sitter-swift@0.6.0` unable to build its native binding on macOS ARM64. The symptom is `gitnexus analyze` printing "Skipping swift" or "swift parser not available". `Dockerfile.test` still references `node scripts/patch-tree-sitter-swift.cjs` (added in the same PR #516), confirming the regression — the test image build is also broken. This commit restores the patch script from commit `0c8ec95` (the last revision before it was deleted) and re-adds the `postinstall` entry to `package.json`. No logic changes — it is an exact restoration. The TODO comment in the script ("Remove this script when tree-sitter is upgraded to ^0.22.x") still applies. * style: run prettier on patch-tree-sitter-swift.cjs
78 lines
3 KiB
JavaScript
78 lines
3 KiB
JavaScript
#!/usr/bin/env node
|
|
/**
|
|
* WORKAROUND: tree-sitter-swift@0.6.0 binding.gyp build failure
|
|
*
|
|
* Background:
|
|
* tree-sitter-swift@0.6.0's binding.gyp contains an "actions" array that
|
|
* invokes `tree-sitter generate` to regenerate parser.c from grammar.js.
|
|
* This is intended for grammar developers, but the published npm package
|
|
* already ships pre-generated parser files (parser.c, scanner.c), so the
|
|
* actions are unnecessary for consumers. Since consumers don't have
|
|
* tree-sitter-cli installed, the actions always fail during `npm install`.
|
|
*
|
|
* Why we can't just upgrade:
|
|
* tree-sitter-swift@0.7.1 fixes this (removes postinstall, ships prebuilds),
|
|
* but it requires tree-sitter@^0.22.1. The upstream project pins tree-sitter
|
|
* to ^0.21.0 and all other grammar packages depend on that version.
|
|
* Upgrading tree-sitter would be a separate breaking change.
|
|
*
|
|
* How this workaround works:
|
|
* 1. tree-sitter-swift's own postinstall fails (npm warns but continues)
|
|
* 2. This script runs as gitnexus's postinstall
|
|
* 3. It removes the "actions" array from binding.gyp
|
|
* 4. It rebuilds the native binding with the cleaned binding.gyp
|
|
*
|
|
* TODO: Remove this script when tree-sitter is upgraded to ^0.22.x,
|
|
* which allows using tree-sitter-swift@0.7.1+ directly.
|
|
*/
|
|
const fs = require('fs');
|
|
const path = require('path');
|
|
const { execSync } = require('child_process');
|
|
|
|
const swiftDir = path.join(__dirname, '..', 'node_modules', 'tree-sitter-swift');
|
|
const bindingPath = path.join(swiftDir, 'binding.gyp');
|
|
|
|
try {
|
|
if (!fs.existsSync(bindingPath)) {
|
|
process.exit(0);
|
|
}
|
|
|
|
const content = fs.readFileSync(bindingPath, 'utf8');
|
|
let needsRebuild = false;
|
|
|
|
if (content.includes('"actions"')) {
|
|
// Strip Python-style comments (#) and trailing commas before JSON parsing
|
|
const cleaned = content
|
|
.replace(/#[^\n]*/g, '') // Remove # comments
|
|
.replace(/,(\s*[\]}])/g, '$1'); // Remove trailing commas before ] or }
|
|
const gyp = JSON.parse(cleaned);
|
|
|
|
if (gyp.targets && gyp.targets[0] && gyp.targets[0].actions) {
|
|
delete gyp.targets[0].actions;
|
|
fs.writeFileSync(bindingPath, JSON.stringify(gyp, null, 2) + '\n');
|
|
console.log('[tree-sitter-swift] Patched binding.gyp (removed actions array)');
|
|
needsRebuild = true;
|
|
}
|
|
}
|
|
|
|
// Check if native binding exists
|
|
const bindingNode = path.join(swiftDir, 'build', 'Release', 'tree_sitter_swift_binding.node');
|
|
if (!fs.existsSync(bindingNode)) {
|
|
needsRebuild = true;
|
|
}
|
|
|
|
if (needsRebuild) {
|
|
console.log('[tree-sitter-swift] Rebuilding native binding...');
|
|
execSync('npx node-gyp rebuild', {
|
|
cwd: swiftDir,
|
|
stdio: 'pipe',
|
|
timeout: 120000,
|
|
});
|
|
console.log('[tree-sitter-swift] Native binding built successfully');
|
|
}
|
|
} catch (err) {
|
|
console.warn('[tree-sitter-swift] Could not build native binding:', err.message);
|
|
console.warn(
|
|
'[tree-sitter-swift] You may need to manually run: cd node_modules/tree-sitter-swift && npx node-gyp rebuild',
|
|
);
|
|
}
|