aboutsummaryrefslogtreecommitdiff
path: root/git2d
diff options
context:
space:
mode:
authorRunxi Yu <me@runxiyu.org>2025-04-03 15:32:27 +0800
committerRunxi Yu <me@runxiyu.org>2025-04-03 15:32:27 +0800
commit00442d92d5340f3a60965b395e14a7ba785aa4e9 (patch)
tree5054f4c2dc396ad5d852c8e49be569e464a2c750 /git2d
parentgit2d: Use BARE to send contents too, instead of using raw write (diff)
downloadforge-00442d92d5340f3a60965b395e14a7ba785aa4e9.tar.gz
forge-00442d92d5340f3a60965b395e14a7ba785aa4e9.tar.zst
forge-00442d92d5340f3a60965b395e14a7ba785aa4e9.zip
git2d: Report recent commits too
Also reformat in a Linux-esque style. I can't really maintain KNF without using BSD indent(1).
Diffstat (limited to 'git2d')
-rw-r--r--git2d/main.c83
1 files changed, 68 insertions, 15 deletions
diff --git a/git2d/main.c b/git2d/main.c
index 91f2572..a795695 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 @@ conn_write(void *buffer, const void *src, uint64_t sz)
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 @@ session(void *_conn)
.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 @@ session(void *_conn)
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 @@ session(void *_conn)
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 @@ session(void *_conn)
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 @@ main(int argc, char **argv)
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 @@ main(int argc, char **argv)
listen(sock, 0);
for (;;) {
- int *conn = malloc(sizeof(int));
+ int *conn = malloc(sizeof(int));
if (conn == NULL)
err(1, "malloc");
@@ -186,7 +240,7 @@ main(int argc, char **argv)
if (*conn == -1)
err(1, "accept");
- pthread_t thread;
+ pthread_t thread;
pthread_create(&thread, NULL, session, (void *)conn);
}
@@ -195,4 +249,3 @@ main(int argc, char **argv)
git_libgit2_shutdown();
}
-