Fix: :wundo didn't work in a buffer without a name.
This commit is contained in:
@ -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
|
||||||
|
|||||||
37
src/undo.c
37
src/undo.c
@ -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;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user