Skip to content

Commit 7e07f94

Browse files
Strum355claude
andcommitted
refactor: extract normalizePath and resolveBinary to shared tools.js
Move normalizePath from Base_java class and resolveGradleBinary from java_gradle.js into tools.js as shared standalone functions. Update traverseForWrapper to normalize paths consistently on Windows. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 297ed65 commit 7e07f94

3 files changed

Lines changed: 28 additions & 45 deletions

File tree

src/providers/java_gradle.js

Lines changed: 3 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import TOML from 'fast-toml'
88

99
import { readLicenseFile } from '../license/license_utils.js'
1010
import Sbom from '../sbom.js'
11-
import { getCustomPath, getWrapperPreference, invokeCommand, traverseForWrapper } from '../tools.js'
11+
import { invokeCommand, resolveBinary } from '../tools.js'
1212
import { filterManifestPathsByDiscoveryIgnore, resolveWorkspaceDiscoveryIgnore } from '../workspace.js'
1313

1414
import Base_java, { ecosystem_gradle } from "./base_java.js";
@@ -476,25 +476,6 @@ const DEFAULT_GRADLE_DISCOVERY_IGNORE = [
476476
'**/.gradle/**',
477477
]
478478

479-
/**
480-
* Resolve the Gradle binary, respecting wrapper preference.
481-
*
482-
* @param {string} startDir - Directory from which to start the wrapper search
483-
* @param {import('../index.js').Options} [opts={}]
484-
* @returns {string} Path to the Gradle binary
485-
*/
486-
function resolveGradleBinary(startDir, opts = {}) {
487-
const localWrapper = 'gradlew' + (process.platform === 'win32' ? '.bat' : '')
488-
const useWrapper = getWrapperPreference('gradle', opts)
489-
if (useWrapper) {
490-
const wrapper = traverseForWrapper(startDir, localWrapper)
491-
if (wrapper !== undefined) {
492-
return wrapper
493-
}
494-
}
495-
return getCustomPath('gradle', opts)
496-
}
497-
498479
/** Gradle init script that emits structured project listing. */
499480
const GRADLE_INIT_SCRIPT = `allprojects {
500481
task daListProjects {
@@ -522,7 +503,8 @@ export async function discoverGradleSubprojects(workspaceRoot, opts = {}) {
522503
return []
523504
}
524505

525-
const gradleBin = resolveGradleBinary(root, opts)
506+
const localWrapper = 'gradlew' + (process.platform === 'win32' ? '.bat' : '')
507+
const gradleBin = resolveBinary('gradle', localWrapper, root, opts)
526508
const manifestPaths = []
527509

528510
const rootBuildKts = path.join(root, 'build.gradle.kts')

src/tools.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,25 @@ export function traverseForWrapper(startDir, wrapperName, repoRoot = undefined)
178178
}
179179
}
180180

181+
/**
182+
* Resolve a build-tool binary, preferring a wrapper when configured.
183+
*
184+
* @param {string} globalBinary - Global binary name (e.g. `mvn`, `gradle`)
185+
* @param {string} localWrapper - Wrapper filename (e.g. `mvnw`, `gradlew.bat`)
186+
* @param {string} startDir - Directory from which to start the wrapper search
187+
* @param {import('./index.js').Options} [opts={}]
188+
* @returns {string} Path to the resolved binary
189+
*/
190+
export function resolveBinary(globalBinary, localWrapper, startDir, opts = {}) {
191+
if (getWrapperPreference(globalBinary, opts)) {
192+
const wrapper = traverseForWrapper(startDir, localWrapper)
193+
if (wrapper !== undefined) {
194+
return wrapper
195+
}
196+
}
197+
return getCustomPath(globalBinary, opts)
198+
}
199+
181200
/** this method invokes command string in a process in a synchronous way.
182201
* @param {string} bin - the command to be invoked
183202
* @param {Array<string>} args - the args to pass to the binary

test/providers/workspace.test.js

Lines changed: 6 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -208,10 +208,7 @@ suite('discoverGradleSubprojects', () => {
208208

209209
const { discoverGradleSubprojects } = await esmock('../../src/providers/java_gradle.js', {
210210
'../../src/tools.js': {
211-
getCustom: () => null,
212-
getCustomPath: () => 'gradle',
213-
getGitRootDir: () => null,
214-
getWrapperPreference: () => false,
211+
resolveBinary: () => 'gradle',
215212
invokeCommand: () => Buffer.from(initScriptOutput),
216213
},
217214
})
@@ -233,10 +230,7 @@ suite('discoverGradleSubprojects', () => {
233230

234231
const { discoverGradleSubprojects } = await esmock('../../src/providers/java_gradle.js', {
235232
'../../src/tools.js': {
236-
getCustom: () => null,
237-
getCustomPath: () => 'gradle',
238-
getGitRootDir: () => null,
239-
getWrapperPreference: () => false,
233+
resolveBinary: () => 'gradle',
240234
invokeCommand: () => Buffer.from(initScriptOutput),
241235
},
242236
})
@@ -258,10 +252,7 @@ suite('discoverGradleSubprojects', () => {
258252

259253
const { discoverGradleSubprojects } = await esmock('../../src/providers/java_gradle.js', {
260254
'../../src/tools.js': {
261-
getCustom: () => null,
262-
getCustomPath: () => 'gradle',
263-
getGitRootDir: () => null,
264-
getWrapperPreference: () => false,
255+
resolveBinary: () => 'gradle',
265256
invokeCommand: () => Buffer.from(initScriptOutput),
266257
},
267258
})
@@ -279,10 +270,7 @@ suite('discoverGradleSubprojects', () => {
279270

280271
const { discoverGradleSubprojects } = await esmock('../../src/providers/java_gradle.js', {
281272
'../../src/tools.js': {
282-
getCustom: () => null,
283-
getCustomPath: () => 'gradle',
284-
getGitRootDir: () => null,
285-
getWrapperPreference: () => false,
273+
resolveBinary: () => 'gradle',
286274
invokeCommand: () => Buffer.from(initScriptOutput),
287275
},
288276
})
@@ -296,10 +284,7 @@ suite('discoverGradleSubprojects', () => {
296284
const root = path.resolve('test/providers/tst_manifests/gradle/gradle_multi_project')
297285
const { discoverGradleSubprojects } = await esmock('../../src/providers/java_gradle.js', {
298286
'../../src/tools.js': {
299-
getCustom: () => null,
300-
getCustomPath: () => 'gradle',
301-
getGitRootDir: () => null,
302-
getWrapperPreference: () => false,
287+
resolveBinary: () => 'gradle',
303288
invokeCommand: () => { throw new Error('gradle not found') },
304289
},
305290
})
@@ -319,10 +304,7 @@ suite('discoverGradleSubprojects', () => {
319304

320305
const { discoverGradleSubprojects } = await esmock('../../src/providers/java_gradle.js', {
321306
'../../src/tools.js': {
322-
getCustom: () => null,
323-
getCustomPath: () => 'gradle',
324-
getGitRootDir: () => null,
325-
getWrapperPreference: () => false,
307+
resolveBinary: () => 'gradle',
326308
invokeCommand: () => Buffer.from(initScriptOutput),
327309
},
328310
})

0 commit comments

Comments
 (0)