canPush method

Future<bool> canPush()

Implementation

Future<bool> canPush() async {
  if (config.remotes.isEmpty) {
    return false;
  }

  var head = await this.head();
  if (head == null || head.isHash) {
    return false;
  }

  var brConfig = config.branch(head.target!.branchName()!);
  var brConfigMerge = brConfig?.merge;
  var brConfigRemote = brConfig?.remote;
  if (brConfig == null || brConfigMerge == null || brConfigRemote == null) {
    // FIXME: Maybe we can push other branches!
    return false;
  }

  var resolvedHead = await resolveReference(head);
  if (resolvedHead == null) {
    return false;
  }

  // Construct remote's branch
  var remoteBranchName = brConfigMerge.branchName()!;
  var remoteRefName = ReferenceName.remote(brConfigRemote, remoteBranchName);
  var remoteRef = await resolveReferenceName(remoteRefName);
  if (remoteRef == null) {
    return false;
  }

  return resolvedHead.hash != remoteRef.hash;
}