git/
reference_kind.rs

1/// Represents the kind of a reference
2#[derive(Debug, Copy, Clone, PartialEq, Eq)]
3#[allow(clippy::exhaustive_enums)]
4pub enum ReferenceKind {
5	/// Reference is a branch.
6	Branch,
7	/// Reference is a note.
8	Note,
9	/// Reference is a remote.
10	Remote,
11	/// Reference is a tag.
12	Tag,
13	/// Reference is another kind.
14	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}