From 00442d92d5340f3a60965b395e14a7ba785aa4e9 Mon Sep 17 00:00:00 2001 From: Runxi Yu Date: Thu, 03 Apr 2025 15:32:27 +0800 Subject: [PATCH] git2d: Report recent commits too Also reformat in a Linux-esque style. I can't really maintain KNF without using BSD indent(1). --- git2d/main.c | 83 +++++++++++++++++++++++++++++++++++++++++++---------- diff --git a/git2d/main.c b/git2d/main.c index 91f2572e1c5e3646c96cf16ba901d36a9e554dfb..a7956955404ceb0d952e70d9e1cdd3be253dc6af 100644 --- a/git2d/main.c +++ b/git2d/main.c @@ -33,7 +33,7 @@ conn_read(void *buffer, void *dst, uint64_t sz) { conn_io_t *io = buffer; ssize_t rsz = read(io->fd, dst, sz); - return (rsz == (ssize_t)sz) ? BARE_ERROR_NONE : BARE_ERROR_READ_FAILED; + return (rsz == (ssize_t) sz) ? BARE_ERROR_NONE : BARE_ERROR_READ_FAILED; } static bare_error @@ -61,14 +61,14 @@ void * session(void *_conn) { - int conn = *(int *)_conn; + int conn = *(int *)_conn; free((int *)_conn); - int err; + int err; git_repository *repo = NULL; char path[4096]; - conn_io_t io = {.fd = conn}; + conn_io_t io = {.fd = conn }; struct bare_reader reader = { .buffer = &io, .read = conn_read, @@ -78,7 +78,7 @@ .buffer = &io, .write = conn_write, }; - err = bare_get_data(&reader, (uint8_t *)path, sizeof(path) - 1); + err = bare_get_data(&reader, (uint8_t *) path, sizeof(path) - 1); if (err != BARE_ERROR_NONE) { goto close; } @@ -90,13 +90,15 @@ bare_put_uint(&writer, 1); goto close; } - git_object *obj = NULL; + git_object *obj = NULL; err = git_revparse_single(&obj, repo, "HEAD^{tree}"); if (err != 0) { bare_put_uint(&writer, 2); goto free_repo; } - git_tree *tree = (git_tree *) obj; + git_tree *tree = (git_tree *) obj; + + /* README */ git_tree_entry *entry = NULL; err = git_tree_entry_bypath(&entry, tree, "README.md"); @@ -105,21 +107,21 @@ bare_put_uint(&writer, 3); goto free_tree; } - git_otype objtype = git_tree_entry_type(entry); + git_otype objtype = git_tree_entry_type(entry); if (objtype != GIT_OBJECT_BLOB) { bare_put_uint(&writer, 4); goto free_tree_entry; } - git_object *obj2 = NULL; + git_object *obj2 = NULL; err = git_tree_entry_to_object(&obj2, repo, entry); if (err != 0) { bare_put_uint(&writer, 5); goto free_tree_entry; } - git_blob *blob = (git_blob *) obj2; - const void *content = git_blob_rawcontent(blob); + git_blob *blob = (git_blob *) obj2; + const void *content = git_blob_rawcontent(blob); if (content == NULL) { bare_put_uint(&writer, 6); goto free_blob; @@ -128,6 +130,58 @@ bare_put_uint(&writer, 0); bare_put_data(&writer, content, git_blob_rawsize(blob)); + /* Commits */ + + git_revwalk *walker = NULL; + if (git_revwalk_new(&walker, repo) != 0) { + bare_put_uint(&writer, 7); + goto free_blob; + } + + if (git_revwalk_push_head(walker) != 0) { + bare_put_uint(&writer, 8); + goto free_blob; + } + + int count = 0; + git_oid oid; + while (count < 5 && git_revwalk_next(&oid, walker) == 0) { + git_commit *commit = NULL; + if (git_commit_lookup(&commit, repo, &oid) != 0) + break; + + const char *msg = git_commit_summary(commit); + const git_signature *author = git_commit_author(commit); + time_t time = git_commit_time(commit); + char timebuf[64]; + struct tm *tm = localtime(&time); + if (tm) + strftime(timebuf, sizeof(timebuf), "%Y-%m-%d %H:%M:%S", tm); + else + strcpy(timebuf, "unknown"); + + /* ID */ + bare_put_data(&writer, oid.id, GIT_OID_RAWSZ); + + /* Title */ + size_t msg_len = msg ? strlen(msg) : 0; + bare_put_data(&writer, (const uint8_t *)(msg ? msg : ""), msg_len); + + /* Author */ + const char *author_name = author ? author->name : ""; + size_t author_len = strlen(author_name); + bare_put_data(&writer, (const uint8_t *)author_name, author_len); + + /* Author's date */ + size_t time_len = strlen(timebuf); + bare_put_data(&writer, (const uint8_t *)timebuf, time_len); + + git_commit_free(commit); + count++; + } + + git_revwalk_free(walker); + free_blob: git_blob_free(blob); free_tree_entry: @@ -154,7 +208,7 @@ signal(SIGPIPE, SIG_IGN); git_libgit2_init(); - int sock; + int sock; if ((sock = socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0)) < 0) err(1, "socket"); @@ -178,7 +232,7 @@ listen(sock, 0); for (;;) { - int *conn = malloc(sizeof(int)); + int *conn = malloc(sizeof(int)); if (conn == NULL) err(1, "malloc"); @@ -186,7 +240,7 @@ *conn = accept(sock, 0, 0); if (*conn == -1) err(1, "accept"); - pthread_t thread; + pthread_t thread; pthread_create(&thread, NULL, session, (void *)conn); } @@ -195,4 +249,3 @@ close(sock); git_libgit2_shutdown(); } - -- 2.48.1