Skip to main content

changeset_operations/providers/
git.rs

1use 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}