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])};
|
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);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue