mercurial/pure/parsers.py
changeset 48398 111098af6356
parent 48392 434de12918fd
child 48399 af303ae33cd7
equal deleted inserted replaced
48397:8d585aa9becf 48398:111098af6356
   102     _size = attr.ib()
   102     _size = attr.ib()
   103     _mtime_s = attr.ib()
   103     _mtime_s = attr.ib()
   104     _mtime_ns = attr.ib()
   104     _mtime_ns = attr.ib()
   105     _fallback_exec = attr.ib()
   105     _fallback_exec = attr.ib()
   106     _fallback_symlink = attr.ib()
   106     _fallback_symlink = attr.ib()
       
   107     _mtime_second_ambiguous = attr.ib()
   107 
   108 
   108     def __init__(
   109     def __init__(
   109         self,
   110         self,
   110         wc_tracked=False,
   111         wc_tracked=False,
   111         p1_tracked=False,
   112         p1_tracked=False,
   125 
   126 
   126         self._mode = None
   127         self._mode = None
   127         self._size = None
   128         self._size = None
   128         self._mtime_s = None
   129         self._mtime_s = None
   129         self._mtime_ns = None
   130         self._mtime_ns = None
       
   131         self._mtime_second_ambiguous = False
   130         if parentfiledata is None:
   132         if parentfiledata is None:
   131             has_meaningful_mtime = False
   133             has_meaningful_mtime = False
   132             has_meaningful_data = False
   134             has_meaningful_data = False
   133         elif parentfiledata[2] is None:
   135         elif parentfiledata[2] is None:
   134             has_meaningful_mtime = False
   136             has_meaningful_mtime = False
   135         if has_meaningful_data:
   137         if has_meaningful_data:
   136             self._mode = parentfiledata[0]
   138             self._mode = parentfiledata[0]
   137             self._size = parentfiledata[1]
   139             self._size = parentfiledata[1]
   138         if has_meaningful_mtime:
   140         if has_meaningful_mtime:
   139             self._mtime_s, self._mtime_ns = parentfiledata[2]
   141             (
       
   142                 self._mtime_s,
       
   143                 self._mtime_ns,
       
   144                 self._mtime_second_ambiguous,
       
   145             ) = parentfiledata[2]
   140 
   146 
   141     @classmethod
   147     @classmethod
   142     def from_v2_data(cls, flags, size, mtime_s, mtime_ns):
   148     def from_v2_data(cls, flags, size, mtime_s, mtime_ns):
   143         """Build a new DirstateItem object from V2 data"""
   149         """Build a new DirstateItem object from V2 data"""
   144         has_mode_size = bool(flags & DIRSTATE_V2_HAS_MODE_AND_SIZE)
   150         has_mode_size = bool(flags & DIRSTATE_V2_HAS_MODE_AND_SIZE)
   177             wc_tracked=bool(flags & DIRSTATE_V2_WDIR_TRACKED),
   183             wc_tracked=bool(flags & DIRSTATE_V2_WDIR_TRACKED),
   178             p1_tracked=bool(flags & DIRSTATE_V2_P1_TRACKED),
   184             p1_tracked=bool(flags & DIRSTATE_V2_P1_TRACKED),
   179             p2_info=bool(flags & DIRSTATE_V2_P2_INFO),
   185             p2_info=bool(flags & DIRSTATE_V2_P2_INFO),
   180             has_meaningful_data=has_mode_size,
   186             has_meaningful_data=has_mode_size,
   181             has_meaningful_mtime=has_meaningful_mtime,
   187             has_meaningful_mtime=has_meaningful_mtime,
   182             parentfiledata=(mode, size, (mtime_s, mtime_ns)),
   188             parentfiledata=(mode, size, (mtime_s, mtime_ns, False)),
   183             fallback_exec=fallback_exec,
   189             fallback_exec=fallback_exec,
   184             fallback_symlink=fallback_symlink,
   190             fallback_symlink=fallback_symlink,
   185         )
   191         )
   186 
   192 
   187     @classmethod
   193     @classmethod
   214             elif mtime == AMBIGUOUS_TIME:
   220             elif mtime == AMBIGUOUS_TIME:
   215                 return cls(
   221                 return cls(
   216                     wc_tracked=True,
   222                     wc_tracked=True,
   217                     p1_tracked=True,
   223                     p1_tracked=True,
   218                     has_meaningful_mtime=False,
   224                     has_meaningful_mtime=False,
   219                     parentfiledata=(mode, size, (42, 0)),
   225                     parentfiledata=(mode, size, (42, 0, False)),
   220                 )
   226                 )
   221             else:
   227             else:
   222                 return cls(
   228                 return cls(
   223                     wc_tracked=True,
   229                     wc_tracked=True,
   224                     p1_tracked=True,
   230                     p1_tracked=True,
   225                     parentfiledata=(mode, size, (mtime, 0)),
   231                     parentfiledata=(mode, size, (mtime, 0, False)),
   226                 )
   232                 )
   227         else:
   233         else:
   228             raise RuntimeError(b'unknown state: %s' % state)
   234             raise RuntimeError(b'unknown state: %s' % state)
   229 
   235 
   230     def set_possibly_dirty(self):
   236     def set_possibly_dirty(self):
   246         """
   252         """
   247         self._wc_tracked = True
   253         self._wc_tracked = True
   248         self._p1_tracked = True
   254         self._p1_tracked = True
   249         self._mode = mode
   255         self._mode = mode
   250         self._size = size
   256         self._size = size
   251         self._mtime_s, self._mtime_ns = mtime
   257         self._mtime_s, self._mtime_ns, self._mtime_second_ambiguous = mtime
   252 
   258 
   253     def set_tracked(self):
   259     def set_tracked(self):
   254         """mark a file as tracked in the working copy
   260         """mark a file as tracked in the working copy
   255 
   261 
   256         This will ultimately be called by command like `hg add`.
   262         This will ultimately be called by command like `hg add`.
   301     def mtime_likely_equal_to(self, other_mtime):
   307     def mtime_likely_equal_to(self, other_mtime):
   302         self_sec = self._mtime_s
   308         self_sec = self._mtime_s
   303         if self_sec is None:
   309         if self_sec is None:
   304             return False
   310             return False
   305         self_ns = self._mtime_ns
   311         self_ns = self._mtime_ns
   306         other_sec, other_ns = other_mtime
   312         other_sec, other_ns, second_ambiguous = other_mtime
   307         return self_sec == other_sec and (
   313         return self_sec == other_sec and (
   308             self_ns == other_ns or self_ns == 0 or other_ns == 0
   314             self_ns == other_ns or self_ns == 0 or other_ns == 0
   309         )
   315         )
   310 
   316 
   311     @property
   317     @property