checkoutProject function

Future<CheckoutResult> checkoutProject(
  1. String projectName,
  2. GitReference gitReference,
  3. Directory checkoutDir, {
  4. CliLogger? logger,
  5. 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;
}