Fix: :wundo didn't work in a buffer without a name.

This commit is contained in:
Bram Moolenaar
2010-05-24 22:02:24 +02:00
parent 442b4225d3
commit 6a244fefd9
2 changed files with 30 additions and 14 deletions

View File

@ -7226,8 +7226,11 @@ A jump table for the options with a short description can be found at |Q_op|.
{not in Vi} {not in Vi}
{only when compiled with the +persistent_undo feature} {only when compiled with the +persistent_undo feature}
List of directory names for undo files, separated with commas. List of directory names for undo files, separated with commas.
See |'backupdir'| for the format. Specifically, "." means using the See |'backupdir'| for the format.
directory of the file. "." means using the directory of the file. The undo file name for
"file.txt" is ".file.txt.un~".
For other directories the file name is the full path of the edited
file, with path separators replaced with "%".
When writing: The first directory that exists is used. "." always When writing: The first directory that exists is used. "." always
works, no directories after "." will be used for writing. works, no directories after "." will be used for writing.
When reading all entries are tried to find an undo file. The first When reading all entries are tried to find an undo file. The first

View File

@ -1233,6 +1233,7 @@ u_write_undo(name, forceit, buf, hash)
int perm; int perm;
int write_ok = FALSE; int write_ok = FALSE;
#ifdef UNIX #ifdef UNIX
int st_old_valid = FALSE;
struct stat st_old; struct stat st_old;
struct stat st_new; struct stat st_new;
#endif #endif
@ -1246,16 +1247,25 @@ u_write_undo(name, forceit, buf, hash)
else else
file_name = name; file_name = name;
#ifdef UNIX if (buf->b_ffname == NULL)
if (mch_stat((char *)buf->b_ffname, &st_old) >= 0) perm = 0600;
perm = st_old.st_mode;
else else
perm = 0600; {
#ifdef UNIX
if (mch_stat((char *)buf->b_ffname, &st_old) >= 0)
{
perm = st_old.st_mode;
st_old_valid = TRUE;
}
else
perm = 0600;
#else #else
perm = mch_getperm(buf->b_ffname); perm = mch_getperm(buf->b_ffname);
if (perm < 0) if (perm < 0)
perm = 0600; perm = 0600;
#endif #endif
}
/* set file protection same as original file, but strip s-bit */ /* set file protection same as original file, but strip s-bit */
perm = perm & 0777; perm = perm & 0777;
@ -1309,15 +1319,16 @@ u_write_undo(name, forceit, buf, hash)
* this fails, set the protection bits for the group same as the * this fails, set the protection bits for the group same as the
* protection bits for others. * protection bits for others.
*/ */
if (mch_stat((char *)file_name, &st_new) >= 0 if (st_old_valid && (mch_stat((char *)file_name, &st_new) >= 0
&& st_new.st_gid != st_old.st_gid && st_new.st_gid != st_old.st_gid
# ifdef HAVE_FCHOWN /* sequent-ptx lacks fchown() */ # ifdef HAVE_FCHOWN /* sequent-ptx lacks fchown() */
&& fchown(fd, (uid_t)-1, st_old.st_gid) != 0 && fchown(fd, (uid_t)-1, st_old.st_gid) != 0)
# endif # endif
) )
mch_setperm(file_name, (perm & 0707) | ((perm & 07) << 3)); mch_setperm(file_name, (perm & 0707) | ((perm & 07) << 3));
# ifdef HAVE_SELINUX # ifdef HAVE_SELINUX
mch_copy_sec(buf->b_ffname, file_name); if (buf->b_ffname != NULL)
mch_copy_sec(buf->b_ffname, file_name);
# endif # endif
#endif #endif
@ -1438,9 +1449,11 @@ write_error:
EMSG2(_("E829: write error in undo file: %s"), file_name); EMSG2(_("E829: write error in undo file: %s"), file_name);
#if defined(MACOS_CLASSIC) || defined(WIN3264) #if defined(MACOS_CLASSIC) || defined(WIN3264)
(void)mch_copy_file_attribute(buf->b_ffname, file_name); if (buf->b_ffname != NULL)
(void)mch_copy_file_attribute(buf->b_ffname, file_name);
#endif #endif
#ifdef HAVE_ACL #ifdef HAVE_ACL
if (buf->b_ffname != NULL)
{ {
vim_acl_T acl; vim_acl_T acl;