From 9ddff5ced5151938a0c6c7933bac8d9fdad315c3 Mon Sep 17 00:00:00 2001 From: Runxi Yu Date: Fri, 02 May 2025 10:46:11 +0800 Subject: [PATCH] git2c: Some perror --- forged/internal/git2c/perror.go | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ git2d/cmd1.c | 3 +++ git2d/cmd2.c | 12 ++++++------ diff --git a/forged/internal/git2c/perror.go b/forged/internal/git2c/perror.go new file mode 100644 index 0000000000000000000000000000000000000000..96bffd58c70e25aec9ff5bc9a227a748bc1e7e65 --- /dev/null +++ b/forged/internal/git2c/perror.go @@ -0,0 +1,48 @@ +// SPDX-License-Identifier: AGPL-3.0-only +// SPDX-FileCopyrightText: Copyright (c) 2025 Runxi Yu + +// TODO: Make the C part report detailed error messages too + +package git2c + +import "errors" + +var ( + Success error + ErrUnknown = errors.New("git2c: unknown error") + ErrPath = errors.New("git2c: get tree entry by path failed") + ErrRevparse = errors.New("git2c: revparse failed") + ErrReadme = errors.New("git2c: no readme") + ErrBlobExpected = errors.New("git2c: blob expected") + ErrEntryToObject = errors.New("git2c: tree entry to object conversion failed") + ErrBlobRawContent = errors.New("git2c: get blob raw content failed") + ErrRevwalk = errors.New("git2c: revwalk failed") + ErrRevwalkPushHead = errors.New("git2c: revwalk push head failed") + ErrBareProto = errors.New("git2c: bare protocol error") +) + +func Perror(errno uint) error { + switch errno { + case 0: + return Success + case 3: + return ErrPath + case 4: + return ErrRevparse + case 5: + return ErrReadme + case 6: + return ErrBlobExpected + case 7: + return ErrEntryToObject + case 8: + return ErrBlobRawContent + case 9: + return ErrRevwalk + case 10: + return ErrRevwalkPushHead + case 11: + return ErrBareProto + } + return ErrUnknown +} diff --git a/git2d/cmd1.c b/git2d/cmd1.c index 5d1988d098d0abfa35b816842cb64acec21a3741..d30fc04435c2844cd6e02127d7e6482eacac702a 100644 --- a/git2d/cmd1.c +++ b/git2d/cmd1.c @@ -9,6 +9,7 @@ int cmd_index(git_repository *repo, struct bare_writer *writer) { /* HEAD tree */ + git_object *obj = NULL; int err = git_revparse_single(&obj, repo, "HEAD^{tree}"); if (err != 0) { @@ -54,6 +55,8 @@ bare_put_uint(writer, 0); bare_put_data(writer, content, git_blob_rawsize(blob)); /* Commits */ + + /* TODO BUG: This might be a different commit from the displayed README due to races */ git_revwalk *walker = NULL; if (git_revwalk_new(&walker, repo) != 0) { diff --git a/git2d/cmd2.c b/git2d/cmd2.c index 7201a822b45af44a7fdd400a052d2274505253bc..eb8983d2680290c5484fd4aacfb2a24aac3c17ad 100644 --- a/git2d/cmd2.c +++ b/git2d/cmd2.c @@ -12,7 +12,7 @@ /* Path */ char path[4096] = {0}; int err = bare_get_data(reader, (uint8_t *)path, sizeof(path) - 1); if (err != BARE_ERROR_NONE) { - bare_put_uint(writer, 10); + bare_put_uint(writer, 11); return -1; } path[sizeof(path) - 1] = '\0'; @@ -21,7 +21,7 @@ /* HEAD^{tree} */ git_object *head_obj = NULL; err = git_revparse_single(&head_obj, repo, "HEAD^{tree}"); if (err != 0) { - bare_put_uint(writer, 11); + bare_put_uint(writer, 4); return -1; } git_tree *tree = (git_tree *)head_obj; @@ -50,7 +50,7 @@ tree_obj = (git_object *)tree; } else { err = git_tree_entry_to_object(&tree_obj, repo, entry); if (err != 0) { - bare_put_uint(writer, 3); + bare_put_uint(writer, 7); goto cleanup; } } @@ -95,13 +95,13 @@ /* Blob */ git_object *blob_obj = NULL; err = git_tree_entry_to_object(&blob_obj, repo, entry); if (err != 0) { - bare_put_uint(writer, 3); + bare_put_uint(writer, 7); goto cleanup; } git_blob *blob = (git_blob *)blob_obj; const void *content = git_blob_rawcontent(blob); if (content == NULL) { - bare_put_uint(writer, 3); + bare_put_uint(writer, 8); git_blob_free(blob); goto cleanup; } @@ -111,7 +111,7 @@ bare_put_data(writer, content, git_blob_rawsize(blob)); git_blob_free(blob); } else { /* Unknown */ - bare_put_uint(writer, 3); + bare_put_uint(writer, -1); } cleanup: -- 2.48.1