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
//! Git provider driver for reovim.
//!
//! This driver defines the interface for git data access.
//! Following the mechanism/policy separation:
//!
//! - **Mechanism** (this driver): [`GitProvider`] trait, typed data structs,
//! [`GitProviderStore`] for service discovery
//! - **Policy** (modules): Implementations such as subprocess-based git
//! access or library-based (libgit2)
//!
//! # Architecture (#530)
//!
//! Cross-cutting git data (branches, status, log, diff hunks) is provided
//! once at the driver layer and consumed by multiple modules (pickers,
//! statusline, gutter signs, blame) through `ServiceRegistry`.
//!
//! ```text
//! ┌─────────────────────────────────────────────────────────┐
//! │ Consumers (pickers, statusline, gutter, blame) │
//! │ → services.get::<GitProviderStore>()?.get()? │
//! ├─────────────────────────────────────────────────────────┤
//! │ ServiceRegistry │
//! │ → GitProviderStore holds Arc<dyn GitProvider> │
//! ├─────────────────────────────────────────────────────────┤
//! │ Driver (this crate) │
//! │ → GitProvider trait, typed data structs │
//! ├─────────────────────────────────────────────────────────┤
//! │ Module (reovim-module-git) │
//! │ → SubprocessGitProvider implementation │
//! └─────────────────────────────────────────────────────────┘
//! ```
//!
//! # Example
//!
//! ```ignore
//! use reovim_driver_git::{GitProviderStore, GitProvider};
//!
//! // In module init():
//! let store = ctx.services.get_or_create::<GitProviderStore>();
//! store.register(Arc::new(SubprocessGitProvider));
//!
//! // In any consumer:
//! let store = ctx.services.get::<GitProviderStore>()?;
//! let git = store.get()?;
//! let branches = git.branches(&cwd);
//! ```
pub use ;