@@ -245,15 +245,15 @@ const getBinaries = (dir) => {
245245 if ( appDirectories . some ( ( app ) => f . startsWith ( app + "/" ) ) ) {
246246 return false ;
247247 }
248-
248+
249249 const filePath = path . resolve ( dir , f ) ;
250250 const fileOutput = execSync ( `file ${ JSON . stringify ( filePath ) } ` ) . toString ( ) ;
251-
251+
252252 // Check if it's an executable binary or script
253- return fileOutput . includes ( "executable" ) ||
254- fileOutput . includes ( "ELF" ) ||
255- fileOutput . includes ( "Mach-O" ) ||
256- fileOutput . includes ( "script" ) ;
253+ return fileOutput . includes ( "executable" ) ||
254+ fileOutput . includes ( "ELF" ) ||
255+ fileOutput . includes ( "Mach-O" ) ||
256+ fileOutput . includes ( "script" ) ;
257257 } catch {
258258 return false ;
259259 }
@@ -263,40 +263,40 @@ const getBinaries = (dir) => {
263263 const looksLikeBinary = ( f ) => {
264264 const filename = path . basename ( f ) . toLowerCase ( ) ;
265265 const dirname = path . dirname ( f ) . toLowerCase ( ) ;
266-
266+
267267 // Skip files in common non-binary directories
268- if ( dirname . includes ( "doc" ) || dirname . includes ( "docs" ) || dirname . includes ( "man" ) ||
269- dirname . includes ( "runtime" ) || dirname . includes ( "lib" ) || dirname . includes ( "share" ) ) {
268+ if ( dirname . includes ( "doc" ) || dirname . includes ( "docs" ) || dirname . includes ( "man" ) ||
269+ dirname . includes ( "runtime" ) || dirname . includes ( "lib" ) || dirname . includes ( "share" ) ) {
270270 return false ;
271271 }
272-
272+
273273 // Skip obvious non-binary files
274- if ( filename . includes ( "readme" ) || filename . includes ( "license" ) ||
275- filename . includes ( "changelog" ) || filename . includes ( "copying" ) ||
276- filename . includes ( "install" ) || filename . includes ( "makefile" ) ||
277- filename . includes ( ".md" ) || filename . includes ( ".txt" ) ||
278- filename . includes ( ".1" ) || filename . includes ( ".json" ) ||
279- filename . includes ( ".yaml" ) || filename . includes ( ".yml" ) ||
280- filename . includes ( ".toml" ) || filename . includes ( ".cfg" ) ||
281- filename . includes ( ".conf" ) || filename . includes ( ".ini" ) ) {
274+ if ( filename . includes ( "readme" ) || filename . includes ( "license" ) ||
275+ filename . includes ( "changelog" ) || filename . includes ( "copying" ) ||
276+ filename . includes ( "install" ) || filename . includes ( "makefile" ) ||
277+ filename . includes ( ".md" ) || filename . includes ( ".txt" ) ||
278+ filename . includes ( ".1" ) || filename . includes ( ".json" ) ||
279+ filename . includes ( ".yaml" ) || filename . includes ( ".yml" ) ||
280+ filename . includes ( ".toml" ) || filename . includes ( ".cfg" ) ||
281+ filename . includes ( ".conf" ) || filename . includes ( ".ini" ) ) {
282282 return false ;
283283 }
284-
284+
285285 // Common binary naming patterns
286286 const binaryPatterns = [
287287 / ^ [ a - z 0 - 9 _ - ] + $ / , // Simple name like hx, git, node
288288 / ^ [ a - z 0 - 9 _ - ] + \. ( e x e | b i n | r u n ) $ / , // Extensions
289289 ] ;
290-
290+
291291 return binaryPatterns . some ( pattern => pattern . test ( filename ) ) ;
292292 } ;
293293
294- const executableFiles = allFiles . filter ( isExecutable ) ;
295- const potentialBinaries = allFiles . filter ( looksLikeBinary ) ;
296-
294+ const executableFiles = allFiles . filter ( f => isExecutable ( f ) && looksLikeBinary ( f ) ) ;
295+ const potentialBinaries = allFiles . filter ( f => looksLikeBinary ( f ) && ! executableFiles . includes ( f ) ) ;
296+
297297 // Combine and remove duplicates
298298 binaries . push ( ...executableFiles ) ;
299- binaries . push ( ...potentialBinaries . filter ( f => ! executableFiles . includes ( f ) ) ) ;
299+ binaries . push ( ...potentialBinaries ) ;
300300
301301 return [ ...new Set ( binaries ) ] ; // Remove duplicates
302302} ;
@@ -316,15 +316,15 @@ const selectBinaries = async (binaries, packageName, logger = null, yesFlag = fa
316316 // Filter out obvious non-binaries for cleaner selection
317317 const filteredBinaries = binaries . filter ( f => {
318318 const filename = path . basename ( f ) . toLowerCase ( ) ;
319- return ! filename . includes ( 'readme' ) &&
320- ! filename . includes ( 'license' ) &&
321- ! filename . includes ( 'changelog' ) &&
322- ! filename . includes ( '.md' ) &&
323- ! filename . includes ( '.txt' ) &&
324- ! filename . includes ( '.1' ) && // man pages
325- ! f . includes ( 'doc/' ) &&
326- ! f . includes ( 'docs/' ) &&
327- ! f . includes ( 'man/' ) ;
319+ return ! filename . includes ( 'readme' ) &&
320+ ! filename . includes ( 'license' ) &&
321+ ! filename . includes ( 'changelog' ) &&
322+ ! filename . includes ( '.md' ) &&
323+ ! filename . includes ( '.txt' ) &&
324+ ! filename . includes ( '.1' ) && // man pages
325+ ! f . includes ( 'doc/' ) &&
326+ ! f . includes ( 'docs/' ) &&
327+ ! f . includes ( 'man/' ) ;
328328 } ) ;
329329
330330 // If filtering leaves us with just one, use it
@@ -390,15 +390,17 @@ const processExtractedPackages = async (
390390 outputDir ,
391391 selectedName ,
392392 checkPathFn ,
393- logger
393+ logger ,
394+ isMountedVolume = false ,
395+ yesFlag = false
394396) => {
395397 // If an .app bundle was extracted from the archive, install it as a macOS app
396398 const appBundle = binaries . find ( ( f ) => f . toLowerCase ( ) . endsWith ( ".app" ) ) ;
397399 if ( appBundle && process . platform === "darwin" ) {
398400 if ( logger ) {
399401 logger . log ( `Installing .app bundle from archive: ${ appBundle } ` ) ;
400402 }
401- const destinations = await installApp ( appBundle , outputDir , checkPathFn , logger ) ;
403+ const destinations = await installApp ( appBundle , outputDir , checkPathFn , logger , yesFlag ) ;
402404 return {
403405 method : "archive_app" ,
404406 destinations,
@@ -428,7 +430,7 @@ const processExtractedPackages = async (
428430
429431 if ( appFile ) {
430432 logger . log ( `Installing .app bundle from DMG: ${ appFile } ` ) ;
431- const destinations = await installApp ( appFile , mountDir , checkPathFn , logger ) ;
433+ const destinations = await installApp ( appFile , mountDir , checkPathFn , logger , yesFlag ) ;
432434 return {
433435 method : "dmg_app" ,
434436 destinations,
@@ -590,10 +592,10 @@ const installBinaries = async (
590592
591593 for ( const binary of binaries ) {
592594 const binaryPath = path . join ( outputDir , binary ) ;
593- const cleanName = extractName ( { name : selectedName } ) ;
595+ const cleanName = path . basename ( binary ) ;
594596 const dest = path . join ( os . homedir ( ) , ".local" , "bin" , cleanName ) ;
595597
596- await checkPathFn ( dest , yesFlag ) ;
598+ await checkPathFn ( dest , yesFlag ) ;
597599
598600 // Don't try to chmod files on mounted volumes (like DMGs)
599601 if ( ! isMountedVolume ) {
0 commit comments