fix(cli): fixed diff display in the post commit message

This commit is contained in:
lisk77 2025-09-20 05:41:22 +02:00
parent 730d2b84e0
commit b1515d21c4

View file

@ -384,21 +384,151 @@ int main(int argc, char** argv) {
BaseFileInfo info = (BaseFileInfo){.base_num = 0, .diff_num = 0, .name = strdup(files->items[idx])}; BaseFileInfo info = (BaseFileInfo){.base_num = 0, .diff_num = 0, .name = strdup(files->items[idx])};
base_file_buffer_push(base_files, info); base_file_buffer_push(base_files, info);
// Compress the files content and put it into the object database // Compress the files content and put it into the object database
File* modified_file = new_file(files->items[idx]);
if (!modified_file) {
free(commit_message);
list_free(files);
base_file_buffer_free(base_files);
free(branch);
free(root);
free_config(&config);
free(changes);
return 1;
}
changes->insertions += modified_file->lines;
char file_hash[41]; char file_hash[41];
snapshot_file(files->items[idx], root, 0, file_hash); snapshot_file(files->items[idx], root, 0, file_hash);
continue; continue;
} }
size_t base_num = base_file->base_num;
size_t diff_num = base_file->diff_num + 1; char base_file_hash[41];
char id[2 + snprintf(NULL, 0, "%d", base_file->base_num) + strlen(files->items[idx])];
snprintf(id, sizeof(id), "%s %d", files->items[idx], base_file->base_num);
object_hash(BaseFileObject, id, base_file_hash);
File* basefile = parse_object(base_file_hash, BaseFileObject, NULL, NULL);
if (!basefile) {
free(commit_message);
list_free(files);
base_file_buffer_free(base_files);
free(branch);
free(root);
free_config(&config);
free(changes);
return 1;
}
File* modified_file = new_file(files->items[idx]);
if (!modified_file) {
free_file(basefile);
free(commit_message);
list_free(files);
base_file_buffer_free(base_files);
free(branch);
free(root);
free_config(&config);
free(changes);
return 1;
}
ActionList* diff = myers_diff(basefile, modified_file, 0, 0);
if (!diff) {
free_file(basefile);
free_file(modified_file);
free(commit_message);
list_free(files);
base_file_buffer_free(base_files);
free(branch);
free(root);
free_config(&config);
free(changes);
return 1;
}
if (base_file->diff_num == 0) {
for (size_t idx = 0; idx < diff->len; idx++) {
Action action = diff->actions[idx];
if (action.type == INSERT) {
changes->insertions += 1;
} else if (action.type == DELETE) {
changes->deletions += 1;
}
}
}
if (base_file->diff_num > 0) {
size_t prev_diff = base_file->diff_num - 1;
char prev_diff_hash[41];
char id2[2 + snprintf(NULL, 0, "%zu", prev_diff) + strlen(files->items[idx])];
snprintf(id2, sizeof(id2), "%s %zu", files->items[idx], prev_diff);
object_hash(FileDiffObject, id2, prev_diff_hash);
char hash[41];
ActionList* last_diff = parse_object(prev_diff_hash, FileDiffObject, NULL, hash);
if (!last_diff) {
free_action_list(diff);
free_file(modified_file);
free_file(basefile);
free(commit_message);
list_free(files);
base_file_buffer_free(base_files);
free(branch);
free(root);
free_config(&config);
free(changes);
return 1;
}
File* last_version = apply_diff(basefile, last_diff);
if (!last_version) {
free_action_list(last_diff);
free_action_list(diff);
free_file(modified_file);
free_file(basefile);
free(commit_message);
list_free(files);
base_file_buffer_free(base_files);
free(branch);
free(root);
free_config(&config);
free(changes);
return 1;
}
ActionList* modified_diff = myers_diff(last_version, modified_file, 0, 0);
if (!modified_diff) {
free_action_list(last_diff);
free_action_list(diff);
free_file(modified_file);
free_file(basefile);
free(commit_message);
list_free(files);
base_file_buffer_free(base_files);
free(branch);
free(root);
free_config(&config);
free(changes);
return 1;
}
for (size_t idx = 0; idx < modified_diff->len; idx++) {
Action action = modified_diff->actions[idx];
if (action.type == INSERT) {
changes->insertions += 1;
} else if (action.type == DELETE) {
changes->deletions += 1;
}
}
}
save_diff(diff, files->items[idx], root, base_file->diff_num, base_file_hash, NULL, 0);
base_file_buffer_remove(base_files, files->items[idx]); base_file_buffer_remove(base_files, files->items[idx]);
BaseFileInfo new_info = (BaseFileInfo){.base_num = base_num, .diff_num = diff_num, .name = strdup(files->items[idx])}; BaseFileInfo new_info = (BaseFileInfo){
.base_num = base_file->base_num,
.diff_num = base_file->diff_num + 1,
.name = strdup(files->items[idx])
};
base_file_buffer_push(base_files, new_info); base_file_buffer_push(base_files, new_info);
// Take the diff and put it into the object database
char basefile_hash[41];
char id[2 + snprintf(NULL, 0, "%d", base_num) + strlen(files->items[idx])];
snprintf(id, sizeof(id), "%s %d", files->items[idx], base_num);
object_hash(BaseFileObject, id, basefile_hash);
save_file_diff(files->items[idx], root, base_num, basefile_hash, changes);
} }
base_file_buffer_sort(base_files); base_file_buffer_sort(base_files);
@ -513,12 +643,13 @@ int main(int argc, char** argv) {
write(ref, commit_hash, 40); write(ref, commit_hash, 40);
close(ref); close(ref);
if (changes->insertions == 0 && changes->deletions == 0) { printf("(\x1b[33;1m%.7s\x1b[0m on \x1b[39;1;4m%s\x1b[0m \x1b[32;1m%d+\x1b[0m \x1b[31;1m%d-\x1b[0m) %s\n",
printf("(\x1b[33;1m%.7s\x1b[0m on \x1b[39;1;4m%s\x1b[0m) %s\n", commit_hash, branch, commit_message); commit_hash,
} branch,
else { changes->insertions,
printf("(\x1b[33;1m%.7s\x1b[0m on \x1b[39;1;4m%s\x1b[0m \x1b[32;1m%d+\x1b[0m \x1b[31;1m%d-\x1b[0m) %s\n", commit_hash, branch, changes->insertions, changes->deletions, commit_message); changes->deletions,
} commit_message
);
list_free(files); list_free(files);
base_file_buffer_free(base_files); base_file_buffer_free(base_files);