From b1515d21c4f4578d26952f6b037649dd6ba30134 Mon Sep 17 00:00:00 2001 From: lisk77 Date: Sat, 20 Sep 2025 05:41:22 +0200 Subject: [PATCH] fix(cli): fixed diff display in the post commit message --- src/main.c | 161 ++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 146 insertions(+), 15 deletions(-) diff --git a/src/main.c b/src/main.c index f1f8914..ca67488 100644 --- a/src/main.c +++ b/src/main.c @@ -384,21 +384,151 @@ int main(int argc, char** argv) { BaseFileInfo info = (BaseFileInfo){.base_num = 0, .diff_num = 0, .name = strdup(files->items[idx])}; base_file_buffer_push(base_files, info); // 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]; snapshot_file(files->items[idx], root, 0, file_hash); 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]); - 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); - // 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); @@ -513,12 +643,13 @@ int main(int argc, char** argv) { write(ref, commit_hash, 40); close(ref); - if (changes->insertions == 0 && changes->deletions == 0) { - printf("(\x1b[33;1m%.7s\x1b[0m on \x1b[39;1;4m%s\x1b[0m) %s\n", commit_hash, branch, commit_message); - } - else { - 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); - } + 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 + ); list_free(files); base_file_buffer_free(base_files);