Skip to content

Commit 5f66a7f

Browse files
committed
refactor(node): Rework stashing of directories and files
Centralize the stashing of `.node_modules` directories in the base class, which brings the feature also to the `Yarn2` analyzer where it was previously missing. In exchange, only do the `.npmrc` file hinting and stashing in the `Npm` class, as that currently is the only class to support the `ignoreProjectNpmrcFiles` option. Signed-off-by: Sebastian Schuberth <sebastian@doubleopen.org>
1 parent 53df893 commit 5f66a7f

File tree

4 files changed

+24
-33
lines changed

4 files changed

+24
-33
lines changed

plugins/package-managers/node/src/main/kotlin/NodePackageManager.kt

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,15 @@ import org.ossreviewtoolkit.model.Project
3333
import org.ossreviewtoolkit.model.ProjectAnalyzerResult
3434
import org.ossreviewtoolkit.model.config.AnalyzerConfiguration
3535
import org.ossreviewtoolkit.model.utils.DependencyGraphBuilder
36+
import org.ossreviewtoolkit.utils.common.DirectoryStash
3637
import org.ossreviewtoolkit.utils.common.realFile
3738

3839
const val NODE_MODULES_DIRNAME = "node_modules"
3940
const val NPM_RUNTIME_CONFIGURATION_FILENAME = ".npmrc"
4041

