mirror of
https://github.com/QwenLM/qwen-code.git
synced 2025-12-19 09:33:53 +00:00
101 lines
3.0 KiB
JavaScript
101 lines
3.0 KiB
JavaScript
#!/usr/bin/env node
|
||
|
||
/**
|
||
* @license
|
||
* Copyright 2025 Qwen
|
||
* SPDX-License-Identifier: Apache-2.0
|
||
*/
|
||
|
||
import { execSync } from 'node:child_process';
|
||
import { fileURLToPath } from 'node:url';
|
||
import path from 'node:path';
|
||
import fs from 'node:fs';
|
||
|
||
const __filename = fileURLToPath(import.meta.url);
|
||
const __dirname = path.dirname(__filename);
|
||
|
||
// Get the package root directory
|
||
const packageRoot = path.join(__dirname, '..');
|
||
const vendorDir = path.join(packageRoot, 'vendor', 'ripgrep');
|
||
|
||
/**
|
||
* Remove quarantine attribute and set executable permissions on macOS/Linux
|
||
* This script never throws errors to avoid blocking npm workflows.
|
||
*/
|
||
function setupRipgrepBinaries() {
|
||
try {
|
||
if (!fs.existsSync(vendorDir)) {
|
||
console.log('ℹ Vendor directory not found, skipping ripgrep setup');
|
||
return;
|
||
}
|
||
|
||
const platform = process.platform;
|
||
const arch = process.arch;
|
||
|
||
// Determine the binary directory based on platform and architecture
|
||
let binaryDir;
|
||
if (platform === 'darwin' || platform === 'linux') {
|
||
const archStr = arch === 'x64' || arch === 'arm64' ? arch : null;
|
||
if (archStr) {
|
||
binaryDir = path.join(vendorDir, `${archStr}-${platform}`);
|
||
}
|
||
} else if (platform === 'win32') {
|
||
// Windows doesn't need these fixes
|
||
console.log('ℹ Windows detected, skipping ripgrep setup');
|
||
return;
|
||
}
|
||
|
||
if (!binaryDir || !fs.existsSync(binaryDir)) {
|
||
console.log(
|
||
`ℹ Binary directory not found for ${platform}-${arch}, skipping ripgrep setup`,
|
||
);
|
||
return;
|
||
}
|
||
|
||
const rgBinary = path.join(binaryDir, 'rg');
|
||
|
||
if (!fs.existsSync(rgBinary)) {
|
||
console.log(`ℹ Ripgrep binary not found at ${rgBinary}, skipping setup`);
|
||
return;
|
||
}
|
||
|
||
try {
|
||
// Set executable permissions
|
||
fs.chmodSync(rgBinary, 0o755);
|
||
console.log(`✓ Set executable permissions on ${rgBinary}`);
|
||
|
||
// On macOS, remove quarantine attribute
|
||
if (platform === 'darwin') {
|
||
try {
|
||
execSync(`xattr -d com.apple.quarantine "${rgBinary}"`, {
|
||
stdio: 'pipe',
|
||
});
|
||
console.log(`✓ Removed quarantine attribute from ${rgBinary}`);
|
||
} catch {
|
||
// Quarantine attribute might not exist, which is fine
|
||
console.log('ℹ Quarantine attribute not present or already removed');
|
||
}
|
||
}
|
||
} catch (error) {
|
||
console.log(
|
||
`⚠ Could not complete ripgrep setup: ${error.message || 'Unknown error'}`,
|
||
);
|
||
console.log(' This is not critical - ripgrep may still work correctly');
|
||
}
|
||
} catch (error) {
|
||
console.log(
|
||
`⚠ Ripgrep setup encountered an issue: ${error.message || 'Unknown error'}`,
|
||
);
|
||
console.log(' Continuing anyway - this should not affect functionality');
|
||
}
|
||
}
|
||
|
||
// Wrap the entire execution to ensure no errors escape to npm
|
||
try {
|
||
setupRipgrepBinaries();
|
||
} catch {
|
||
// Last resort catch - never let errors block npm
|
||
console.log('⚠ Postinstall script encountered an unexpected error');
|
||
console.log(' This will not affect the installation');
|
||
}
|