From 1c9d66987ec5e47a224d8f44168cb00b47fcad1a Mon Sep 17 00:00:00 2001 From: "Jeferson S. Brito" <30840709+jeferson-sb@users.noreply.github.com> Date: Mon, 11 Dec 2023 06:58:35 -0300 Subject: [PATCH] feat: add gradlew doctor check permissions (#2191) * feat: add gradlew doctor check permissions * feat: add gradle to android healthchecks list * feat: use config object to get android path --- .../src/tools/healthchecks/gradle.ts | 53 +++++++++++++++++++ .../src/tools/healthchecks/index.ts | 2 + 2 files changed, 55 insertions(+) create mode 100644 packages/cli-doctor/src/tools/healthchecks/gradle.ts diff --git a/packages/cli-doctor/src/tools/healthchecks/gradle.ts b/packages/cli-doctor/src/tools/healthchecks/gradle.ts new file mode 100644 index 000000000..db9275346 --- /dev/null +++ b/packages/cli-doctor/src/tools/healthchecks/gradle.ts @@ -0,0 +1,53 @@ +import fs from 'fs/promises'; +import path from 'path'; + +import {HealthCheckInterface} from '../../types'; +import {findProjectRoot} from '@react-native-community/cli-tools'; +import {logError} from './common'; + +const label = 'Gradlew'; +const description = 'Build tool required for Android builds'; + +const platform = process.platform as 'darwin' | 'win32' | 'linux'; + +export default { + label, + description, + getDiagnostics: async (_, config) => { + const projectRoot = findProjectRoot(); + const filename = platform === 'win32' ? 'gradlew.bat' : 'gradlew'; + const androidFolderPath = + config?.project.android?.sourceDir ?? `${projectRoot}/android`; + + const gradleWrapperFile = path.join(androidFolderPath, filename); + + const executableMode = fs.constants.X_OK; + + try { + await fs.access(gradleWrapperFile, executableMode); + return {needsToBeFixed: false}; + } catch { + return {needsToBeFixed: true}; + } + }, + runAutomaticFix: async ({loader, config}) => { + try { + const projectRoot = config?.root ?? findProjectRoot(); + const filename = platform === 'win32' ? 'gradlew.bat' : 'gradlew'; + const androidFolderPath = + config?.project.android?.sourceDir ?? `${projectRoot}/android`; + + const gradleWrapperFile = path.join(androidFolderPath, filename); + const PERMISSIONS = 0o755; + + await fs.chmod(gradleWrapperFile, PERMISSIONS); + } catch (error) { + logError({ + healthcheck: label, + loader, + error: error as Error, + command: 'chmod +x gradlew', + }); + } + }, +} as HealthCheckInterface; diff --git a/packages/cli-doctor/src/tools/healthchecks/index.ts b/packages/cli-doctor/src/tools/healthchecks/index.ts index cd8b8fb37..9c817bbcf 100644 --- a/packages/cli-doctor/src/tools/healthchecks/index.ts +++ b/packages/cli-doctor/src/tools/healthchecks/index.ts @@ -15,6 +15,7 @@ import {Healthchecks, HealthCheckCategory} from '../../types'; import loadConfig from '@react-native-community/cli-config'; import xcodeEnv from './xcodeEnv'; import packager from './packager'; +import gradle from './gradle'; import deepmerge from 'deepmerge'; import {logger} from '@react-native-community/cli-tools'; @@ -82,6 +83,7 @@ export const getHealthchecks = ({contributor}: Options): Healthchecks => { jdk, androidStudio, androidHomeEnvVariable, + gradle, ...(contributor ? [androidNDK] : []), ], },