History

commit_builder: keep MutableRepo reference

When you're done with the `CommitBuilder`, you're going to have to call `write_to_repo()`, passing it a mutable `MutableRepo` reference. It's a bit simpler to pass that reference when we create the `CommitBuilder` instead, so that's what this patch does. A drawback of passing in the mutable reference when we create the builder is that we can't have multiple unfinished `CommitBuilder` instance live at the same time. We don't have any such use cases yet, and it's not hard to work around them, so I think this change is worth it.

Martin von Zweigbergk committed 3 years ago

Commit 49b2f3b1 parent 70a679821 files · +411 −359Browse files

Showing the changes to lib/src/commit_builder.rs (1 of 21 files). Show all

Unified · Split

lib/src/commit_builder.rs+17−9
@@ -20,8 +20,8 @@ use crate::commit::Commit; · 19 unmodified lines
2020 use crate::repo::MutableRepo;
2121 use crate::settings::UserSettings;
2222
23−#[derive(Debug)]
24−pub struct CommitBuilder {
23+pub struct CommitBuilder<'repo> {
24+ mut_repo: &'repo mut MutableRepo,
2525 commit: backend::Commit,
2626 rewrite_source: Option<Commit>,
2727 }
@@ -30,12 +30,13 @@ pub fn new_change_id() -> ChangeId { · 2 unmodified lines
3030 ChangeId::from_bytes(Uuid::new_v4().as_bytes())
3131 }
3232
33−impl CommitBuilder {
34− pub fn for_new_commit(
33+impl CommitBuilder<'_> {
34+ pub fn for_new_commit<'repo>(
35+ mut_repo: &'repo mut MutableRepo,
3536 settings: &UserSettings,
3637 parents: Vec<CommitId>,
3738 tree_id: TreeId,
38− ) -> CommitBuilder {
39+ ) -> CommitBuilder<'repo> {
3940 let signature = settings.signature();
4041 assert!(!parents.is_empty());
4142 let commit = backend::Commit {
@@ -48,12 +49,17 @@ impl CommitBuilder { · 6 unmodified lines
4849 committer: signature,
4950 };
5051 CommitBuilder {
52+ mut_repo,
5153 commit,
5254 rewrite_source: None,
5355 }
5456 }
5557
56− pub fn for_rewrite_from(settings: &UserSettings, predecessor: &Commit) -> CommitBuilder {
58+ pub fn for_rewrite_from<'repo>(
59+ mut_repo: &'repo mut MutableRepo,
60+ settings: &UserSettings,
61+ predecessor: &Commit,
62+ ) -> CommitBuilder<'repo> {
5763 let mut commit = predecessor.store_commit().clone();
5864 commit.predecessors = vec![predecessor.id().clone()];
5965 commit.committer = settings.signature();
@@ -66,6 +72,7 @@ impl CommitBuilder { · 6 unmodified lines
6672 commit.author.email = commit.committer.email.clone();
6773 }
6874 CommitBuilder {
75+ mut_repo,
6976 commit,
7077 rewrite_source: Some(predecessor.clone()),
7178 }
@@ -112,16 +119,17 @@ impl CommitBuilder { · 40 unmodified lines
112119 self
113120 }
114121
115− pub fn write_to_repo(self, repo: &mut MutableRepo) -> Commit {
122+ pub fn write(self) -> Commit {
116123 let mut rewrite_source_id = None;
117124 if let Some(rewrite_source) = self.rewrite_source {
118125 if *rewrite_source.change_id() == self.commit.change_id {
119126 rewrite_source_id.replace(rewrite_source.id().clone());
120127 }
121128 }
122− let commit = repo.write_commit(self.commit);
129+ let commit = self.mut_repo.write_commit(self.commit);
123130 if let Some(rewrite_source_id) = rewrite_source_id {
124− repo.record_rewritten_commit(rewrite_source_id, commit.id().clone())
131+ self.mut_repo
132+ .record_rewritten_commit(rewrite_source_id, commit.id().clone())
125133 }
126134 commit
127135 }