execute method
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();
}