rust/hg-cpython/src/dirstate/item.rs
changeset 49044 be9bf75a837c
parent 48398 111098af6356
child 49100 38e5bb1425dd
equal deleted inserted replaced
49043:362312d61020 49044:be9bf75a837c
     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)