summaryrefslogtreecommitdiffstats
path: root/src/git/reference_kind.rs
blob: d9eaa64d1ea276c84986ba54bedff277ccd1e119 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
/// Represents the kind of a reference
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
#[allow(clippy::exhaustive_enums)]
pub(crate) enum ReferenceKind {
	/// Reference is a branch.
	Branch,
	/// Reference is a note.
	Note,
	/// Reference is a remote.
	Remote,
	/// Reference is a tag.
	Tag,
	/// Reference is another kind.
	Other,
}

impl ReferenceKind {
	pub(crate) fn from(reference: &git2::Reference<'_>) -> Self {
		if reference.is_branch() {
			Self::Branch
		}
		else if reference.is_note() {
			Self::Note
		}
		else if reference.is_remote() {
			Self::Remote
		}
		else if reference.is_tag() {
			Self::Tag
		}
		else {
			Self::Other
		}
	}
}

#[cfg(test)]
mod tests {
	use super::*;
	use crate::{git::testutil::with_temp_repository, test_helpers::JAN_2021_EPOCH};

	#[test]
	fn from_git2_reference_branch() {
		with_temp_repository(|repository| {
			assert_eq!(
				ReferenceKind::from(
					&repository
						.repository()
						.lock()
						.find_reference("refs/heads/main")
						.unwrap()
				),
				ReferenceKind::Branch
			);
		});
	}

	#[test]
	fn from_git2_reference_note() {
		with_temp_repository(|repository| {
			let git2_repository = repository.repository();
			let git2_lock = git2_repository.lock();
			let sig = git2::Signature::new("name", "name@example.com", &git2::Time::new(JAN_2021_EPOCH, 0)).unwrap();
			let head_id = git2_lock.refname_to_id("HEAD").unwrap();
			_ = git2_lock.note(&sig, &sig, None, head_id, "note", false).unwrap();
			assert_eq!(
				ReferenceKind::from(&git2_lock.find_reference("refs/notes/commits").unwrap()),
				ReferenceKind::Note
			);
		});
	}

	#[test]
	fn from_git2_reference_remote() {
		with_temp_repository(|repository| {
			let git2_repository = repository.repository();
			let git2_lock = git2_repository.lock();
			let mut remote = git2_lock.remote("origin", git2_lock.path().to_str().unwrap()).unwrap();
			remote.fetch(&["main"], None, None).unwrap();
			assert_eq!(
				ReferenceKind::from(&git2_lock.find_reference("refs/remotes/origin/main").unwrap()),
				ReferenceKind::Remote
			);
		});
	}

	#[test]
	fn from_git2_reference_tag() {
		with_temp_repository(|repository| {
			let git2_repository = repository.repository();
			let git2_lock = git2_repository.lock();
			let sig = git2::Signature::new("name", "name@example.com", &git2::Time::new(JAN_2021_EPOCH, 0)).unwrap();
			let head_id = git2_lock.revparse_single("HEAD").unwrap();
			_ = git2_lock.tag("tag", &head_id, &sig, "note", false).unwrap();
			assert_eq!(
				ReferenceKind::from(&git2_lock.find_reference("refs/tags/tag").unwrap()),
				ReferenceKind::Tag
			);
		});
	}

	#[test]
	fn from_git2_reference_other() {
		with_temp_repository(|repository| {
			let git2_repository = repository.repository();
			let git2_lock = git2_repository.lock();
			let blob = git2_lock.blob(b"foo").unwrap();
			_ = git2_lock.reference("refs/blob", blob, false, "blob").unwrap();
			assert_eq!(
				ReferenceKind::from(&git2_lock.find_reference("refs/blob").unwrap()),
				ReferenceKind::Other
			);
		});
	}
}