fix(cli): fixed diff display in the post commit message
This commit is contained in:
parent
730d2b84e0
commit
b1515d21c4
1 changed files with 146 additions and 15 deletions
161
src/main.c
161
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);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue