execute method

  1. @override
Future<NativeStepResult> execute(
  1. NativeBuildContext context,
  2. ResolvedSource source
)
override

Execute this build step.

The context provides access to the build configuration and logger. Returns a NativeStepResult containing any artifacts produced by this step.

Implementation

@override
Future<NativeStepResult> execute(
  NativeBuildContext context,
  ResolvedSource source,
) async {
  final logger = context.logger;
  logger?.info('[git_checkout] Cloning repository');
  final r = runner ?? ProcessRunner(logger: logger);
  final resolvedRepository = expandRecipeValue(repository, context, source);
  final resolvedRevision = expandRecipeValue(revision, context, source);
  final resolvedTargetDirectory = targetDirectory == null
      ? p.join(context.directories.work.path, id)
      : expandRecipeValue(targetDirectory!, context, source);
  final targetDir = p.isAbsolute(resolvedTargetDirectory)
      ? resolvedTargetDirectory
      : p.join(context.directories.work.path, resolvedTargetDirectory);

  Directory(targetDir).createSync(recursive: true);

  await r.runStreaming('git', ['init', targetDir]);
  final existingOrigin = await r.runStreaming('git', [
    '-C',
    targetDir,
    'remote',
    'get-url',
    'origin',
  ], requireSuccess: false);
  if (existingOrigin.exitCode == 0) {
    await r.runStreaming('git', [
      '-C',
      targetDir,
      'remote',
      'set-url',
      'origin',
      resolvedRepository,
    ]);
  } else {
    await r.runStreaming('git', [
      '-C',
      targetDir,
      'remote',
      'add',
      'origin',
      resolvedRepository,
    ]);
  }
  await r.runStreaming('git', [
    '-C',
    targetDir,
    'fetch',
    '--depth=1',
    'origin',
    resolvedRevision,
  ]);
  await r.runStreaming('git', [
    '-C',
    targetDir,
    'checkout',
    '--detach',
    'FETCH_HEAD',
  ]);

  if (submodules) {
    await _runGit(r, [
      'submodule',
      'update',
      '--init',
      '--recursive',
      '--depth=1',
    ], workingDirectory: Directory(targetDir));
  }

  return const NativeStepResult();
}