4142
abstract class NodePackageManager(val managerType: NodePackageManagerType) : PackageManager(managerType.projectType) {
43+
protected lateinit var dirStash: DirectoryStash
44+
4245
// This needs to be "internal" instead of "protected" as overrides expose internal types.
4346
internal abstract val graphBuilder: DependencyGraphBuilder<*>
4447

@@ -85,12 +88,19 @@ abstract class NodePackageManager(val managerType: NodePackageManagerType) : Pac
8588
) {
8689
super.beforeResolution(analysisRoot, definitionFiles, analyzerConfig)
8790

88-
definitionFiles.forEach {
89-
val npmrc = it.resolveSibling(NPM_RUNTIME_CONFIGURATION_FILENAME)
90-
if (npmrc.isFile) {
91-
logger.info { "There is a project-specific runtime configuration file at '${npmrc.absolutePath}'." }
91+
val nodeModulesDirs = definitionFiles.mapNotNullTo(mutableSetOf()) { definitionFile ->
92+
definitionFile.resolveSibling(NODE_MODULES_DIRNAME).takeIf { it.isDirectory }?.also {
93+
logger.info { "Project-specific '$NODE_MODULES_DIRNAME' directory present at '$it'." }
9294
}
9395
}
96+
97+
dirStash = DirectoryStash(nodeModulesDirs)
98+
}
99+
100+
override fun afterResolution(analysisRoot: File, definitionFiles: List<File>) {
101+
dirStash.close()
102+
103+
super.afterResolution(analysisRoot, definitionFiles)
94104
}
95105

96106
override fun mapDefinitionFiles(

plugins/package-managers/node/src/main/kotlin/npm/Npm.kt

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@ import org.ossreviewtoolkit.plugins.api.OrtPlugin
3636
import org.ossreviewtoolkit.plugins.api.OrtPluginOption
3737
import org.ossreviewtoolkit.plugins.api.PluginDescriptor
3838
import org.ossreviewtoolkit.plugins.packagemanagers.node.ModuleInfoResolver
39-
import org.ossreviewtoolkit.plugins.packagemanagers.node.NODE_MODULES_DIRNAME
4039
import org.ossreviewtoolkit.plugins.packagemanagers.node.NPM_RUNTIME_CONFIGURATION_FILENAME
4140
import org.ossreviewtoolkit.plugins.packagemanagers.node.NodePackageManager
4241
import org.ossreviewtoolkit.plugins.packagemanagers.node.NodePackageManagerType
@@ -93,7 +92,7 @@ class Npm(override val descriptor: PluginDescriptor = NpmFactory.descriptor, pri
9392

9493
override val globsForDefinitionFiles = listOf(NodePackageManagerType.DEFINITION_FILE)
9594

96-
private lateinit var stash: FileStash
95+
private lateinit var fileStash: FileStash
9796

9897
private val moduleInfoResolver = ModuleInfoResolver.create { workingDir, moduleId ->
9998
runCatching {
@@ -117,17 +116,21 @@ class Npm(override val descriptor: PluginDescriptor = NpmFactory.descriptor, pri
117116

118117
NpmCommand.checkVersion()
119118

120-
val files = definitionFiles.mapTo(mutableSetOf()) { it.resolveSibling(NODE_MODULES_DIRNAME) }
119+
val npmrcFiles = definitionFiles.mapNotNullTo(mutableSetOf()) { definitionFile ->
120+
definitionFile.resolveSibling(NPM_RUNTIME_CONFIGURATION_FILENAME).takeIf { it.isFile }?.also {
121+
logger.info { "Project-specific '$NPM_RUNTIME_CONFIGURATION_FILENAME' file present at '$it'." }
122+
}
123+
}
121124

122125
if (config.ignoreProjectNpmrcFiles) {
123-
files += definitionFiles.mapTo(mutableSetOf()) { it.resolveSibling(NPM_RUNTIME_CONFIGURATION_FILENAME) }
126+
fileStash = FileStash(npmrcFiles)
124127
}
125-
126-
stash = FileStash(files)
127128
}
128129

129130
override fun afterResolution(analysisRoot: File, definitionFiles: List<File>) {
130-
stash.close()
131+
if (config.ignoreProjectNpmrcFiles) fileStash.close()
132+
133+
super.afterResolution(analysisRoot, definitionFiles)
131134
}
132135

133136
override fun resolveDependencies(

plugins/package-managers/node/src/main/kotlin/pnpm/Pnpm.kt

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -31,14 +31,12 @@ import org.ossreviewtoolkit.model.utils.DependencyGraphBuilder
3131
import org.ossreviewtoolkit.plugins.api.OrtPlugin
3232
import org.ossreviewtoolkit.plugins.api.PluginDescriptor
3333
import org.ossreviewtoolkit.plugins.packagemanagers.node.ModuleInfoResolver
34-
import org.ossreviewtoolkit.plugins.packagemanagers.node.NODE_MODULES_DIRNAME
3534
import org.ossreviewtoolkit.plugins.packagemanagers.node.NodePackageManager
3635
import org.ossreviewtoolkit.plugins.packagemanagers.node.NodePackageManagerType
3736
import org.ossreviewtoolkit.plugins.packagemanagers.node.Scope
3837
import org.ossreviewtoolkit.plugins.packagemanagers.node.getNames
3938
import org.ossreviewtoolkit.plugins.packagemanagers.node.parsePackageJson
4039
import org.ossreviewtoolkit.utils.common.CommandLineTool
41-
import org.ossreviewtoolkit.utils.common.DirectoryStash
4240
import org.ossreviewtoolkit.utils.common.Os
4341
import org.ossreviewtoolkit.utils.common.ProcessCapture
4442
import org.ossreviewtoolkit.utils.common.nextOrNull
@@ -68,8 +66,6 @@ class Pnpm(override val descriptor: PluginDescriptor = PnpmFactory.descriptor) :
6866
NodePackageManager(NodePackageManagerType.PNPM) {
6967
override val globsForDefinitionFiles = listOf(NodePackageManagerType.DEFINITION_FILE)
7068

71-
private lateinit var stash: DirectoryStash
72-
7369
private val moduleInfoResolver = ModuleInfoResolver.create { workingDir, moduleId ->
7470
runCatching {
7571
// Note that pnpm does not actually implement the "info" subcommand itself, but just forwards to npm, see
@@ -93,13 +89,6 @@ class Pnpm(override val descriptor: PluginDescriptor = PnpmFactory.descriptor) :
9389
super.beforeResolution(analysisRoot, definitionFiles, analyzerConfig)
9490

9591
PnpmCommand.checkVersion()
96-
97-
val directories = definitionFiles.mapTo(mutableSetOf()) { it.resolveSibling(NODE_MODULES_DIRNAME) }
98-
stash = DirectoryStash(directories)
99-
}
100-
101-
override fun afterResolution(analysisRoot: File, definitionFiles: List<File>) {
102-
stash.close()
10392
}
10493

10594
override fun resolveDependencies(

plugins/package-managers/node/src/main/kotlin/yarn/Yarn.kt

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@ import org.ossreviewtoolkit.model.utils.DependencyGraphBuilder
4040
import org.ossreviewtoolkit.plugins.api.OrtPlugin
4141
import org.ossreviewtoolkit.plugins.api.PluginDescriptor
4242
import org.ossreviewtoolkit.plugins.packagemanagers.node.ModuleInfoResolver
43-
import org.ossreviewtoolkit.plugins.packagemanagers.node.NODE_MODULES_DIRNAME
4443
import org.ossreviewtoolkit.plugins.packagemanagers.node.NodePackageManager
4544
import org.ossreviewtoolkit.plugins.packagemanagers.node.NodePackageManagerType
4645
import org.ossreviewtoolkit.plugins.packagemanagers.node.PackageJson
@@ -50,7 +49,6 @@ import org.ossreviewtoolkit.plugins.packagemanagers.node.getInstalledModulesDirs
5049
import org.ossreviewtoolkit.plugins.packagemanagers.node.getNames
5150
import org.ossreviewtoolkit.plugins.packagemanagers.node.parsePackageJson
5251
import org.ossreviewtoolkit.utils.common.CommandLineTool
53-
import org.ossreviewtoolkit.utils.common.DirectoryStash
5452
import org.ossreviewtoolkit.utils.common.Os
5553
import org.ossreviewtoolkit.utils.common.ProcessCapture
5654
import org.ossreviewtoolkit.utils.common.alsoIfNull
@@ -79,8 +77,6 @@ class Yarn(override val descriptor: PluginDescriptor = YarnFactory.descriptor) :
7977
NodePackageManager(NodePackageManagerType.YARN) {
8078
override val globsForDefinitionFiles = listOf(NodePackageManagerType.DEFINITION_FILE)
8179

82-
private lateinit var stash: DirectoryStash
83-
8480
private val moduleInfoResolver = ModuleInfoResolver.create { workingDir, moduleId ->
8581
val process = YarnCommand.run(workingDir, "info", "--json", moduleId)
8682

@@ -98,13 +94,6 @@ class Yarn(override val descriptor: PluginDescriptor = YarnFactory.descriptor) :
9894
super.beforeResolution(analysisRoot, definitionFiles, analyzerConfig)
9995

10096
YarnCommand.checkVersion()
101-
102-
val directories = definitionFiles.mapTo(mutableSetOf()) { it.resolveSibling(NODE_MODULES_DIRNAME) }
103-
stash = DirectoryStash(directories)
104-
}
105-
106-
override fun afterResolution(analysisRoot: File, definitionFiles: List<File>) {
107-
stash.close()
10897
}
10998

11099
override fun resolveDependencies(

0 commit comments

Comments
 (0)