equal
deleted
inserted
replaced
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): |