aboutsummaryrefslogtreecommitdiff
path: root/git2d/session.c
diff options
context:
space:
mode:
authorRunxi Yu <me@runxiyu.org>2025-08-12 11:01:07 +0800
committerRunxi Yu <me@runxiyu.org>2025-09-15 15:19:12 +0800
commiteb82fdb2dc0903e6125014abd64aceab42c8eb35 (patch)
treec07276ba1595c415ebc28943163d88f3e3180254 /git2d/session.c
parentRemove forge-specific functions from misc (diff)
downloadforge-eb82fdb2dc0903e6125014abd64aceab42c8eb35.tar.gz
forge-eb82fdb2dc0903e6125014abd64aceab42c8eb35.tar.zst
forge-eb82fdb2dc0903e6125014abd64aceab42c8eb35.zip
RefactorHEADmaster
Diffstat (limited to 'git2d/session.c')
-rw-r--r--git2d/session.c91
1 files changed, 78 insertions, 13 deletions
diff --git a/git2d/session.c b/git2d/session.c
index 0a945ee..b5691d3 100644
--- a/git2d/session.c
+++ b/git2d/session.c
@@ -29,25 +29,30 @@ void *session(void *_conn)
goto close;
}
path[sizeof(path) - 1] = '\0';
-
- /* Open repo */
- git_repository *repo = NULL;
- err =
- git_repository_open_ext(&repo, path,
- GIT_REPOSITORY_OPEN_NO_SEARCH |
- GIT_REPOSITORY_OPEN_BARE |
- GIT_REPOSITORY_OPEN_NO_DOTGIT, NULL);
- if (err != 0) {
- bare_put_uint(&writer, 1);
- goto close;
- }
+ fprintf(stderr, "session: path='%s'\n", path);
/* Command */
uint64_t cmd = 0;
err = bare_get_uint(&reader, &cmd);
if (err != BARE_ERROR_NONE) {
bare_put_uint(&writer, 2);
- goto free_repo;
+ goto close;
+ }
+ fprintf(stderr, "session: cmd=%llu\n", (unsigned long long)cmd);
+
+ /* Repo init does not require opening an existing repo so let's just do it here */
+ if (cmd == 15) {
+ fprintf(stderr, "session: handling init for '%s'\n", path);
+ if (cmd_init_repo(path, &reader, &writer) != 0) {
+ }
+ goto close;
+ }
+
+ git_repository *repo = NULL;
+ err = git_repository_open_ext(&repo, path, GIT_REPOSITORY_OPEN_NO_SEARCH | GIT_REPOSITORY_OPEN_BARE | GIT_REPOSITORY_OPEN_NO_DOTGIT, NULL);
+ if (err != 0) {
+ bare_put_uint(&writer, 1);
+ goto close;
}
switch (cmd) {
case 1:
@@ -60,6 +65,66 @@ void *session(void *_conn)
if (err != 0)
goto free_repo;
break;
+ case 3:
+ err = cmd_resolve_ref(repo, &reader, &writer);
+ if (err != 0)
+ goto free_repo;
+ break;
+ case 4:
+ err = cmd_list_branches(repo, &writer);
+ if (err != 0)
+ goto free_repo;
+ break;
+ case 5:
+ err = cmd_format_patch(repo, &reader, &writer);
+ if (err != 0)
+ goto free_repo;
+ break;
+ case 6:
+ err = cmd_commit_diff(repo, &reader, &writer);
+ if (err != 0)
+ goto free_repo;
+ break;
+ case 7:
+ err = cmd_merge_base(repo, &reader, &writer);
+ if (err != 0)
+ goto free_repo;
+ break;
+ case 8:
+ err = cmd_log(repo, &reader, &writer);
+ if (err != 0)
+ goto free_repo;
+ break;
+ case 9:
+ err = cmd_tree_list_by_oid(repo, &reader, &writer);
+ if (err != 0)
+ goto free_repo;
+ break;
+ case 10:
+ err = cmd_write_tree(repo, &reader, &writer);
+ if (err != 0)
+ goto free_repo;
+ break;
+ case 11:
+ err = cmd_blob_write(repo, &reader, &writer);
+ if (err != 0)
+ goto free_repo;
+ break;
+ case 12:
+ err = cmd_commit_tree_oid(repo, &reader, &writer);
+ if (err != 0)
+ goto free_repo;
+ break;
+ case 13:
+ err = cmd_commit_create(repo, &reader, &writer);
+ if (err != 0)
+ goto free_repo;
+ break;
+ case 14:
+ err = cmd_update_ref(repo, &reader, &writer);
+ if (err != 0)
+ goto free_repo;
+ break;
case 0:
bare_put_uint(&writer, 3);
goto free_repo;