@@ -107,7 +107,7 @@ class Conan(
107
107
108
108
// TODO: Add support for Conan lock files.
109
109
110
- // protected open fun hasLockFile(projectDir: File ) = null
110
+ private fun hasLockFile (directory : String ) = File (directory).isFile
111
111
112
112
override fun transformVersion (output : String ) =
113
113
// Conan could report version strings like:
@@ -143,25 +143,47 @@ class Conan(
143
143
stashDirectories(directoryToStash).use {
144
144
configureRemoteAuthentication(conanConfig)
145
145
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
+
146
150
val jsonFile = createOrtTempDir().resolve(" info.json" )
147
151
run (workingDir, " info" , definitionFile.name, " --json" , jsonFile.absolutePath, * DUMMY_COMPILER_SETTINGS )
148
152
149
153
val pkgInfos = jsonMapper.readTree(jsonFile)
150
154
jsonFile.parentFile.safeDeleteRecursively(force = true )
151
155
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)
153
173
val packages = parsePackages(packageList, workingDir)
154
174
155
175
val dependenciesScope = Scope (
156
176
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)
158
179
)
159
180
val devDependenciesScope = Scope (
160
181
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)
162
184
)
163
185
164
- val projectPackage = parseProjectPackage(pkgInfos , definitionFile, workingDir)
186
+ val projectPackage = parseProjectPackage(filteredPkgInfos , definitionFile, workingDir)
165
187
166
188
return listOf (
167
189
ProjectAnalyzerResult (
0 commit comments