1852 |
1852 |
1853 return modified, deleted, clean, fixup |
1853 return modified, deleted, clean, fixup |
1854 |
1854 |
1855 def _poststatusfixup(self, status, fixup): |
1855 def _poststatusfixup(self, status, fixup): |
1856 """update dirstate for files that are actually clean""" |
1856 """update dirstate for files that are actually clean""" |
|
1857 dirstate = self._repo.dirstate |
1857 poststatus = self._repo.postdsstatus() |
1858 poststatus = self._repo.postdsstatus() |
1858 if fixup or poststatus or self._repo.dirstate._dirty: |
1859 if fixup: |
|
1860 if dirstate.is_changing_parents: |
|
1861 normal = lambda f, pfd: dirstate.update_file( |
|
1862 f, |
|
1863 p1_tracked=True, |
|
1864 wc_tracked=True, |
|
1865 ) |
|
1866 else: |
|
1867 normal = dirstate.set_clean |
|
1868 for f, pdf in fixup: |
|
1869 normal(f, pdf) |
|
1870 if poststatus or self._repo.dirstate._dirty: |
1859 try: |
1871 try: |
1860 oldid = self._repo.dirstate.identity() |
|
1861 |
|
1862 # updating the dirstate is optional |
1872 # updating the dirstate is optional |
1863 # so we don't wait on the lock |
1873 # so we don't wait on the lock |
1864 # wlock can invalidate the dirstate, so cache normal _after_ |
1874 # wlock can invalidate the dirstate, so cache normal _after_ |
1865 # taking the lock |
1875 # taking the lock |
|
1876 pre_dirty = dirstate._dirty |
1866 with self._repo.wlock(False): |
1877 with self._repo.wlock(False): |
1867 dirstate = self._repo.dirstate |
1878 assert self._repo.dirstate is dirstate |
1868 if dirstate.identity() == oldid: |
1879 post_dirty = dirstate._dirty |
1869 if fixup: |
1880 if post_dirty: |
1870 if dirstate.is_changing_parents: |
|
1871 normal = lambda f, pfd: dirstate.update_file( |
|
1872 f, p1_tracked=True, wc_tracked=True |
|
1873 ) |
|
1874 else: |
|
1875 normal = dirstate.set_clean |
|
1876 for f, pdf in fixup: |
|
1877 normal(f, pdf) |
|
1878 # write changes out explicitly, because nesting |
|
1879 # wlock at runtime may prevent 'wlock.release()' |
|
1880 # after this block from doing so for subsequent |
|
1881 # changing files |
|
1882 # |
|
1883 # (This is outside of the (if fixup) block because the |
|
1884 # status operation itself might have updated some cache |
|
1885 # information before.) |
|
1886 tr = self._repo.currenttransaction() |
1881 tr = self._repo.currenttransaction() |
1887 self._repo.dirstate.write(tr) |
1882 dirstate.write(tr) |
1888 |
1883 elif pre_dirty: |
1889 if poststatus: |
1884 # the wlock grabbing detected that dirtate changes |
1890 for ps in poststatus: |
1885 # needed to be dropped |
1891 ps(self, status) |
1886 m = b'skip updating dirstate: identity mismatch\n' |
1892 else: |
1887 self._repo.ui.debug(m) |
1893 # in this case, writing changes out breaks |
1888 if poststatus: |
1894 # consistency, because .hg/dirstate was |
1889 for ps in poststatus: |
1895 # already changed simultaneously after last |
1890 ps(self, status) |
1896 # caching (see also issue5584 for detail) |
|
1897 self._repo.ui.debug( |
|
1898 b'skip updating dirstate: identity mismatch\n' |
|
1899 ) |
|
1900 # throw away anything we have. |
|
1901 dirstate.invalidate() |
|
1902 except error.LockError: |
1891 except error.LockError: |
1903 pass |
1892 pass |
1904 finally: |
1893 finally: |
1905 # Even if the wlock couldn't be grabbed, clear out the list. |
1894 # Even if the wlock couldn't be grabbed, clear out the list. |
1906 self._repo.clearpostdsstatus() |
1895 self._repo.clearpostdsstatus() |