checkoutProject function
Future<CheckoutResult>
checkoutProject(
- String projectName,
- GitReference gitReference,
- Directory checkoutDir, {
- CliLogger? logger,
- CheckoutResult? result,
Implementation
Future<CheckoutResult> checkoutProject(
String projectName,
GitReference gitReference,
Directory checkoutDir, {
CliLogger? logger,
CheckoutResult? result,
}) async {
logger ??= CliLogger();
result ??= CheckoutResult();
final folderName = gitUrlToFolderPath(gitReference.url);
final subdir = checkoutDir.subdirs(folderName);
if (!subdir.parent.existsSync()) {
subdir.parent.createSync(recursive: true);
}
if (!subdir.existsSync()) {
result.message('Cloning repo: ${gitReference.url}');
final git = GitClient(subdir.parent.path, logger);
// Check out!
await git.clone(
gitReference.url,
into: subdir.path,
);
} else {
if (!subdir.subdir('.git').existsSync()) {
result.error('not a git repository');
return result;
} else {
result.message('clone: complete');
}
}
final git = GitClient(subdir.path, logger);
/// CHECK ORIGIN REMOTE
final remotes = await git.remotesList();
if (remotes['origin'] != gitReference.url) {
result.error(
'wrong origin: expected ${gitReference.url} but got '
'${remotes['origin']}',
);
return result;
} else {
result.message('origin: ${gitReference.url}');
}
/// CHECK TAG/BRANCH
if (gitReference.ref != null) {
Future<List<String>> currentCheckoutTags() async {
final currentBranchName = await git.currentBranchName;
final allTags = (currentBranchName == 'HEAD')
? await git.tagsForCurrentRevision
: [currentBranchName];
return allTags;
}
final expectedTag = gitReference.ref;
var allTags = await currentCheckoutTags();
if (!allTags.contains(gitReference.ref)) {
/// Check to see if the branch exists
var branchName = gitReference.ref!;
if (!await git.hasBranch(branchName)) {
await git.createBranch(branchName);
} else {
result.message(
'branch: changing to $expectedTag (was $allTags)',
);
await git.checkout(ref: branchName);
allTags = await currentCheckoutTags();
if (!allTags.contains(expectedTag)) {
result.error(
'Branch change to $expectedTag failed:'
' Current branch/tag: $allTags',
);
}
}
} else {
result.message(
'branch: $expectedTag is checked out',
);
}
}
return result;
}