calculateDiff static method
Future<CommitDiff>
calculateDiff({
- required Commit thisCommit,
- required Commit otherCommit,
- dynamic onNoOtherCommitBranchMetaData()? = onNoCommitBranchMetaData,
- dynamic onNoOtherCommitMetaData()? = onNoCommitMetaData,
- dynamic onNoThisCommitBranchMetaData()? = onNoCommitBranchMetaData,
- dynamic onNoThisCommitMetaData()? = 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,
);
}