calculateDiff static method

Future<CommitDiff> calculateDiff({
  1. required Commit thisCommit,
  2. required Commit otherCommit,
  3. dynamic onNoOtherCommitBranchMetaData(
    1. Branch
    )? = onNoCommitBranchMetaData,
  4. dynamic onNoOtherCommitMetaData(
    1. Commit
    )? = onNoCommitMetaData,
  5. dynamic onNoThisCommitBranchMetaData(
    1. Branch
    )? = onNoCommitBranchMetaData,
  6. dynamic onNoThisCommitMetaData(
    1. Commit
    )? = onNoCommitMetaData,
})

Implementation

static Future<CommitDiff> calculateDiff({
  required Commit thisCommit,
  required Commit otherCommit,
  Function(Branch)? onNoOtherCommitBranchMetaData = onNoCommitBranchMetaData,
  Function(Commit)? onNoOtherCommitMetaData = onNoCommitMetaData,
  Function(Branch)? onNoThisCommitBranchMetaData = onNoCommitBranchMetaData,
  Function(Commit)? onNoThisCommitMetaData = onNoCommitMetaData,
}) async {
  //Get a commit files
  Map<String, RepoObjectsData>? thisFiles = thisCommit.getCommitFiles(
    onNoCommitMetaData: onNoThisCommitMetaData,
    onNoCommitBranchMetaData: onNoThisCommitBranchMetaData,
  );

  //Get b commit files
  Map<String, RepoObjectsData>? otherFiles = otherCommit.getCommitFiles(
    onNoCommitBranchMetaData: onNoOtherCommitBranchMetaData,
    onNoCommitMetaData: onNoOtherCommitMetaData,
  );

  if (thisFiles == null && otherFiles == null) {
    return CommitDiff(
      filesDiff: [],
      thisCommit: thisCommit,
      otherCommit: otherCommit,
      statistic: {},
    );
  }
  thisFiles ??= {};
  otherFiles ??= {};

  //Compare this with other
  debugPrintToConsole(
    message: "Comparing files from ${thisCommit.sha} commit (${thisFiles.length} files) to ${otherCommit.sha} commit (${otherFiles.length} files)",
  );

  List<FileDiff> filesDiff = [];
  Map<DiffType, int> statistics = {};
  HashSet<String> thisAndOtherFiles = HashSet();
  thisAndOtherFiles.addAll(thisFiles.keys);
  thisAndOtherFiles.addAll(otherFiles.keys);

  Directory tempDirectory = Directory.systemTemp;
  String r = Random().nextInt(500).toString();
  Directory compareDirectory = Directory(join(tempDirectory.path, r)).createTempSync();

  for (String thisOrOtherFileKey in thisAndOtherFiles) {
    debugPrintToConsole(message: thisOrOtherFileKey);

    RepoObjectsData? thisFile = thisFiles[thisOrOtherFileKey];
    RepoObjectsData? otherFile = otherFiles[thisOrOtherFileKey];

    late DiffType diffType;
    if (thisFile == null) {
      diffType = DiffType.delete;
    } else if (otherFile == null) {
      diffType = DiffType.insert;
    } else {
      File thisTempFile = File(join(compareDirectory.path, thisFile.sha));
      File otherTempFile = File(join(compareDirectory.path, otherFile.sha));

      FileDiff fileDiff = await FileDiff.calculateDiff(thisFile: thisTempFile, otherFile: otherTempFile);
      filesDiff.add(fileDiff);
      diffType = DiffType.modify;
    }

    statistics.update(diffType, (o) => o + 1, ifAbsent: () => 1);
  }

  compareDirectory.deleteSync(recursive: true);

  return CommitDiff(
    filesDiff: filesDiff,
    thisCommit: thisCommit,
    otherCommit: otherCommit,
    statistic: statistics,
  );
}