1#[derive(Debug, Copy, Clone, PartialEq, Eq)]
3#[allow(clippy::exhaustive_enums)]
4pub enum ReferenceKind {
5 Branch,
7 Note,
9 Remote,
11 Tag,
13 Other,
15}
16
17impl ReferenceKind {
18 pub(crate) fn from(reference: &git2::Reference<'_>) -> Self {
19 if reference.is_branch() {
20 Self::Branch
21 }
22 else if reference.is_note() {
23 Self::Note
24 }
25 else if reference.is_remote() {
26 Self::Remote
27 }
28 else if reference.is_tag() {
29 Self::Tag
30 }
31 else {
32 Self::Other
33 }
34 }
35}
36
37#[cfg(test)]
38mod tests {
39 use super::*;
40 use crate::testutil::{with_temp_repository, JAN_2021_EPOCH};
41
42 #[test]
43 fn from_git2_reference_branch() {
44 with_temp_repository(|repository| {
45 assert_eq!(
46 ReferenceKind::from(
47 &repository
48 .repository()
49 .lock()
50 .find_reference("refs/heads/main")
51 .unwrap()
52 ),
53 ReferenceKind::Branch
54 );
55 });
56 }
57
58 #[test]
59 fn from_git2_reference_note() {
60 with_temp_repository(|repository| {
61 let git2_repository = repository.repository();
62 let git2_lock = git2_repository.lock();
63 let sig = git2::Signature::new("name", "name@example.com", &git2::Time::new(JAN_2021_EPOCH, 0)).unwrap();
64 let head_id = git2_lock.refname_to_id("HEAD").unwrap();
65 _ = git2_lock.note(&sig, &sig, None, head_id, "note", false).unwrap();
66 assert_eq!(
67 ReferenceKind::from(&git2_lock.find_reference("refs/notes/commits").unwrap()),
68 ReferenceKind::Note
69 );
70 });
71 }
72
73 #[test]
74 fn from_git2_reference_remote() {
75 with_temp_repository(|repository| {
76 let git2_repository = repository.repository();
77 let git2_lock = git2_repository.lock();
78 let mut remote = git2_lock.remote("origin", git2_lock.path().to_str().unwrap()).unwrap();
79 remote.fetch(&["main"], None, None).unwrap();
80 assert_eq!(
81 ReferenceKind::from(&git2_lock.find_reference("refs/remotes/origin/main").unwrap()),
82 ReferenceKind::Remote
83 );
84 });
85 }
86
87 #[test]
88 fn from_git2_reference_tag() {
89 with_temp_repository(|repository| {
90 let git2_repository = repository.repository();
91 let git2_lock = git2_repository.lock();
92 let sig = git2::Signature::new("name", "name@example.com", &git2::Time::new(JAN_2021_EPOCH, 0)).unwrap();
93 let head_id = git2_lock.revparse_single("HEAD").unwrap();
94 _ = git2_lock.tag("tag", &head_id, &sig, "note", false).unwrap();
95 assert_eq!(
96 ReferenceKind::from(&git2_lock.find_reference("refs/tags/tag").unwrap()),
97 ReferenceKind::Tag
98 );
99 });
100 }
101
102 #[test]
103 fn from_git2_reference_other() {
104 with_temp_repository(|repository| {
105 let git2_repository = repository.repository();
106 let git2_lock = git2_repository.lock();
107 let blob = git2_lock.blob(b"foo").unwrap();
108 _ = git2_lock.reference("refs/blob", blob, false, "blob").unwrap();
109 assert_eq!(
110 ReferenceKind::from(&git2_lock.find_reference("refs/blob").unwrap()),
111 ReferenceKind::Other
112 );
113 });
114 }
115}