mercurial/dirstate.py
changeset 47280 1766130fe9ba
parent 47277 ed0d54b20c5b
child 47320 a43d256c041a
equal deleted inserted replaced
47279:40b51c28b242 47280:1766130fe9ba
    73 
    73 
    74 
    74 
    75 @interfaceutil.implementer(intdirstate.idirstate)
    75 @interfaceutil.implementer(intdirstate.idirstate)
    76 class dirstate(object):
    76 class dirstate(object):
    77     def __init__(
    77     def __init__(
    78         self, opener, ui, root, validate, sparsematchfn, nodeconstants
    78         self,
       
    79         opener,
       
    80         ui,
       
    81         root,
       
    82         validate,
       
    83         sparsematchfn,
       
    84         nodeconstants,
       
    85         use_dirstate_v2,
    79     ):
    86     ):
    80         """Create a new dirstate object.
    87         """Create a new dirstate object.
    81 
    88 
    82         opener is an open()-like callable that can be used to open the
    89         opener is an open()-like callable that can be used to open the
    83         dirstate file; root is the root of the directory tracked by
    90         dirstate file; root is the root of the directory tracked by
    84         the dirstate.
    91         the dirstate.
    85         """
    92         """
       
    93         self._use_dirstate_v2 = use_dirstate_v2
    86         self._nodeconstants = nodeconstants
    94         self._nodeconstants = nodeconstants
    87         self._opener = opener
    95         self._opener = opener
    88         self._validate = validate
    96         self._validate = validate
    89         self._root = root
    97         self._root = root
    90         self._sparsematchfn = sparsematchfn
    98         self._sparsematchfn = sparsematchfn
   139 
   147 
   140     @propertycache
   148     @propertycache
   141     def _map(self):
   149     def _map(self):
   142         """Return the dirstate contents (see documentation for dirstatemap)."""
   150         """Return the dirstate contents (see documentation for dirstatemap)."""
   143         self._map = self._mapcls(
   151         self._map = self._mapcls(
   144             self._ui, self._opener, self._root, self._nodeconstants
   152             self._ui,
       
   153             self._opener,
       
   154             self._root,
       
   155             self._nodeconstants,
       
   156             self._use_dirstate_v2,
   145         )
   157         )
   146         return self._map
   158         return self._map
   147 
   159 
   148     @property
   160     @property
   149     def _sparsematcher(self):
   161     def _sparsematcher(self):
  1433 
  1445 
  1434     - `dirfoldmap` is a dict mapping normalized directory names to the
  1446     - `dirfoldmap` is a dict mapping normalized directory names to the
  1435       denormalized form that they appear as in the dirstate.
  1447       denormalized form that they appear as in the dirstate.
  1436     """
  1448     """
  1437 
  1449 
  1438     def __init__(self, ui, opener, root, nodeconstants):
  1450     def __init__(self, ui, opener, root, nodeconstants, use_dirstate_v2):
  1439         self._ui = ui
  1451         self._ui = ui
  1440         self._opener = opener
  1452         self._opener = opener
  1441         self._root = root
  1453         self._root = root
  1442         self._filename = b'dirstate'
  1454         self._filename = b'dirstate'
  1443         self._nodelen = 20
  1455         self._nodelen = 20
  1444         self._nodeconstants = nodeconstants
  1456         self._nodeconstants = nodeconstants
       
  1457         assert (
       
  1458             not use_dirstate_v2
       
  1459         ), "should have detected unsupported requirement"
  1445 
  1460 
  1446         self._parents = None
  1461         self._parents = None
  1447         self._dirtyparents = False
  1462         self._dirtyparents = False
  1448 
  1463 
  1449         # for consistent view between _pl() and _read() invocations
  1464         # for consistent view between _pl() and _read() invocations
  1744 
  1759 
  1745 
  1760 
  1746 if rustmod is not None:
  1761 if rustmod is not None:
  1747 
  1762 
  1748     class dirstatemap(object):
  1763     class dirstatemap(object):
  1749         def __init__(self, ui, opener, root, nodeconstants):
  1764         def __init__(self, ui, opener, root, nodeconstants, use_dirstate_v2):
       
  1765             self._use_dirstate_v2 = use_dirstate_v2
  1750             self._nodeconstants = nodeconstants
  1766             self._nodeconstants = nodeconstants
  1751             self._ui = ui
  1767             self._ui = ui
  1752             self._opener = opener
  1768             self._opener = opener
  1753             self._root = root
  1769             self._root = root
  1754             self._filename = b'dirstate'
  1770             self._filename = b'dirstate'
  1755             self._nodelen = 20
  1771             self._nodelen = 20  # Also update Rust code when changing this!
  1756             self._parents = None
  1772             self._parents = None
  1757             self._dirtyparents = False
  1773             self._dirtyparents = False
  1758 
  1774 
  1759             # for consistent view between _pl() and _read() invocations
  1775             # for consistent view between _pl() and _read() invocations
  1760             self._pendingmode = None
  1776             self._pendingmode = None
  1830             self._parents = (p1, p2)
  1846             self._parents = (p1, p2)
  1831             self._dirtyparents = True
  1847             self._dirtyparents = True
  1832 
  1848 
  1833         def parents(self):
  1849         def parents(self):
  1834             if not self._parents:
  1850             if not self._parents:
       
  1851                 if self._use_dirstate_v2:
       
  1852                     offset = len(rustmod.V2_FORMAT_MARKER)
       
  1853                 else:
       
  1854                     offset = 0
       
  1855                 read_len = offset + self._nodelen * 2
  1835                 try:
  1856                 try:
  1836                     fp = self._opendirstatefile()
  1857                     fp = self._opendirstatefile()
  1837                     st = fp.read(40)
  1858                     st = fp.read(read_len)
  1838                     fp.close()
  1859                     fp.close()
  1839                 except IOError as err:
  1860                 except IOError as err:
  1840                     if err.errno != errno.ENOENT:
  1861                     if err.errno != errno.ENOENT:
  1841                         raise
  1862                         raise
  1842                     # File doesn't exist, so the current state is empty
  1863                     # File doesn't exist, so the current state is empty
  1843                     st = b''
  1864                     st = b''
  1844 
  1865 
  1845                 l = len(st)
  1866                 l = len(st)
  1846                 if l == self._nodelen * 2:
  1867                 if l == read_len:
       
  1868                     st = st[offset:]
  1847                     self._parents = (
  1869                     self._parents = (
  1848                         st[: self._nodelen],
  1870                         st[: self._nodelen],
  1849                         st[self._nodelen : 2 * self._nodelen],
  1871                         st[self._nodelen : 2 * self._nodelen],
  1850                     )
  1872                     )
  1851                 elif l == 0:
  1873                 elif l == 0:
  1885                 b"experimental",
  1907                 b"experimental",
  1886                 b"dirstate-tree.in-memory",
  1908                 b"dirstate-tree.in-memory",
  1887                 False,
  1909                 False,
  1888             )
  1910             )
  1889             self._rustmap, parents = rustmod.DirstateMap.new(
  1911             self._rustmap, parents = rustmod.DirstateMap.new(
  1890                 use_dirstate_tree, st
  1912                 use_dirstate_tree, self._use_dirstate_v2, st
  1891             )
  1913             )
  1892 
  1914 
  1893             if parents and not self._dirtyparents:
  1915             if parents and not self._dirtyparents:
  1894                 self.setparents(*parents)
  1916                 self.setparents(*parents)
  1895 
  1917 
  1898             self.get = self._rustmap.get
  1920             self.get = self._rustmap.get
  1899             return self._rustmap
  1921             return self._rustmap
  1900 
  1922 
  1901         def write(self, st, now):
  1923         def write(self, st, now):
  1902             parents = self.parents()
  1924             parents = self.parents()
  1903             st.write(self._rustmap.write(parents[0], parents[1], now))
  1925             packed = self._rustmap.write(
       
  1926                 self._use_dirstate_v2, parents[0], parents[1], now
       
  1927             )
       
  1928             st.write(packed)
  1904             st.close()
  1929             st.close()
  1905             self._dirtyparents = False
  1930             self._dirtyparents = False
  1906 
  1931 
  1907         @propertycache
  1932         @propertycache
  1908         def filefoldmap(self):
  1933         def filefoldmap(self):