feat(cli): added a visual branch for the log
This commit is contained in:
parent
0b7d959663
commit
0e0d1fa1ef
1 changed files with 47 additions and 2 deletions
49
src/main.c
49
src/main.c
|
|
@ -197,7 +197,27 @@ int main(int argc, char** argv) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
ActionList* diff = myers_diff(basefile, modified_file, 0, 0);
|
File* comparison_file = basefile;
|
||||||
|
|
||||||
|
// If there are previous diffs, we need to compare against the last committed version
|
||||||
|
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(file_name)];
|
||||||
|
snprintf(id2, sizeof(id2), "%s %zu", file_name, 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) {
|
||||||
|
File* last_version = apply_diff(basefile, last_diff);
|
||||||
|
if (last_version) {
|
||||||
|
comparison_file = last_version;
|
||||||
|
}
|
||||||
|
free_action_list(last_diff);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ActionList* diff = myers_diff(comparison_file, modified_file, 0, 0);
|
||||||
if (!diff) {
|
if (!diff) {
|
||||||
printf("ERROR: unable to compute diff for file %s!\n", file_name);
|
printf("ERROR: unable to compute diff for file %s!\n", file_name);
|
||||||
return 1;
|
return 1;
|
||||||
|
|
@ -214,6 +234,13 @@ int main(int argc, char** argv) {
|
||||||
}
|
}
|
||||||
string_buffer_push(modified_files, file_name);
|
string_buffer_push(modified_files, file_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
free_action_list(diff);
|
||||||
|
free_file(modified_file);
|
||||||
|
if (comparison_file != basefile) {
|
||||||
|
free_file(comparison_file);
|
||||||
|
}
|
||||||
|
free_file(basefile);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -728,13 +755,30 @@ int main(int argc, char** argv) {
|
||||||
|
|
||||||
read_commit_log(log, log_path);
|
read_commit_log(log, log_path);
|
||||||
|
|
||||||
|
char ref_path[PATH_MAX];
|
||||||
|
snprintf(ref_path, sizeof(ref_path), "%s/.merk/refs/branches/%s", root, branch);
|
||||||
|
|
||||||
|
int ref = open(ref_path, O_RDONLY);
|
||||||
|
if (ref < 0) {
|
||||||
|
free(branch);
|
||||||
|
free(root);
|
||||||
|
commit_log_free(log);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
char head[41] = "";
|
||||||
|
read(ref, head, 40);
|
||||||
|
close(ref);
|
||||||
|
|
||||||
for (size_t i = log->len; i != 0; i--) {
|
for (size_t i = log->len; i != 0; i--) {
|
||||||
Commit* commit = (Commit*)log->items + i - 1;
|
Commit* commit = (Commit*)log->items + i - 1;
|
||||||
char human_readable_time[32];
|
char human_readable_time[32];
|
||||||
time_t timestamp = atol(commit->committer.timestamp);
|
time_t timestamp = atol(commit->committer.timestamp);
|
||||||
strftime(human_readable_time, sizeof(human_readable_time), "%Y-%m-%d %H:%M:%S %z", localtime(×tamp));
|
strftime(human_readable_time, sizeof(human_readable_time), "%Y-%m-%d %H:%M:%S %z", localtime(×tamp));
|
||||||
|
|
||||||
printf("\x1b[33;1m%.7s\x1b[0m: %s\n%s <\x1b[38;5;240m\x1b]8;;mailto:%s\x1b\\%s\x1b]8;;\x1b\\\x1b[0m> (\x1b[36m%s\x1b[0m)\n\n",
|
char* marker = (strcmp(commit->hash, head) == 0) ? "\x1b[32m@\x1b[0m" : "\x1b[34m◯\x1b[0m";
|
||||||
|
|
||||||
|
printf("%s \x1b[33;1m%.7s\x1b[0m: %s\n│ %s <\x1b[38;5;240m\x1b]8;;mailto:%s\x1b\\%s\x1b]8;;\x1b\\\x1b[0m> (\x1b[36m%s\x1b[0m)\n│\n",
|
||||||
|
marker,
|
||||||
commit->hash,
|
commit->hash,
|
||||||
commit->message,
|
commit->message,
|
||||||
commit->committer.name,
|
commit->committer.name,
|
||||||
|
|
@ -743,6 +787,7 @@ int main(int argc, char** argv) {
|
||||||
human_readable_time
|
human_readable_time
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
if (log->len != 0) printf("┴\n");
|
||||||
|
|
||||||
free(branch);
|
free(branch);
|
||||||
free(root);
|
free(root);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue