History

First pass at Repository::in_progress_state()

Alex Zepeda committed 4 years ago

Commit c2f66e41 parent 92fe5644 files · +70 −1Browse files

Unified · Split

4 files
  1. git-repository/src/lib.rs +3 −1
  2. git-repository/src/repository/mod.rs +2 −0
  3. git-repository/src/repository/state.rs +41 −0
  4. git-repository/src/types.rs +24 −0
git-repository/src/lib.rs+3−1
@@ -184,7 +184,9 @@ pub enum Path { · 183 unmodified lines
184 184
185///185///
186mod types;186mod types;
187pub use types::{Commit, DetachedObject, Head, Id, Object, Reference, Repository, Tag, ThreadSafeRepository, Tree};187pub use types::{
188 Commit, DetachedObject, Head, Id, Object, Reference, Repository, RepositoryState, Tag, ThreadSafeRepository, Tree,
189};
188 190
189pub mod commit;191pub mod commit;
190pub mod head;192pub mod head;
git-repository/src/repository/mod.rs+2−0
@@ -78,6 +78,8 @@ mod location; · 77 unmodified lines
78 78
79mod snapshots;79mod snapshots;
80 80
81mod state;
82
81mod impls;83mod impls;
82 84
83mod cache;85mod cache;
git-repository/src/repository/state.rs+41−0
@@ -0,0 +1,41 @@
1use crate::RepositoryState;
2
3impl crate::Repository {
4 /// Returns the status of an in-progress operation on a repository or [`RepositoryState::None`]
5 /// if nothing is happening.
6 pub fn in_progress_state(&self) -> RepositoryState {
7 let repo_path = self.path();
8
9 // This is modeled on the logic from wt_status_get_state in git's wt-status.c
10
11 if repo_path.join("rebase-apply/applying").is_file() {
12 return RepositoryState::ApplyMailbox;
13 } else if repo_path.join("rebase-apply").is_dir() {
14 // Should this be a separate RebaseApplyMailbox or ApplyMailboxMerge?
15 return RepositoryState::Rebase;
16 } else if repo_path.join("rebase-merge/interactive").is_file() {
17 return RepositoryState::RebaseInteractive;
18 } else if repo_path.join("rebase-merge").is_dir() {
19 // Should this be RebaseMerge?
20 return RepositoryState::Rebase;
21 } else if repo_path.join("CHERRY_PICK_HEAD").is_file() {
22 if repo_path.join("todo").is_file() {
23 return RepositoryState::CherryPickSequence;
24 } else {
25 return RepositoryState::CherryPick;
26 }
27 } else if repo_path.join("MERGE_HEAD").is_file() {
28 return RepositoryState::Merge;
29 } else if repo_path.join("BISECT_LOG").is_file() {
30 return RepositoryState::Bisect;
31 } else if repo_path.join("REVERT_HEAD").is_file() {
32 if repo_path.join("todo").is_file() {
33 return RepositoryState::RevertSequence;
34 } else {
35 return RepositoryState::Revert;
36 }
37 } else {
38 return RepositoryState::None;
39 }
40 }
41}
git-repository/src/types.rs+24−0
@@ -124,6 +124,30 @@ pub struct Repository { · 123 unmodified lines
124 pub(crate) config: crate::config::Cache,124 pub(crate) config: crate::config::Cache,
125}125}
126 126
127/// The state of a git repository
128pub enum RepositoryState {
129 /// No operations are in-progress
130 None,
131 /// Merge operation in-progress
132 Merge,
133 /// Revert operation in-progress
134 Revert,
135 ///
136 RevertSequence,
137 /// Cherry pick operation in-progress
138 CherryPick,
139 ///
140 CherryPickSequence,
141 /// Bisect in-progress
142 Bisect,
143 /// Rebase in-progress
144 Rebase,
145 /// Interactive rebase in-progress
146 RebaseInteractive,
147 /// Apply mailbox in-progress
148 ApplyMailbox,
149}
150
127/// An instance with access to everything a git repository entails, best imagined as container implementing `Sync + Send` for _most_151/// An instance with access to everything a git repository entails, best imagined as container implementing `Sync + Send` for _most_
128/// for system resources required to interact with a `git` repository which are loaded in once the instance is created.152/// for system resources required to interact with a `git` repository which are loaded in once the instance is created.
129///153///