##// END OF EJS Templates
rust-index: synchronize remove to Rust index...
Raphaël Gomès -
r52088:f6403bcd default
parent child Browse files
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.bytes.len();
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