resolve method

Future<SourceBuildResult?> resolve({
  1. required SourceFallback fallback,
  2. required Directory packageRoot,
  3. required Directory sourceCacheRoot,
  4. required BuildInput input,
  5. required BuildOutputBuilder output,
  6. required Logger? logger,
})

Resolve, prepare, and build from source.

Returns the directory containing the built library, or null if no source could be resolved.

Implementation

Future<SourceBuildResult?> resolve({
  required SourceFallback fallback,
  required Directory packageRoot,
  required Directory sourceCacheRoot,
  required BuildInput input,
  required BuildOutputBuilder output,
  required Logger? logger,
}) async {
  // Try each source specification with each provider.
  ResolvedSource? resolved;
  for (final spec in fallback.sources) {
    final specContext = SourceResolutionContext(
      specification: spec,
      packageRoot: packageRoot,
      sourceCacheRoot: sourceCacheRoot,
    );

    for (final provider in providers) {
      try {
        resolved = await provider.resolve(specContext);
        if (resolved != null) break;
      } catch (e) {
        logger?.warning('Source provider ${provider.runtimeType} failed: $e');
        continue;
      }
    }
    if (resolved != null) break;
  }

  if (resolved == null) {
    logger?.warning(
      'No source resolved from ${fallback.sources.length} specifications',
    );
    return null;
  }

  logger?.info(
    'Resolved source: ${resolved.origin.label} at ${resolved.directory.path}',
  );

  // Apply preparation steps.
  // Work in a copy of the resolved source to keep the cache immutable.
  final workDir = await _prepareWorkingDirectory(
    resolved,
    sourceCacheRoot,
    logger,
  );
  try {
    for (final step in fallback.preparation) {
      await step.apply(directory: workDir, logger: logger);
    }

    // Build.
    await fallback.builder.build(
      source: ResolvedSource(
        directory: workDir,
        origin: resolved.origin,
        revision: resolved.revision,
      ),
      input: input,
      output: output,
      logger: logger,
    );

    return SourceBuildResult(
      source: ResolvedSource(
        directory: workDir,
        origin: resolved.origin,
        revision: resolved.revision,
      ),
      workDirectory: workDir,
    );
  } catch (e) {
    logger?.severe('Source build failed: $e');
    rethrow;
  }
}