commit 8ec3e3283a7384215afede4b6177852d338d708a
Author: Richard Heck <[email protected]>
Date: Fri Aug 8 12:02:20 2014 -0400
If we successfully save a file but fail to move it to its proper location,
then, if we made a backup and the original file was not a symlink, we moved
that file, so it will look to the user as if it was deleted. This is bug
diff --git a/src/Buffer.cpp b/src/Buffer.cpp
index bfd1676..9dd2a25 100644
--- a/src/Buffer.cpp
+++ b/src/Buffer.cpp
@@ -1301,17 +1301,20 @@ bool Buffer::save() const
// proper location once that has been done successfully. that
// way we preserve the original file if something goes wrong.
TempFile tempfile(fileName().onlyPath(), "tmpXXXXXX.lyx");
- FileName savefile(tempfile.name());
+ bool const symlink = fileName().isSymLink();
+ if (!symlink)
+ tempfile.setAutoRemove(false);
+ FileName savefile(tempfile.name());
LYXERR(Debug::FILES, "Saving to " << savefile.absFileName());
if (!writeFile(savefile))
return false;
// we will set this to false if we fail
bool made_backup = true;
- bool const symlink = fileName().isSymLink();
+
+ FileName backupName(absFileName() + '~');
if (lyxrc.make_backup) {
- FileName backupName(absFileName() + '~');
if (!lyxrc.backupdir_path.empty()) {
string const mangledName =
subst(subst(backupName.absFileName(), '/',
'!'), ':', '!');
@@ -1338,22 +1341,39 @@ bool Buffer::save() const
// If we have no symlink, we can simply rename the temp file.
// Otherwise, we need to copy it so the symlink stays intact.
- if (!symlink)
- tempfile.setAutoRemove(false);
- if (made_backup &&
- (symlink ? savefile.copyTo(fileName(), true) :
savefile.moveTo(fileName()))) {
+ if (made_backup && symlink ? savefile.copyTo(fileName(), true) :
+ savefile.moveTo(fileName()))
+ {
// saveCheckSum() was already called by writeFile(), but the
// time stamp is invalidated by copying/moving
saveCheckSum();
markClean();
return true;
}
- // else
- Alert::error(_("Write failure"),
- bformat(_("Cannot move saved file to:\n %1$s.\n"
- "But the file has successfully been saved as:\n
%2$s."),
- from_utf8(fileName().absFileName()),
- from_utf8(savefile.absFileName())));
+ // else we saved the file, but failed to move it to the right location.
+
+ if (lyxrc.make_backup && made_backup && !symlink) {
+ // the original file was moved to filename.lyx~, so it will look
+ // to the user as if it was deleted. (see bug #9234.) we could
try
+ // to restore it, but that would basically mean trying to do
again
+ // what we just failed to do. better to leave things as they
are.
+ Alert::error(_("Write failure"),
+ bformat(_("The file has successfully been saved
as:\n %1$s.\n"
+ "But LyX could not move it to:\n %2$s.\n"
+ "Your original file
has been backed up to:\n %3$s"),
+ from_utf8(savefile.absFileName()),
+ from_utf8(fileName().absFileName()),
+ from_utf8(backupName.absFileName())));
+ } else {
+ // either we did not try to make a backup, or else we tried and
failed,
+ // or else the original file was a symlink, in which case it
was copied,
+ // not moved. so the original file is intact.
+ Alert::error(_("Write failure"),
+ bformat(_("Cannot move saved file to:\n %1$s.\n"
+ "But the file has successfully been
saved as:\n %2$s."),
+ from_utf8(fileName().absFileName()),
+ from_utf8(savefile.absFileName())));
+ }
return false;
}