refactor(git): enhance status change detection

This commit is contained in:
Bohdan Triapitsyn
2025-12-09 01:43:26 +02:00
parent 00cd6273bd
commit e763f2ce44
+29
View File
@@ -78,6 +78,31 @@ const createEmptyDirectoryState = (): DirectoryGitState => ({
logMaxCount: 25,
});
const haveDiffStatsChanged = (
previous?: GitStatus['diffStats'],
next?: GitStatus['diffStats']
): boolean => {
if (!previous && !next) return false;
if (!previous || !next) return true;
const paths = new Set([...Object.keys(previous), ...Object.keys(next)]);
for (const path of paths) {
const prevEntry = previous[path];
const nextEntry = next[path];
if (!prevEntry && !nextEntry) continue;
if (!prevEntry || !nextEntry) return true;
if (
prevEntry.insertions !== nextEntry.insertions ||
prevEntry.deletions !== nextEntry.deletions
) {
return true;
}
}
return false;
};
const hasStatusChanged = (oldStatus: GitStatus | null, newStatus: GitStatus | null): boolean => {
if (!oldStatus && !newStatus) return false;
if (!oldStatus || !newStatus) return true;
@@ -89,6 +114,8 @@ const hasStatusChanged = (oldStatus: GitStatus | null, newStatus: GitStatus | nu
if (oldStatus.ahead !== newStatus.ahead) return true;
if (oldStatus.behind !== newStatus.behind) return true;
if (oldStatus.current !== newStatus.current) return true;
if (oldStatus.tracking !== newStatus.tracking) return true;
if (oldStatus.isClean !== newStatus.isClean) return true;
const oldPaths = new Set(oldFiles.map(f => `${f.path}:${f.index}:${f.working_dir}`));
for (const file of newFiles) {
@@ -97,6 +124,8 @@ const hasStatusChanged = (oldStatus: GitStatus | null, newStatus: GitStatus | nu
}
}
if (haveDiffStatsChanged(oldStatus.diffStats, newStatus.diffStats)) return true;
return false;
};