diff options
author | Benedikt Peetz <benedikt.peetz@b-peetz.de> | 2024-12-26 17:50:54 +0100 |
---|---|---|
committer | Benedikt Peetz <benedikt.peetz@b-peetz.de> | 2024-12-26 17:58:27 +0100 |
commit | dfb5714045e99a09bf3f67890ae3cdeab47058b3 (patch) | |
tree | 5e76e310892ea7e36099312e25023aa154217a28 /pkgs/by-name/ba/back/src/git_bug/issue/identity | |
parent | fix(pkgs/back): Use rocket to manage the configuration values (diff) | |
download | nixos-server-dfb5714045e99a09bf3f67890ae3cdeab47058b3.zip |
feat(pkgs/back): Rewrite the `git-bug` interface code
The previous code was more or less reverse engineered, whilst this code is based on the actually git-bug source code. This improves the whole issue and operation handling immensely and also makes the code better maintainable. Furthermore, it also adds support for the operations that had not already used in `vhack.eu/nixos-server.git`.
Diffstat (limited to 'pkgs/by-name/ba/back/src/git_bug/issue/identity')
-rw-r--r-- | pkgs/by-name/ba/back/src/git_bug/issue/identity/mod.rs | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/pkgs/by-name/ba/back/src/git_bug/issue/identity/mod.rs b/pkgs/by-name/ba/back/src/git_bug/issue/identity/mod.rs new file mode 100644 index 0000000..0c2f426 --- /dev/null +++ b/pkgs/by-name/ba/back/src/git_bug/issue/identity/mod.rs @@ -0,0 +1,71 @@ +// Back - An extremely simple git issue tracking system. Inspired by tvix's +// panettone +// +// Copyright (C) 2024 Benedikt Peetz <benedikt.peetz@b-peetz.de> +// SPDX-License-Identifier: AGPL-3.0-or-later +// +// This file is part of Back. +// +// You should have received a copy of the License along with this program. +// If not, see <https://www.gnu.org/licenses/agpl.txt>. + +use gix::{bstr::ByteSlice, Repository}; +use serde::Deserialize; +use serde_json::Value; + +use crate::{get, git_bug::format::HtmlString}; + +use super::entity::Id; + +#[derive(Debug, Clone)] +pub struct Author { + pub name: HtmlString, + pub email: HtmlString, + pub id: Id, +} + +impl Author { + pub fn construct(repo: &Repository, raw: RawAuthor) -> Self { + let commit_obj = repo + .find_reference(&format!("refs/identities/{}", raw.id)) + .expect("All authors should also have identities") + .peel_to_commit() + .expect("All identities should be commits"); + + let tree_obj = repo + .find_tree( + commit_obj + .tree() + .expect("The commit should have an tree associated with it") + .id, + ) + .expect("This should be a tree"); + + let data = repo + .find_blob( + tree_obj + .find_entry("version") + .expect("This entry should exist") + .object() + .expect("This should point to a blob entry") + .id, + ) + .expect("This blob should exist") + .data + .clone(); + + let json: Value = serde_json::from_str(data.to_str().expect("This is encoded json")) + .expect("This is valid json"); + + Author { + name: get! {json, "name"}, + email: get! {json, "email"}, + id: raw.id, + } + } +} + +#[derive(Deserialize)] +pub struct RawAuthor { + id: Id, +} |