6 use cpython::PyObject; |
6 use cpython::PyObject; |
7 use cpython::PyResult; |
7 use cpython::PyResult; |
8 use cpython::Python; |
8 use cpython::Python; |
9 use cpython::PythonObject; |
9 use cpython::PythonObject; |
10 use hg::dirstate::DirstateEntry; |
10 use hg::dirstate::DirstateEntry; |
11 use hg::dirstate::EntryState; |
|
12 use hg::dirstate::TruncatedTimestamp; |
11 use hg::dirstate::TruncatedTimestamp; |
13 use std::cell::Cell; |
12 use std::cell::Cell; |
14 use std::convert::TryFrom; |
|
15 |
13 |
16 py_class!(pub class DirstateItem |py| { |
14 py_class!(pub class DirstateItem |py| { |
17 data entry: Cell<DirstateEntry>; |
15 data entry: Cell<DirstateEntry>; |
18 |
16 |
19 def __new__( |
17 def __new__( |
171 @property |
169 @property |
172 def any_tracked(&self) -> PyResult<bool> { |
170 def any_tracked(&self) -> PyResult<bool> { |
173 Ok(self.entry(py).get().any_tracked()) |
171 Ok(self.entry(py).get().any_tracked()) |
174 } |
172 } |
175 |
173 |
176 def v1_state(&self) -> PyResult<PyBytes> { |
|
177 let (state, _mode, _size, _mtime) = self.entry(py).get().v1_data(); |
|
178 let state_byte: u8 = state.into(); |
|
179 Ok(PyBytes::new(py, &[state_byte])) |
|
180 } |
|
181 |
|
182 def v1_mode(&self) -> PyResult<i32> { |
|
183 let (_state, mode, _size, _mtime) = self.entry(py).get().v1_data(); |
|
184 Ok(mode) |
|
185 } |
|
186 |
|
187 def v1_size(&self) -> PyResult<i32> { |
|
188 let (_state, _mode, size, _mtime) = self.entry(py).get().v1_data(); |
|
189 Ok(size) |
|
190 } |
|
191 |
|
192 def v1_mtime(&self) -> PyResult<i32> { |
|
193 let (_state, _mode, _size, mtime) = self.entry(py).get().v1_data(); |
|
194 Ok(mtime) |
|
195 } |
|
196 |
|
197 def mtime_likely_equal_to(&self, other: (u32, u32, bool)) |
174 def mtime_likely_equal_to(&self, other: (u32, u32, bool)) |
198 -> PyResult<bool> { |
175 -> PyResult<bool> { |
199 if let Some(mtime) = self.entry(py).get().truncated_mtime() { |
176 if let Some(mtime) = self.entry(py).get().truncated_mtime() { |
200 Ok(mtime.likely_equal(timestamp(py, other)?)) |
177 Ok(mtime.likely_equal(timestamp(py, other)?)) |
201 } else { |
178 } else { |
202 Ok(false) |
179 Ok(false) |
203 } |
180 } |
204 } |
|
205 |
|
206 @classmethod |
|
207 def from_v1_data( |
|
208 _cls, |
|
209 state: PyBytes, |
|
210 mode: i32, |
|
211 size: i32, |
|
212 mtime: i32, |
|
213 ) -> PyResult<Self> { |
|
214 let state = <[u8; 1]>::try_from(state.data(py)) |
|
215 .ok() |
|
216 .and_then(|state| EntryState::try_from(state[0]).ok()) |
|
217 .ok_or_else(|| PyErr::new::<exc::ValueError, _>(py, "invalid state"))?; |
|
218 let entry = DirstateEntry::from_v1_data(state, mode, size, mtime); |
|
219 DirstateItem::create_instance(py, Cell::new(entry)) |
|
220 } |
181 } |
221 |
182 |
222 def drop_merge_data(&self) -> PyResult<PyNone> { |
183 def drop_merge_data(&self) -> PyResult<PyNone> { |
223 self.update(py, |entry| entry.drop_merge_data()); |
184 self.update(py, |entry| entry.drop_merge_data()); |
224 Ok(PyNone) |
185 Ok(PyNone) |