https://dev.kronoz.win/r/rgit.git
1use std::path::Path;
2
3use crate::database::schema::repository::RepositoryId;
4
5#[repr(u8)]
6pub enum TreePrefix {
7 Repository = 0,
8 Commit = 100,
9 Tag = 101,
10}
11
12impl TreePrefix {
13 pub fn repository_id<T: AsRef<Path>>(path: T) -> Vec<u8> {
14 let path = path.as_ref().to_string_lossy();
15 let path_bytes = path.as_bytes();
16
17 let mut prefixed = Vec::with_capacity(path_bytes.len() + std::mem::size_of::<TreePrefix>());
18 prefixed.push(Self::Repository as u8);
19 prefixed.extend_from_slice(path_bytes);
20
21 prefixed
22 }
23
24 pub fn commit_id<T: AsRef<[u8]>>(repository: RepositoryId, reference: T) -> Vec<u8> {
25 let reference = reference.as_ref();
26
27 let mut prefixed = Vec::with_capacity(
28 reference.len()
29 + std::mem::size_of::<RepositoryId>()
30 + std::mem::size_of::<TreePrefix>(),
31 );
32 prefixed.push(TreePrefix::Commit as u8);
33 prefixed.extend_from_slice(&repository.to_ne_bytes());
34 prefixed.extend_from_slice(reference);
35
36 prefixed
37 }
38
39 pub fn tag_id(repository: RepositoryId) -> Vec<u8> {
40 let mut prefixed = Vec::with_capacity(
41 std::mem::size_of::<TreePrefix>() + std::mem::size_of::<RepositoryId>(),
42 );
43 prefixed.push(TreePrefix::Tag as u8);
44 prefixed.extend_from_slice(&repository.to_ne_bytes());
45
46 prefixed
47 }
48}