Show More
@@ -79,6 +79,10 b' impl IndexHeader {' | |||||
79 | struct IndexData { |
|
79 | struct IndexData { | |
80 | /// Immutable bytes, most likely taken from disk |
|
80 | /// Immutable bytes, most likely taken from disk | |
81 | bytes: Box<dyn Deref<Target = [u8]> + Send>, |
|
81 | bytes: Box<dyn Deref<Target = [u8]> + Send>, | |
|
82 | /// Used when stripping index contents, keeps track of the start of the | |||
|
83 | /// first stripped revision, which is used to give a slice of the | |||
|
84 | /// `bytes` field. | |||
|
85 | truncation: Option<usize>, | |||
82 | /// Bytes that were added after reading the index |
|
86 | /// Bytes that were added after reading the index | |
83 | added: Vec<u8>, |
|
87 | added: Vec<u8>, | |
84 | } |
|
88 | } | |
@@ -87,12 +91,36 b' impl IndexData {' | |||||
87 | pub fn new(bytes: Box<dyn Deref<Target = [u8]> + Send>) -> Self { |
|
91 | pub fn new(bytes: Box<dyn Deref<Target = [u8]> + Send>) -> Self { | |
88 | Self { |
|
92 | Self { | |
89 | bytes, |
|
93 | bytes, | |
|
94 | truncation: None, | |||
90 | added: vec![], |
|
95 | added: vec![], | |
91 | } |
|
96 | } | |
92 | } |
|
97 | } | |
93 |
|
98 | |||
94 | pub fn len(&self) -> usize { |
|
99 | pub fn len(&self) -> usize { | |
95 | self.bytes.len() + self.added.len() |
|
100 | match self.truncation { | |
|
101 | Some(truncation) => truncation + self.added.len(), | |||
|
102 | None => self.bytes.len() + self.added.len(), | |||
|
103 | } | |||
|
104 | } | |||
|
105 | ||||
|
106 | fn remove( | |||
|
107 | &mut self, | |||
|
108 | rev: Revision, | |||
|
109 | offsets: Option<&[usize]>, | |||
|
110 | ) -> Result<(), RevlogError> { | |||
|
111 | let rev = rev.0 as usize; | |||
|
112 | let truncation = if let Some(offsets) = offsets { | |||
|
113 | offsets[rev] | |||
|
114 | } else { | |||
|
115 | rev * INDEX_ENTRY_SIZE | |||
|
116 | }; | |||
|
117 | if truncation < self.bytes.len() { | |||
|
118 | self.truncation = Some(truncation); | |||
|
119 | self.added.clear(); | |||
|
120 | } else { | |||
|
121 | self.added.truncate(truncation - self.bytes.len()); | |||
|
122 | } | |||
|
123 | Ok(()) | |||
96 | } |
|
124 | } | |
97 | } |
|
125 | } | |
98 |
|
126 | |||
@@ -102,7 +130,10 b' impl std::ops::Index<std::ops::Range<usi' | |||||
102 | fn index(&self, index: std::ops::Range<usize>) -> &Self::Output { |
|
130 | fn index(&self, index: std::ops::Range<usize>) -> &Self::Output { | |
103 | let start = index.start; |
|
131 | let start = index.start; | |
104 | let end = index.end; |
|
132 | let end = index.end; | |
105 |
let immutable_len = self. |
|
133 | let immutable_len = match self.truncation { | |
|
134 | Some(truncation) => truncation, | |||
|
135 | None => self.bytes.len(), | |||
|
136 | }; | |||
106 | if start < immutable_len { |
|
137 | if start < immutable_len { | |
107 | if end > immutable_len { |
|
138 | if end > immutable_len { | |
108 | panic!("index data cannot span existing and added ranges"); |
|
139 | panic!("index data cannot span existing and added ranges"); | |
@@ -368,6 +399,14 b' impl Index {' | |||||
368 | self.bytes.added.extend(revision_data.into_v1().as_bytes()); |
|
399 | self.bytes.added.extend(revision_data.into_v1().as_bytes()); | |
369 | Ok(()) |
|
400 | Ok(()) | |
370 | } |
|
401 | } | |
|
402 | ||||
|
403 | pub fn remove(&mut self, rev: Revision) -> Result<(), RevlogError> { | |||
|
404 | self.bytes.remove(rev, self.offsets.as_deref())?; | |||
|
405 | if let Some(offsets) = self.offsets.as_mut() { | |||
|
406 | offsets.truncate(rev.0 as usize) | |||
|
407 | } | |||
|
408 | Ok(()) | |||
|
409 | } | |||
371 | } |
|
410 | } | |
372 |
|
411 | |||
373 | impl super::RevlogIndex for Index { |
|
412 | impl super::RevlogIndex for Index { |
@@ -160,7 +160,16 b' py_class!(pub class MixedIndex |py| {' | |||||
160 |
|
160 | |||
161 | def __delitem__(&self, key: PyObject) -> PyResult<()> { |
|
161 | def __delitem__(&self, key: PyObject) -> PyResult<()> { | |
162 | // __delitem__ is both for `del idx[r]` and `del idx[r1:r2]` |
|
162 | // __delitem__ is both for `del idx[r]` and `del idx[r1:r2]` | |
163 | self.cindex(py).borrow().inner().del_item(py, key)?; |
|
163 | self.cindex(py).borrow().inner().del_item(py, &key)?; | |
|
164 | let start = key.getattr(py, "start")?; | |||
|
165 | let start = UncheckedRevision(start.extract(py)?); | |||
|
166 | let start = self.index(py) | |||
|
167 | .borrow() | |||
|
168 | .check_revision(start) | |||
|
169 | .ok_or_else(|| { | |||
|
170 | nodemap_error(py, NodeMapError::RevisionNotInIndex(start)) | |||
|
171 | })?; | |||
|
172 | self.index(py).borrow_mut().remove(start).unwrap(); | |||
164 | let mut opt = self.get_nodetree(py)?.borrow_mut(); |
|
173 | let mut opt = self.get_nodetree(py)?.borrow_mut(); | |
165 | let nt = opt.as_mut().unwrap(); |
|
174 | let nt = opt.as_mut().unwrap(); | |
166 | nt.invalidate_all(); |
|
175 | nt.invalidate_all(); |
General Comments 0
You need to be logged in to leave comments.
Login now