1298 if tr: |
1298 if tr: |
1299 return self._pendingfilename |
1299 return self._pendingfilename |
1300 else: |
1300 else: |
1301 return self._filename |
1301 return self._filename |
1302 |
1302 |
1303 def savebackup(self, tr, suffix='', prefix=''): |
1303 def savebackup(self, tr, backupname): |
1304 '''Save current dirstate into backup file with suffix''' |
1304 '''Save current dirstate into backup file''' |
1305 assert len(suffix) > 0 or len(prefix) > 0 |
|
1306 filename = self._actualfilename(tr) |
1305 filename = self._actualfilename(tr) |
|
1306 assert backupname != filename |
1307 |
1307 |
1308 # use '_writedirstate' instead of 'write' to write changes certainly, |
1308 # use '_writedirstate' instead of 'write' to write changes certainly, |
1309 # because the latter omits writing out if transaction is running. |
1309 # because the latter omits writing out if transaction is running. |
1310 # output file will be used to create backup of dirstate at this point. |
1310 # output file will be used to create backup of dirstate at this point. |
1311 if self._dirty or not self._opener.exists(filename): |
1311 if self._dirty or not self._opener.exists(filename): |
1322 # ensure that pending file written above is unlinked at |
1322 # ensure that pending file written above is unlinked at |
1323 # failure, even if tr.writepending isn't invoked until the |
1323 # failure, even if tr.writepending isn't invoked until the |
1324 # end of this transaction |
1324 # end of this transaction |
1325 tr.registertmp(filename, location='plain') |
1325 tr.registertmp(filename, location='plain') |
1326 |
1326 |
1327 backupname = prefix + self._filename + suffix |
|
1328 assert backupname != filename |
|
1329 self._opener.tryunlink(backupname) |
1327 self._opener.tryunlink(backupname) |
1330 # hardlink backup is okay because _writedirstate is always called |
1328 # hardlink backup is okay because _writedirstate is always called |
1331 # with an "atomictemp=True" file. |
1329 # with an "atomictemp=True" file. |
1332 util.copyfile(self._opener.join(filename), |
1330 util.copyfile(self._opener.join(filename), |
1333 self._opener.join(backupname), hardlink=True) |
1331 self._opener.join(backupname), hardlink=True) |
1334 |
1332 |
1335 def restorebackup(self, tr, suffix='', prefix=''): |
1333 def restorebackup(self, tr, backupname): |
1336 '''Restore dirstate by backup file with suffix''' |
1334 '''Restore dirstate by backup file''' |
1337 assert len(suffix) > 0 or len(prefix) > 0 |
|
1338 # this "invalidate()" prevents "wlock.release()" from writing |
1335 # this "invalidate()" prevents "wlock.release()" from writing |
1339 # changes of dirstate out after restoring from backup file |
1336 # changes of dirstate out after restoring from backup file |
1340 self.invalidate() |
1337 self.invalidate() |
1341 filename = self._actualfilename(tr) |
1338 filename = self._actualfilename(tr) |
1342 # using self._filename to avoid having "pending" in the backup filename |
1339 self._opener.rename(backupname, filename, checkambig=True) |
1343 self._opener.rename(prefix + self._filename + suffix, filename, |
1340 |
1344 checkambig=True) |
1341 def clearbackup(self, tr, backupname): |
1345 |
1342 '''Clear backup file''' |
1346 def clearbackup(self, tr, suffix='', prefix=''): |
1343 self._opener.unlink(backupname) |
1347 '''Clear backup file with suffix''' |
|
1348 assert len(suffix) > 0 or len(prefix) > 0 |
|
1349 # using self._filename to avoid having "pending" in the backup filename |
|
1350 self._opener.unlink(prefix + self._filename + suffix) |
|