History

[ref] refactor

Sebastian Thiel committed 5 years ago

Commit 97fc8641 parent f436f184 files · +50 −77Browse files

Unified · Split

4 files
  1. git-ref/src/store/file/transaction.rs +3 −3
  2. git-ref/src/transaction.rs +16 −37
  3. git-ref/tests/file/transaction.rs +10 −11
  4. git-ref/tests/refs.rs +21 −26
git-ref/src/store/file/transaction.rs+3−3
@@ -1,7 +1,7 @@
11 use crate::{
22 mutable::Target,
33 store::file,
4− transaction::{Change, DeleteMode, RefEdit, RefEditsExt},
4+ transaction::{Change, RefEdit, RefEditsExt, RefLogMode},
55 };
66 use bstr::BString;
77 use std::io::Write;
@@ -198,8 +198,8 @@ impl<'a> Transaction<'a> { · 190 unmodified lines
198198 Change::Delete { mode, .. } => {
199199 let lock = change.lock.take().expect("each ref is locked, even deletions");
200200 let (rm_reflog, rm_ref) = match mode {
201− DeleteMode::RefAndRefLog => (true, true),
202− DeleteMode::RefLogOnly => (true, false),
201+ RefLogMode::RefAndRefLog => (true, true),
202+ RefLogMode::RefLogOnly => (true, false),
203203 };
204204
205205 // Reflog deletion happens first in case it fails a ref without log is less terrible than
git-ref/src/transaction.rs+16−37
@@ -37,12 +37,15 @@ pub enum Change { · 36 unmodified lines
3737 /// Otherwise it functions as `create-or-update`.
3838 Update {
3939 /// How to treat the reference log.
40− mode: UpdateMode,
40+ mode: RefLogMode,
4141 /// The previous value of the ref, which will be used to assure the ref is still in the known `previous` state before
4242 /// updating it. It will also be filled in automatically for use in the reflog, if applicable.
4343 previous: Option<Target>,
4444 /// The new state of the reference, either for updating an existing one or creating a new one.
4545 new: Target,
46+ /// If set, create a reflog even though it would otherwise not be the case as prohibited by general rules.
47+ /// Note that ref-log writing might be prohibited in the entire repository which is when this flag has no effect either.
48+ force_create_reflog: bool,
4649 },
4750 /// Delete a reference and optionally check if `previous` is its content.
4851 Delete {
@@ -52,7 +55,7 @@ pub enum Change { · 3 unmodified lines
5255 /// If a previous ref existed, this value will be filled in automatically and can be accessed if the transaction was committed successfully.
5356 previous: Option<Target>,
5457 /// How to thread the reference log during deletion.
55− mode: DeleteMode,
58+ mode: RefLogMode,
5659 },
5760 }
5861
@@ -70,36 +73,16 @@ pub struct RefEdit { · 11 unmodified lines
7073
7174 /// The way to deal with the Reflog in deletions.
7275 #[derive(PartialEq, Eq, Debug, Hash, Ord, PartialOrd, Clone, Copy)]
73−pub enum DeleteMode {
76+pub enum RefLogMode {
7477 /// Delete the reference and the log
7578 RefAndRefLog,
7679 /// Delete only the reflog
7780 RefLogOnly,
7881 }
7982
80−/// The way to deal with the Reflog in a particular edit
81−///
82−/// If the `create_unconditionally` field is set, create a reflog even if it otherwise wouldn't be created,
83−/// as is the case for tags.
84−#[derive(PartialEq, Eq, Debug, Hash, Ord, PartialOrd, Clone, Copy)]
85−pub enum UpdateMode {
86− /// As symbolic references only ever see this when you want to detach them, we won't try to dereference them
87− /// in this case and apply the change to it directly.
88− RefAndRefLog {
89− /// If set, update the reflog even if it otherwise wouldn't.
90− create_unconditionally: bool,
91− },
92− /// Only update the reflog but require this to be a symbolic ref so the actual update can be performed on the
93− /// referent.
94− RefLogOnly {
95− /// If set, update the reflog even if it otherwise wouldn't.
96− create_unconditionally: bool,
97− },
98−}
99−
10083 mod ext {
10184 use crate::{
102− transaction::{Change, DeleteMode, RefEdit, Target, UpdateMode},
85+ transaction::{Change, RefEdit, RefLogMode, Target},
10386 RefStore,
10487 };
10588 use bstr::BString;
@@ -162,12 +145,14 @@ mod ext { · 56 unmodified lines
162145 deref: true,
163146 },
164147 ));
165− *mode = match *mode {
166− DeleteMode::RefLogOnly => DeleteMode::RefLogOnly,
167− DeleteMode::RefAndRefLog => DeleteMode::RefLogOnly,
168− }
148+ *mode = RefLogMode::RefLogOnly;
169149 }
170− Change::Update { mode, previous, new } => {
150+ Change::Update {
151+ mode,
152+ previous,
153+ new,
154+ force_create_reflog,
155+ } => {
171156 new_edits.push(make_entry(
172157 eid,
173158 RefEdit {
@@ -175,19 +160,13 @@ mod ext { · 1 unmodified line
175160 previous: previous.clone(),
176161 new: new.clone(),
177162 mode: *mode,
163+ force_create_reflog: *force_create_reflog,
178164 },
179165 name: referent,
180166 deref: true,
181167 },
182168 ));
183− *mode = match *mode {
184− UpdateMode::RefLogOnly { create_unconditionally } => {
185− UpdateMode::RefLogOnly { create_unconditionally }
186− }
187− UpdateMode::RefAndRefLog { create_unconditionally } => {
188− UpdateMode::RefLogOnly { create_unconditionally }
189− }
190− }
169+ *mode = RefLogMode::RefLogOnly;
191170 }
192171 };
193172 edit.deref = false;
git-ref/tests/file/transaction.rs+10−11
@@ -14,7 +14,7 @@ mod prepare_and_commit { · 13 unmodified lines
1414 use git_lock::acquire::Fail;
1515 use git_ref::{
1616 mutable::Target,
17− transaction::{Change, RefEdit, UpdateMode},
17+ transaction::{Change, RefEdit, RefLogMode},
1818 };
1919 use std::{convert::TryInto, path::Path};
2020
@@ -47,9 +47,8 @@ mod prepare_and_commit { · 26 unmodified lines
4747 let t = store.transaction(
4848 Some(RefEdit {
4949 change: Change::Update {
50− mode: UpdateMode::RefAndRefLog {
51− create_unconditionally: false,
52− },
50+ mode: RefLogMode::RefAndRefLog,
51+ force_create_reflog: false,
5352 new: Target::Symbolic(referent.try_into()?),
5453 previous: None, // TODO: check failure if it doesn't exist
5554 },
@@ -94,7 +93,7 @@ mod prepare_and_commit { · 38 unmodified lines
9493 use git_ref::{
9594 file::WriteReflog,
9695 mutable::Target,
97− transaction::{Change, DeleteMode, RefEdit},
96+ transaction::{Change, RefEdit, RefLogMode},
9897 };
9998 use std::convert::TryInto;
10099
@@ -106,7 +105,7 @@ mod prepare_and_commit { · 5 unmodified lines
106105 Some(RefEdit {
107106 change: Change::Delete {
108107 previous: None,
109− mode: DeleteMode::RefAndRefLog,
108+ mode: RefLogMode::RefAndRefLog,
110109 },
111110 name: "DOES_NOT_EXIST".try_into().unwrap(),
112111 deref: false,
@@ -126,7 +125,7 @@ mod prepare_and_commit { · 13 unmodified lines
126125 Some(RefEdit {
127126 change: Change::Delete {
128127 previous: Some(Target::Peeled(ObjectId::null_sha1())),
129− mode: DeleteMode::RefAndRefLog,
128+ mode: RefLogMode::RefAndRefLog,
130129 },
131130 name: "DOES_NOT_EXIST".try_into().unwrap(),
132131 deref: false,
@@ -155,7 +154,7 @@ mod prepare_and_commit { · 22 unmodified lines
155154 Some(RefEdit {
156155 change: Change::Delete {
157156 previous: Some(Target::Peeled(ObjectId::null_sha1())),
158− mode: DeleteMode::RefAndRefLog,
157+ mode: RefLogMode::RefAndRefLog,
159158 },
160159 name: head.name().into(),
161160 deref: false,
@@ -169,7 +168,7 @@ mod prepare_and_commit { · 7 unmodified lines
169168 vec![RefEdit {
170169 change: Change::Delete {
171170 previous: Some(Target::Symbolic("refs/heads/main".try_into()?)),
172− mode: DeleteMode::RefAndRefLog,
171+ mode: RefLogMode::RefAndRefLog,
173172 },
174173 name: head.name().into(),
175174 deref: false
@@ -196,7 +195,7 @@ mod prepare_and_commit { · 20 unmodified lines
196195 Some(RefEdit {
197196 change: Change::Delete {
198197 previous: Some(Target::Symbolic("refs/heads/main".try_into()?)),
199− mode: DeleteMode::RefLogOnly,
198+ mode: RefLogMode::RefLogOnly,
200199 },
201200 name: head.name().into(),
202201 deref: false,
@@ -230,7 +229,7 @@ mod prepare_and_commit { · 27 unmodified lines
230229 Some(RefEdit {
231230 change: Change::Delete {
232231 previous: Some(Target::Symbolic("refs/heads/main".try_into().unwrap())),
233− mode: DeleteMode::RefLogOnly,
232+ mode: RefLogMode::RefLogOnly,
234233 },
235234 name: head.name().into(),
236235 deref: true,
git-ref/tests/refs.rs+21−26
@@ -3,14 +3,14 @@ type Result<T = ()> = std::result::Result<T, Box<dyn std::error::Error>>; · 2 unmodified lines
33 mod file;
44 mod transaction {
55 mod refedit_ext {
6− use git_ref::transaction::{Change, DeleteMode, RefEdit, RefEditsExt};
6+ use git_ref::transaction::{Change, RefEdit, RefEditsExt, RefLogMode};
77 use std::convert::TryInto;
88
99 fn named_edit(name: &str) -> RefEdit {
1010 RefEdit {
1111 change: Change::Delete {
1212 previous: None,
13− mode: DeleteMode::RefAndRefLog,
13+ mode: RefLogMode::RefAndRefLog,
1414 },
1515 name: name.try_into().expect("valid name"),
1616 deref: false,
@@ -43,7 +43,7 @@ mod transaction { · 26 unmodified lines
4343 use git_hash::ObjectId;
4444 use git_ref::{
4545 mutable::Target,
46− transaction::{Change, DeleteMode, RefEdit, RefEditsExt, UpdateMode},
46+ transaction::{Change, RefEdit, RefEditsExt, RefLogMode},
4747 FullName, PartialName, RefStore,
4848 };
4949 use git_testtools::hex_to_id;
@@ -99,7 +99,7 @@ mod transaction { · 49 unmodified lines
9999 RefEdit {
100100 change: Change::Delete {
101101 previous: None,
102− mode: DeleteMode::RefAndRefLog,
102+ mode: RefLogMode::RefAndRefLog,
103103 },
104104 name: "SYMBOLIC_PROBABLY_BUT_DEREF_IS_FALSE_SO_IGNORED".try_into()?,
105105 deref: false,
@@ -107,7 +107,7 @@ mod transaction { · 1 unmodified line
107107 RefEdit {
108108 change: Change::Delete {
109109 previous: None,
110− mode: DeleteMode::RefAndRefLog,
110+ mode: RefLogMode::RefAndRefLog,
111111 },
112112 name: "refs/heads/anything-but-not-symbolic".try_into()?,
113113 deref: true,
@@ -115,7 +115,7 @@ mod transaction { · 1 unmodified line
115115 RefEdit {
116116 change: Change::Delete {
117117 previous: None,
118− mode: DeleteMode::RefAndRefLog,
118+ mode: RefLogMode::RefAndRefLog,
119119 },
120120 name: "refs/heads/does-not-exist-and-deref-is-ignored".try_into()?,
121121 deref: true,
@@ -167,7 +167,7 @@ mod transaction { · 45 unmodified lines
167167 RefEdit {
168168 change: Change::Delete {
169169 previous: None,
170− mode: DeleteMode::RefAndRefLog,
170+ mode: RefLogMode::RefAndRefLog,
171171 },
172172 name: "refs/heads/delete-symbolic-1".try_into().unwrap(),
173173 deref: true,
@@ -175,9 +175,8 @@ mod transaction { · 1 unmodified line
175175 RefEdit {
176176 change: Change::Update {
177177 previous: None,
178− mode: UpdateMode::RefAndRefLog {
179− create_unconditionally: true,
180− },
178+ mode: RefLogMode::RefAndRefLog,
179+ force_create_reflog: true,
181180 new: Target::Peeled(ObjectId::null_sha1()),
182181 },
183182 name: "refs/heads/update-symbolic-1".try_into().unwrap(),
@@ -226,7 +225,7 @@ mod transaction { · 42 unmodified lines
226225 RefEdit {
227226 change: Change::Delete {
228227 previous: None,
229− mode: DeleteMode::RefAndRefLog,
228+ mode: RefLogMode::RefAndRefLog,
230229 },
231230 name: "refs/heads/delete-symbolic-1".try_into().unwrap(),
232231 deref: true,
@@ -234,9 +233,8 @@ mod transaction { · 1 unmodified line
234233 RefEdit {
235234 change: Change::Update {
236235 previous: None,
237− mode: UpdateMode::RefAndRefLog {
238− create_unconditionally: true,
239− },
236+ mode: RefLogMode::RefAndRefLog,
237+ force_create_reflog: true,
240238 new: Target::Peeled(ObjectId::null_sha1()),
241239 },
242240 name: "refs/heads/update-symbolic-1".try_into().unwrap(),
@@ -264,7 +262,7 @@ mod transaction { · 21 unmodified lines
264262 RefEdit {
265263 change: Change::Delete {
266264 previous: None,
267− mode: DeleteMode::RefLogOnly,
265+ mode: RefLogMode::RefLogOnly,
268266 },
269267 name: "refs/heads/delete-symbolic-1".try_into().unwrap(),
270268 deref: false,
@@ -272,9 +270,8 @@ mod transaction { · 1 unmodified line
272270 RefEdit {
273271 change: Change::Update {
274272 previous: None,
275− mode: UpdateMode::RefLogOnly {
276− create_unconditionally: true,
277− },
273+ mode: RefLogMode::RefLogOnly,
274+ force_create_reflog: true,
278275 new: Target::Peeled(ObjectId::null_sha1()),
279276 },
280277 name: "refs/heads/update-symbolic-1".try_into().unwrap(),
@@ -283,7 +280,7 @@ mod transaction { · 2 unmodified lines
283280 RefEdit {
284281 change: Change::Delete {
285282 previous: None,
286− mode: DeleteMode::RefLogOnly,
283+ mode: RefLogMode::RefLogOnly,
287284 },
288285 name: "refs/heads/delete-symbolic-2".try_into().unwrap(),
289286 deref: false,
@@ -291,9 +288,8 @@ mod transaction { · 1 unmodified line
291288 RefEdit {
292289 change: Change::Update {
293290 previous: None,
294− mode: UpdateMode::RefLogOnly {
295− create_unconditionally: true,
296− },
291+ mode: RefLogMode::RefLogOnly,
292+ force_create_reflog: true,
297293 new: Target::Peeled(ObjectId::null_sha1()),
298294 },
299295 name: "refs/heads/update-symbolic-2".try_into().unwrap(),
@@ -302,7 +298,7 @@ mod transaction { · 2 unmodified lines
302298 RefEdit {
303299 change: Change::Delete {
304300 previous: None,
305− mode: DeleteMode::RefAndRefLog,
301+ mode: RefLogMode::RefAndRefLog,
306302 },
307303 name: "refs/heads/delete-symbolic-3".try_into().unwrap(),
308304 deref: false,
@@ -310,9 +306,8 @@ mod transaction { · 1 unmodified line
310306 RefEdit {
311307 change: Change::Update {
312308 previous: None,
313− mode: UpdateMode::RefAndRefLog {
314− create_unconditionally: true,
315− },
309+ mode: RefLogMode::RefAndRefLog,
310+ force_create_reflog: true,
316311 new: Target::Peeled(ObjectId::null_sha1()),
317312 },
318313 name: "refs/heads/update-symbolic-3".try_into().unwrap(),