Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -45,8 +45,8 @@ import java.nio.file.Path
class DefaultRemoteModuleResolver implements RemoteModuleResolver {

@Override
Path resolve(String moduleName, Path baseDir) {

Path resolve(String moduleName) {
def baseDir = Global.session?.baseDir ?: Path.of('.').toAbsolutePath()
final config = Global.config ?: new ConfigBuilder().setBaseDir(baseDir).build()
final registryConfig = config.navigate('registry') as RegistryConfig

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -161,7 +161,7 @@ class ModuleResolver {
// Install to modules directory (will compute directory checksum for future integrity checks)
InstalledModule installed = storage.installModule(reference, version, tempFile, downloadUrl)

log.info "Module ${reference}@${version} installed successfully at ${installed.mainFile.parent}"
log.info "Module ${reference}@${version} installed successfully at ${installed.mainFile.parent.toAbsolutePath()}"
return installed.mainFile
}
finally {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -181,7 +181,7 @@ class IncludeDef {
Path resolveRemoteModulePath(String moduleName) {
// Use SPI to get the remote module resolver implementation
def resolver = RemoteModuleResolverProvider.getInstance()
return resolver.resolve(moduleName, session.baseDir)
return resolver.resolve(moduleName)
}

@PackageScope
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,11 @@
public class FallbackRemoteModuleResolver implements RemoteModuleResolver {

@Override
public Path resolve(String moduleName, Path baseDir) {
public Path resolve(String moduleName) {
// Use CWD-relative "modules" directory as a best-effort fallback when no
// RemoteModuleResolver SPI implementation is available (e.g. running outside
// a full Nextflow session).
final Path baseDir = Path.of("modules").toAbsolutePath();
Comment thread
bentsherman marked this conversation as resolved.
Outdated
final var resolved = baseDir.resolve(moduleName).normalize();
// Prevent path traversal outside the base directory
if (!resolved.startsWith(baseDir.normalize())) {
Expand All @@ -47,4 +51,4 @@ public Path resolve(String moduleName, Path baseDir) {
public int getPriority() {
return Integer.MIN_VALUE; // Fallback has lowest possible priority
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -47,11 +47,10 @@ public interface RemoteModuleResolver {
* </ol>
*
* @param moduleName The module reference string (e.g., '@scope/name' or '@scope/name@version')
* @param baseDir The base directory for the project (used to locate the modules directory)
* @return Path to the resolved module's main.nf file
* @throws IllegalArgumentException if the module reference is invalid or resolution fails
*/
Path resolve(String moduleName, Path baseDir);
Path resolve(String moduleName);

/**
* Get the priority of this resolver. Higher priority resolvers are tried first.
Expand All @@ -65,4 +64,4 @@ public interface RemoteModuleResolver {
default int getPriority() {
return 0;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -74,17 +74,9 @@ private SourceUnit resolveInclude(IncludeNode node, SourceUnit sourceUnit, Funct
if( source.startsWith("plugin/") )
return null;

var parent = Path.of(sourceUnit.getSource().getURI()).getParent();

// Resolve remote module paths (scope/name format, not starting with local prefixes)
if( isRemoteModule(source) ) {
var modules = Path.of("./modules");
var resolver = RemoteModuleResolverProvider.getInstance();
resolver.resolve(source, modules.getParent());
parent = modules;
}

var includeUri = getIncludeUri(parent, source);
var includeUri = isRemoteModule(source) ?
RemoteModuleResolverProvider.getInstance().resolve(source).normalize().toUri() :
getIncludeUri(Path.of(sourceUnit.getSource().getURI()).getParent(), source);
if( compiler.getSource(includeUri) != null )
return null;
if( !Files.exists(Path.of(includeUri)) )
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import java.util.List;
import java.util.Set;

import nextflow.module.spi.RemoteModuleResolverProvider;
import nextflow.script.ast.FunctionNode;
import nextflow.script.ast.IncludeNode;
import nextflow.script.ast.ScriptNode;
Expand Down Expand Up @@ -86,9 +87,19 @@ public void visitInclude(IncludeNode node) {
return;
}

var isRemoteModule = ModuleResolver.isRemoteModule(source);
var parent = isRemoteModule ? Path.of("modules") : Path.of(uri).getParent();
var includeUri = getIncludeUri(parent, source);
URI includeUri;
if( ModuleResolver.isRemoteModule(source) ) {
try {
includeUri = RemoteModuleResolverProvider.getInstance().resolve(source).normalize().toUri();
}
catch( IllegalStateException e ) {
addError(e.getMessage(), node);
return;
}
}
else {
includeUri = getIncludeUri(Path.of(sourceUnit.getSource().getURI()).getParent(), source);
}
if( !isIncludeStale(node, includeUri) )
return;
changed = true;
Expand Down
Loading