git/
commit_diff.rs

1use crate::{commit::Commit, file_status::FileStatus};
2
3/// Represents a commit with a diff
4#[derive(Debug)]
5pub struct CommitDiff {
6	pub(crate) commit: Commit,
7	pub(crate) parent: Option<Commit>,
8	pub(crate) file_statuses: Vec<FileStatus>,
9	pub(crate) number_files_changed: usize,
10	pub(crate) number_insertions: usize,
11	pub(crate) number_deletions: usize,
12}
13
14impl CommitDiff {
15	/// The commit of the diff
16	#[inline]
17	#[must_use]
18	pub const fn commit(&self) -> &Commit {
19		&self.commit
20	}
21
22	/// The parent commit for the diff
23	#[inline]
24	#[must_use]
25	pub const fn parent(&self) -> &Option<Commit> {
26		&self.parent
27	}
28
29	/// The file statuses
30	#[inline]
31	#[must_use]
32	pub const fn file_statuses(&self) -> &Vec<FileStatus> {
33		&self.file_statuses
34	}
35
36	/// The total number of files changed in the diff
37	#[inline]
38	#[must_use]
39	pub const fn number_files_changed(&self) -> usize {
40		self.number_files_changed
41	}
42
43	/// The total number of insertions in the diff
44	#[inline]
45	#[must_use]
46	pub const fn number_insertions(&self) -> usize {
47		self.number_insertions
48	}
49
50	/// The total number of deletions in the diff
51	#[inline]
52	#[must_use]
53	pub const fn number_deletions(&self) -> usize {
54		self.number_deletions
55	}
56}
57
58#[cfg(test)]
59mod tests {
60	use claim::assert_some_eq;
61
62	use crate::{
63		delta::Delta,
64		diff_line::DiffLine,
65		file_mode::FileMode,
66		file_status::FileStatus,
67		file_status_builder::FileStatusBuilder,
68		status::Status,
69		testutil::{CommitBuilder, CommitDiffBuilder},
70		Origin,
71	};
72
73	#[test]
74	fn commit() {
75		let diff = CommitDiffBuilder::new(CommitBuilder::new("0123456789ABCDEF").build()).build();
76		assert_eq!(diff.commit(), &CommitBuilder::new("0123456789ABCDEF").build());
77	}
78
79	#[test]
80	fn parent() {
81		let diff = CommitDiffBuilder::new(CommitBuilder::new("0123456789ABCDEF").build())
82			.parent(CommitBuilder::new("ABCDEF0123456789").build())
83			.build();
84		assert_some_eq!(diff.parent(), &CommitBuilder::new("ABCDEF0123456789").build());
85	}
86
87	#[test]
88	fn file_statuses() {
89		let mut builder = FileStatusBuilder::new();
90		builder.add_file_stat(FileStatus::new(
91			"foo",
92			FileMode::Normal,
93			false,
94			"foo",
95			FileMode::Normal,
96			false,
97			Status::Modified,
98		));
99		builder.add_delta(Delta::new("name", 0, 0, 0, 1));
100		builder.add_diff_line(DiffLine::new(Origin::Addition, "line", None, Some(1), false));
101		let file_statuses = builder.build();
102		let diff = CommitDiffBuilder::new(CommitBuilder::new("0123456789ABCDEF").build())
103			.file_statuses(file_statuses)
104			.build();
105		assert_eq!(diff.file_statuses()[0].source_path.to_string_lossy(), "foo");
106	}
107
108	#[test]
109	fn number_files_changed() {
110		let diff = CommitDiffBuilder::new(CommitBuilder::new("0123456789ABCDEF").build())
111			.number_files_changed(1)
112			.build();
113		assert_eq!(diff.number_files_changed(), 1);
114	}
115
116	#[test]
117	fn number_insertions() {
118		let diff = CommitDiffBuilder::new(CommitBuilder::new("0123456789ABCDEF").build())
119			.number_insertions(2)
120			.build();
121		assert_eq!(diff.number_insertions(), 2);
122	}
123
124	#[test]
125	fn number_deletions() {
126		let diff = CommitDiffBuilder::new(CommitBuilder::new("0123456789ABCDEF").build())
127			.number_deletions(3)
128			.build();
129		assert_eq!(diff.number_deletions(), 3);
130	}
131}