Skip to content

Commit a66b2e9

Browse files
committed
Conan: Add support for Conan lockfiles
Filter output of `conan info` to only include packages listed in lockfile. For now only lockfiles located in the same directory as the definition file are supported. Signed-off-by: Oleksandr Yarosevych <[email protected]>
1 parent 5f7f8ef commit a66b2e9

File tree

1 file changed

+27
-5
lines changed
  • analyzer/src/main/kotlin/managers

1 file changed

+27
-5
lines changed

analyzer/src/main/kotlin/managers/Conan.kt

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ class Conan(
107107

108108
// TODO: Add support for Conan lock files.
109109

110-
// protected open fun hasLockFile(projectDir: File) = null
110+
private fun hasLockFile(directory: String) = File(directory).isFile
111111

112112
override fun transformVersion(output: String) =
113113
// Conan could report version strings like:
@@ -143,25 +143,47 @@ class Conan(
143143
stashDirectories(directoryToStash).use {
144144
configureRemoteAuthentication(conanConfig)
145145

146+
// TODO: Support lockfiles which are located in a different directory than the definition file.
147+
val lockfileName = analyzerConfig.packageManagers?.get(managerName)?.options?.get("lockfileName")
148+
requireLockfile(workingDir) { lockfileName?.let { hasLockFile(it) } ?: false }
149+
146150
val jsonFile = createOrtTempDir().resolve("info.json")
147151
run(workingDir, "info", definitionFile.name, "--json", jsonFile.absolutePath, *DUMMY_COMPILER_SETTINGS)
148152

149153
val pkgInfos = jsonMapper.readTree(jsonFile)
150154
jsonFile.parentFile.safeDeleteRecursively(force = true)
151155

152-
val packageList = removeProjectPackage(pkgInfos, definitionFile.name)
156+
val filteredPkgInfos = if (!analyzerConfig.allowDynamicVersions && lockfileName != null) {
157+
val lockfileNodes = jsonMapper.readTree(definitionFile.resolveSibling(lockfileName))
158+
val lockfilePackages = lockfileNodes["graph_lock"]["nodes"].mapNotNull {
159+
it["ref"]?.textValue()
160+
}
161+
162+
jsonMapper.createArrayNode().addAll(
163+
pkgInfos.filter { jsonNode ->
164+
lockfilePackages.contains(jsonNode["reference"].textValueOrEmpty())
165+
|| definitionFile.name.equals(jsonNode["reference"].textValueOrEmpty())
166+
}
167+
)
168+
} else {
169+
pkgInfos
170+
}
171+
172+
val packageList = removeProjectPackage(filteredPkgInfos, definitionFile.name)
153173
val packages = parsePackages(packageList, workingDir)
154174

155175
val dependenciesScope = Scope(
156176
name = SCOPE_NAME_DEPENDENCIES,
157-
dependencies = parseDependencies(pkgInfos, definitionFile.name, SCOPE_NAME_DEPENDENCIES, workingDir)
177+
dependencies =
178+
parseDependencies(filteredPkgInfos, definitionFile.name, SCOPE_NAME_DEPENDENCIES, workingDir)
158179
)
159180
val devDependenciesScope = Scope(
160181
name = SCOPE_NAME_DEV_DEPENDENCIES,
161-
dependencies = parseDependencies(pkgInfos, definitionFile.name, SCOPE_NAME_DEV_DEPENDENCIES, workingDir)
182+
dependencies =
183+
parseDependencies(filteredPkgInfos, definitionFile.name, SCOPE_NAME_DEV_DEPENDENCIES, workingDir)
162184
)
163185

164-
val projectPackage = parseProjectPackage(pkgInfos, definitionFile, workingDir)
186+
val projectPackage = parseProjectPackage(filteredPkgInfos, definitionFile, workingDir)
165187

166188
return listOf(
167189
ProjectAnalyzerResult(

0 commit comments

Comments
 (0)