August Feng

some painful fun with libgit2 and c

About

I wanted to experience C pain. So I compiled the libgit2 and build a program with it.

Program

#include <git2.h>
#include <stdio.h>
#include <string.h>

int diff_file_callback(const git_diff_delta *delta, float progress, void *payload) {
  printf("Old file: %s\n", delta->old_file.path);
  printf("New file: %s\n", delta->new_file.path);
  return 0;
}

int diff_hunk_callback(const git_diff_delta *delta, const git_diff_hunk *hunk, void *payload) {
  printf("Hunk: --- %s  +++ %s\n", delta->old_file.path, delta->new_file.path);
  printf("Hunk line range: Old start %d, Old end %d -> New start %d, New end %d\n",
         hunk->old_start, hunk->old_lines, hunk->new_start, hunk->new_lines);
  return 0;
}

int diff_line_callback(const git_diff_delta *delta, const git_diff_hunk *hunk, const git_diff_line *line, void *payload) {
  switch (line->origin) {
  case GIT_DIFF_LINE_ADDITION:
    printf("Added line: %.*s\n", (int)line->content_len, line->content);
    break;
  case GIT_DIFF_LINE_DELETION:
    printf("Deleted line: %.*s\n", (int)line->content_len, line->content);
    break;
  default:
    break;
  }
  return 0;
}

int main() {
    git_libgit2_init();

    const char *old_buf = "Hello, World!\nThis is the old version.";
    size_t old_len = strlen(old_buf);
    const char *new_buf = "Hello, World!\nThis is the new version.";
    size_t new_len = strlen(new_buf);

    // file level
    printf("--- file level ---\n");
    git_diff_buffers(old_buf, old_len, "foobar", new_buf, new_len, "foobaz", NULL, diff_file_callback, NULL, NULL, NULL, NULL);

    // hunk level
    printf("--- hunk level ---\n");
    git_diff_buffers(old_buf, old_len, "foobar", new_buf, new_len, "foobaz", NULL, NULL, NULL, diff_hunk_callback, NULL, NULL);

    // line level
    printf("--- line level ---\n");
    git_diff_buffers(old_buf, old_len, "foobar", new_buf, new_len, "foobaz", NULL, NULL, NULL, NULL, diff_line_callback, NULL);

    git_libgit2_shutdown();
    return 0;
}