##// END OF EJS Templates
dirstate: remove the dedicated backup logic...
marmoute -
r50981:76d44983 default
parent child Browse files
Show More
@@ -327,14 +327,6 b' class gitdirstate:'
327 327 r[path] = s
328 328 return r
329 329
330 def savebackup(self, tr, backupname):
331 # TODO: figure out a strategy for saving index backups.
332 pass
333
334 def restorebackup(self, tr, backupname):
335 # TODO: figure out a strategy for saving index backups.
336 pass
337
338 330 def set_tracked(self, f, reset_copy=False):
339 331 # TODO: support copies and reset_copy=True
340 332 uf = pycompat.fsdecode(f)
@@ -397,10 +389,6 b' class gitdirstate:'
397 389 # TODO: should this be added to the dirstate interface?
398 390 self._plchangecallbacks[category] = callback
399 391
400 def clearbackup(self, tr, backupname):
401 # TODO
402 pass
403
404 392 def setbranch(self, branch):
405 393 raise error.Abort(
406 394 b'git repos do not support branches. try using bookmarks'
@@ -31,7 +31,6 b' from . import ('
31 31 )
32 32
33 33 from .dirstateutils import (
34 docket as docketmod,
35 34 timestamp,
36 35 )
37 36
@@ -1631,123 +1630,6 b' class dirstate:'
1631 1630 else:
1632 1631 return (self._filename,)
1633 1632
1634 def data_backup_filename(self, backupname):
1635 if not self._use_dirstate_v2:
1636 return None
1637 return backupname + b'.v2-data'
1638
1639 def _new_backup_data_filename(self, backupname):
1640 """return a filename to backup a data-file or None"""
1641 if not self._use_dirstate_v2:
1642 return None
1643 if self._map.docket.uuid is None:
1644 # not created yet, nothing to backup
1645 return None
1646 data_filename = self._map.docket.data_filename()
1647 return data_filename, self.data_backup_filename(backupname)
1648
1649 def backup_data_file(self, backupname):
1650 if not self._use_dirstate_v2:
1651 return None
1652 docket = docketmod.DirstateDocket.parse(
1653 self._opener.read(backupname),
1654 self._nodeconstants,
1655 )
1656 return self.data_backup_filename(backupname), docket.data_filename()
1657
1658 def savebackup(self, tr, backupname):
1659 '''Save current dirstate into backup file'''
1660 filename = self._actualfilename(tr)
1661 assert backupname != filename
1662
1663 # use '_writedirstate' instead of 'write' to write changes certainly,
1664 # because the latter omits writing out if transaction is running.
1665 # output file will be used to create backup of dirstate at this point.
1666 if self._dirty:
1667 self._writedirstate(
1668 tr,
1669 self._opener(filename, b"w", atomictemp=True, checkambig=True),
1670 )
1671
1672 if tr:
1673 # ensure that subsequent tr.writepending returns True for
1674 # changes written out above, even if dirstate is never
1675 # changed after this
1676 tr.addfilegenerator(
1677 b'dirstate-1-main',
1678 (self._filename,),
1679 lambda f: self._writedirstate(tr, f),
1680 location=b'plain',
1681 post_finalize=True,
1682 )
1683
1684 self._opener.tryunlink(backupname)
1685 if self._opener.exists(filename):
1686 # hardlink backup is okay because _writedirstate is always called
1687 # with an "atomictemp=True" file.
1688 util.copyfile(
1689 self._opener.join(filename),
1690 self._opener.join(backupname),
1691 hardlink=True,
1692 )
1693 data_pair = self._new_backup_data_filename(backupname)
1694 if data_pair is not None:
1695 data_filename, bck_data_filename = data_pair
1696 util.copyfile(
1697 self._opener.join(data_filename),
1698 self._opener.join(bck_data_filename),
1699 hardlink=True,
1700 )
1701 if tr is not None:
1702 # ensure that pending file written above is unlinked at
1703 # failure, even if tr.writepending isn't invoked until the
1704 # end of this transaction
1705 tr.registertmp(bck_data_filename, location=b'plain')
1706
1707 def restorebackup(self, tr, backupname):
1708 '''Restore dirstate by backup file'''
1709 # this "invalidate()" prevents "wlock.release()" from writing
1710 # changes of dirstate out after restoring from backup file
1711 self.invalidate()
1712 o = self._opener
1713 if not o.exists(backupname):
1714 # there was no file backup, delete existing files
1715 filename = self._actualfilename(tr)
1716 data_file = None
1717 if self._use_dirstate_v2 and self._map.docket.uuid is not None:
1718 data_file = self._map.docket.data_filename()
1719 if o.exists(filename):
1720 o.unlink(filename)
1721 if data_file is not None and o.exists(data_file):
1722 o.unlink(data_file)
1723 return
1724 filename = self._actualfilename(tr)
1725 data_pair = self.backup_data_file(backupname)
1726 if o.exists(filename) and util.samefile(
1727 o.join(backupname), o.join(filename)
1728 ):
1729 o.unlink(backupname)
1730 else:
1731 o.rename(backupname, filename, checkambig=True)
1732
1733 if data_pair is not None:
1734 data_backup, target = data_pair
1735 if o.exists(target) and util.samefile(
1736 o.join(data_backup), o.join(target)
1737 ):
1738 o.unlink(data_backup)
1739 else:
1740 o.rename(data_backup, target, checkambig=True)
1741
1742 def clearbackup(self, tr, backupname):
1743 '''Clear backup file'''
1744 o = self._opener
1745 if o.exists(backupname):
1746 data_backup = self.backup_data_file(backupname)
1747 o.unlink(backupname)
1748 if data_backup is not None:
1749 o.unlink(data_backup[0])
1750
1751 1633 def verify(self, m1, m2, p1, narrow_matcher=None):
1752 1634 """
1753 1635 check the dirstate contents against the parent manifest and yield errors
@@ -220,15 +220,6 b' class idirstate(interfaceutil.Interface)'
220 220 return files in the dirstate (in whatever state) filtered by match
221 221 """
222 222
223 def savebackup(tr, backupname):
224 '''Save current dirstate into backup file'''
225
226 def restorebackup(tr, backupname):
227 '''Restore dirstate by backup file'''
228
229 def clearbackup(tr, backupname):
230 '''Clear backup file'''
231
232 223 def verify(m1, m2, p1, narrow_matcher=None):
233 224 """
234 225 check the dirstate contents against the parent manifest and yield errors
General Comments 0
You need to be logged in to leave comments. Login now