Skip to main content

changeset_operations/traits/
git_provider.rs

1use std::path::Path;
2
3use changeset_git::{CommitInfo, FileChange, TagInfo};
4
5use crate::Result;
6
7pub trait FullGitProvider:
8    GitDiffProvider
9    + GitWorkdirDiffProvider
10    + GitStatusProvider
11    + GitStagingProvider
12    + GitCommitProvider
13    + GitTagProvider
14{
15}
16impl<
17    T: GitDiffProvider
18        + GitWorkdirDiffProvider
19        + GitStatusProvider
20        + GitStagingProvider
21        + GitCommitProvider
22        + GitTagProvider,
23> FullGitProvider for T
24{
25}
26
27pub trait GitDiffProvider: Send + Sync {
28    /// # Errors
29    ///
30    /// Propagates repository errors.
31    fn changed_files(&self, project_root: &Path, base: &str, head: &str)
32    -> Result<Vec<FileChange>>;
33}
34
35pub trait GitWorkdirDiffProvider: Send + Sync {
36    /// # Errors
37    ///
38    /// Propagates repository errors.
39    fn uncommitted_changes(&self, project_root: &Path) -> Result<Vec<FileChange>>;
40}
41
42pub trait GitStatusProvider: Send + Sync {
43    /// # Errors
44    ///
45    /// Propagates repository errors.
46    fn is_working_tree_clean(&self, project_root: &Path) -> Result<bool>;
47
48    /// # Errors
49    ///
50    /// Propagates repository errors.
51    fn current_branch(&self, project_root: &Path) -> Result<String>;
52
53    /// # Errors
54    ///
55    /// Propagates repository errors.
56    fn remote_url(&self, project_root: &Path) -> Result<Option<String>>;
57}
58
59pub trait GitStagingProvider: Send + Sync {
60    /// # Errors
61    ///
62    /// Propagates repository errors.
63    fn stage_files(&self, project_root: &Path, paths: &[&Path]) -> Result<()>;
64
65    /// Fail-fast: if any file does not exist or cannot be deleted,
66    /// returns an error immediately and no further files are processed.
67    ///
68    /// # Errors
69    ///
70    /// Propagates repository errors.
71    fn delete_files(&self, project_root: &Path, paths: &[&Path]) -> Result<()>;
72}
73
74pub trait GitCommitProvider: Send + Sync {
75    /// # Errors
76    ///
77    /// Propagates repository errors.
78    fn commit(&self, project_root: &Path, message: &str) -> Result<CommitInfo>;
79
80    /// Soft reset to HEAD~1, undoing the last commit while keeping changes staged.
81    ///
82    /// # Errors
83    ///
84    /// Propagates repository errors.
85    fn reset_to_parent(&self, project_root: &Path) -> Result<()>;
86}
87
88pub trait GitTagProvider: Send + Sync {
89    /// # Errors
90    ///
91    /// Propagates repository errors.
92    fn create_tag(&self, project_root: &Path, tag_name: &str, message: &str) -> Result<TagInfo>;
93
94    /// Returns `Ok(true)` if deleted, `Ok(false)` if not found.
95    ///
96    /// # Errors
97    ///
98    /// Propagates repository errors.
99    fn delete_tag(&self, project_root: &Path, tag_name: &str) -> Result<bool>;
100}