changeset_operations/providers/
git.rs1use std::path::Path;
2
3use changeset_git::{CommitInfo, FileChange, Repository, TagInfo};
4
5use crate::Result;
6use crate::traits::GitProvider;
7
8pub struct Git2Provider;
9
10impl Git2Provider {
11 #[must_use]
12 pub fn new() -> Self {
13 Self
14 }
15}
16
17impl Default for Git2Provider {
18 fn default() -> Self {
19 Self::new()
20 }
21}
22
23impl GitProvider for Git2Provider {
24 fn changed_files(
25 &self,
26 project_root: &Path,
27 base: &str,
28 head: &str,
29 ) -> Result<Vec<FileChange>> {
30 let repo = Repository::open(project_root)?;
31 Ok(repo.changed_files(Some(base), head)?)
32 }
33
34 fn is_working_tree_clean(&self, project_root: &Path) -> Result<bool> {
35 let repo = Repository::open(project_root)?;
36 Ok(repo.is_working_tree_clean()?)
37 }
38
39 fn current_branch(&self, project_root: &Path) -> Result<String> {
40 let repo = Repository::open(project_root)?;
41 Ok(repo.current_branch()?)
42 }
43
44 fn stage_files(&self, project_root: &Path, paths: &[&Path]) -> Result<()> {
45 let repo = Repository::open(project_root)?;
46 Ok(repo.stage_files(paths)?)
47 }
48
49 fn commit(&self, project_root: &Path, message: &str) -> Result<CommitInfo> {
50 let repo = Repository::open(project_root)?;
51 Ok(repo.commit(message)?)
52 }
53
54 fn create_tag(&self, project_root: &Path, tag_name: &str, message: &str) -> Result<TagInfo> {
55 let repo = Repository::open(project_root)?;
56 Ok(repo.create_tag(tag_name, message)?)
57 }
58
59 fn remote_url(&self, project_root: &Path) -> Result<Option<String>> {
60 let repo = Repository::open(project_root)?;
61 Ok(repo.remote_url()?)
62 }
63
64 fn delete_files(&self, project_root: &Path, paths: &[&Path]) -> Result<()> {
65 let repo = Repository::open(project_root)?;
66 Ok(repo.delete_files(paths)?)
67 }
68
69 fn delete_tag(&self, project_root: &Path, tag_name: &str) -> Result<bool> {
70 let repo = Repository::open(project_root)?;
71 Ok(repo.delete_tag(tag_name)?)
72 }
73
74 fn reset_to_parent(&self, project_root: &Path) -> Result<()> {
75 let repo = Repository::open(project_root)?;
76 Ok(repo.reset_to_parent()?)
77 }
78}