From 94b4871218f9e4a63ce5fa4194279613336ca3e4 Mon Sep 17 00:00:00 2001 From: Adrian Burgess <3983065+apburgess@users.noreply.github.com> Date: Thu, 4 Jun 2026 12:03:47 +0100 Subject: [PATCH 1/2] Fix 'doctor' command failing at Cocoapods stage when user uses ASDF. If the user is using ASDF the 'doctor' command may fail at the Cocoapods stage as it will be using the global tool definitions instead of those specified by the project (if any). This fixes the problem by generating a .tool-versions file with the correct settings in the temp directory used for the Cocoapods test. --- packages/doctor/src/sys-info.ts | 24 +++++++++++++++++++++ packages/doctor/src/wrappers/file-system.ts | 15 +++++++++++-- 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/packages/doctor/src/sys-info.ts b/packages/doctor/src/sys-info.ts index 7c71d43491..eaae398ef3 100644 --- a/packages/doctor/src/sys-info.ts +++ b/packages/doctor/src/sys-info.ts @@ -424,6 +424,29 @@ export class SysInfo implements NativeScriptDoctor.ISysInfo { tempDirectory, ); const xcodeProjectDir = path.join(tempDirectory, "cocoapods"); + + // If ADSF version manager is installed, get the config for the project directory and write it to the temporary project directory + const asdfResult = await this.childProcess.spawnFromEvent( + "asdf", + ["list", "ruby"], + "exit", + ); + const asdfVersionMatch = (asdfResult.stdout as string).match( + SysInfo.VERSION_REGEXP, + ); + + if (asdfVersionMatch?.[0]) { + const asdfVersion = asdfVersionMatch[0]; + const asdfConfigPath = path.join(xcodeProjectDir, ".tool-versions"); + const wroteASDFConfig = this.fileSystem.appendFile( + asdfConfigPath, + `ruby ${asdfVersion}`, + ); + if (!wroteASDFConfig) { + console.warn(`Cocoapods invocation may fail, check asdf config`); + } + } + const spawnResult = await this.childProcess.spawnFromEvent( "pod", ["install"], @@ -432,6 +455,7 @@ export class SysInfo implements NativeScriptDoctor.ISysInfo { ); return !spawnResult.exitCode; } catch (err) { + console.log(`Pod command failed - ${err}`); return false; } finally { this.fileSystem.deleteEntry(tempDirectory); diff --git a/packages/doctor/src/wrappers/file-system.ts b/packages/doctor/src/wrappers/file-system.ts index ac7a05ed95..759c826d0c 100644 --- a/packages/doctor/src/wrappers/file-system.ts +++ b/packages/doctor/src/wrappers/file-system.ts @@ -8,6 +8,17 @@ export class FileSystem { return fs.existsSync(path.resolve(filePath)); } + public appendFile(filePath: string, text: string): boolean { + let success = false; + try { + fs.appendFileSync(path.resolve(filePath), text); + success = true; + } catch (err) { + console.error(`appendFile failed with ${err}`); + } + return success; + } + public extractZip(pathToZip: string, outputDir: string): Promise { return new Promise((resolve, reject) => { yauzl.open( @@ -46,7 +57,7 @@ export class FileSystem { zipFile.once("end", () => resolve()); zipFile.readEntry(); - } + }, ); }); } @@ -57,7 +68,7 @@ export class FileSystem { public readJson( filePath: string, - options?: { encoding?: null; flag?: string } + options?: { encoding?: null; flag?: string }, ): T { const content = fs.readFileSync(filePath, options); return JSON.parse(content.toString()); From b0f23712b982ba9c22b970037ae0ddf6851d4934 Mon Sep 17 00:00:00 2001 From: Adrian Burgess <3983065+apburgess@users.noreply.github.com> Date: Tue, 16 Jun 2026 14:56:46 +0100 Subject: [PATCH 2/2] Fix problem with finding what the project version of Ruby is. Fix error handling in asdf invocation. --- packages/doctor/src/sys-info.ts | 35 +++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/packages/doctor/src/sys-info.ts b/packages/doctor/src/sys-info.ts index eaae398ef3..4c8ebdc588 100644 --- a/packages/doctor/src/sys-info.ts +++ b/packages/doctor/src/sys-info.ts @@ -425,25 +425,34 @@ export class SysInfo implements NativeScriptDoctor.ISysInfo { ); const xcodeProjectDir = path.join(tempDirectory, "cocoapods"); - // If ADSF version manager is installed, get the config for the project directory and write it to the temporary project directory + // If asdf version manager is installed, get the current Ruby version for the project directory and write it to the temporary project directory const asdfResult = await this.childProcess.spawnFromEvent( "asdf", - ["list", "ruby"], + ["current", "ruby"], "exit", - ); - const asdfVersionMatch = (asdfResult.stdout as string).match( - SysInfo.VERSION_REGEXP, + { ignoreError: true }, ); - if (asdfVersionMatch?.[0]) { - const asdfVersion = asdfVersionMatch[0]; - const asdfConfigPath = path.join(xcodeProjectDir, ".tool-versions"); - const wroteASDFConfig = this.fileSystem.appendFile( - asdfConfigPath, - `ruby ${asdfVersion}`, + if (asdfResult.exitCode === 0) { + const asdfVersionMatch = (asdfResult.stdout as string).match( + SysInfo.VERSION_REGEXP, ); - if (!wroteASDFConfig) { - console.warn(`Cocoapods invocation may fail, check asdf config`); + + if (asdfVersionMatch?.[0]) { + const asdfVersion = asdfVersionMatch[0]; + const asdfConfigPath = path.join( + xcodeProjectDir, + ".tool-versions", + ); + const wroteASDFConfig = this.fileSystem.appendFile( + asdfConfigPath, + `ruby ${asdfVersion}`, + ); + if (!wroteASDFConfig) { + console.warn( + `CocoaPods invocation may fail, check asdf config`, + ); + } } }