Merge pull request #1712 from fwalch/vim-7.4.456

vim-patch:7.4.456
This commit is contained in:
Justin M. Keyes 2014-12-23 03:35:20 -05:00
commit bac6fb41b2
7 changed files with 48 additions and 15 deletions

View File

@ -921,7 +921,7 @@ A jump table for the options with a short description can be found at |Q_op|.
*'backupcopy'* *'bkc'*
'backupcopy' 'bkc' string (Vi default for Unix: "yes", otherwise: "auto")
global
global or local to buffer |global-local|
{not in Vi}
When writing a file and a backup is made, this option tells how it's
done. This is a comma separated list of words.

View File

@ -1530,6 +1530,7 @@ void free_buf_options(buf_T *buf, int free_p_ff)
buf->b_p_ar = -1;
buf->b_p_ul = NO_LOCAL_UNDOLEVEL;
clear_string_option(&buf->b_p_lw);
clear_string_option(&buf->b_p_bkc);
}
/*

View File

@ -596,6 +596,8 @@ struct file_buffer {
int b_p_ai; /* 'autoindent' */
int b_p_ai_nopaste; /* b_p_ai saved for paste mode */
char_u *b_p_bkc; ///< 'backupcopy'
unsigned int b_bkc_flags; ///< flags for 'backupcopy'
int b_p_ci; /* 'copyindent' */
int b_p_bin; /* 'binary' */
int b_p_bomb; /* 'bomb' */

View File

@ -2313,6 +2313,7 @@ buf_write (
#endif
int write_undo_file = FALSE;
context_sha256_T sha_ctx;
unsigned int bkc = get_bkc_value(buf);
if (fname == NULL || *fname == NUL) /* safety check */
return FAIL;
@ -2701,9 +2702,9 @@ buf_write (
if (!(append && *p_pm == NUL) && !filtering && perm >= 0 && dobackup) {
FileInfo file_info;
if ((bkc_flags & BKC_YES) || append) { /* "yes" */
if ((bkc & BKC_YES) || append) { /* "yes" */
backup_copy = TRUE;
} else if ((bkc_flags & BKC_AUTO)) { /* "auto" */
} else if ((bkc & BKC_AUTO)) { /* "auto" */
int i;
# ifdef UNIX
@ -2758,19 +2759,19 @@ buf_write (
/*
* Break symlinks and/or hardlinks if we've been asked to.
*/
if ((bkc_flags & BKC_BREAKSYMLINK) || (bkc_flags & BKC_BREAKHARDLINK)) {
if ((bkc & BKC_BREAKSYMLINK) || (bkc & BKC_BREAKHARDLINK)) {
# ifdef UNIX
bool file_info_link_ok = os_fileinfo_link((char *)fname, &file_info);
/* Symlinks. */
if ((bkc_flags & BKC_BREAKSYMLINK)
if ((bkc & BKC_BREAKSYMLINK)
&& file_info_link_ok
&& !os_fileinfo_id_equal(&file_info, &file_info_old)) {
backup_copy = FALSE;
}
/* Hardlinks. */
if ((bkc_flags & BKC_BREAKHARDLINK)
if ((bkc & BKC_BREAKHARDLINK)
&& os_fileinfo_hardlinks(&file_info_old) > 1
&& (!file_info_link_ok
|| os_fileinfo_id_equal(&file_info, &file_info_old))) {

View File

@ -103,6 +103,7 @@
*/
#define PV_AI OPT_BUF(BV_AI)
#define PV_AR OPT_BOTH(OPT_BUF(BV_AR))
#define PV_BKC OPT_BOTH(OPT_BUF(BV_BKC))
# define PV_BH OPT_BUF(BV_BH)
# define PV_BT OPT_BUF(BV_BT)
# define PV_EFM OPT_BOTH(OPT_BUF(BV_EFM))
@ -438,7 +439,7 @@ static struct vimoption
(char_u *)&p_bk, PV_NONE,
{(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
{"backupcopy", "bkc", P_STRING|P_VIM|P_COMMA|P_NODUP,
(char_u *)&p_bkc, PV_NONE,
(char_u *)&p_bkc, PV_BKC,
#ifdef UNIX
{(char_u *)"yes", (char_u *)"auto"}
#else
@ -3526,6 +3527,7 @@ void check_buf_options(buf_T *buf)
check_string_option(&buf->b_p_dict);
check_string_option(&buf->b_p_tsr);
check_string_option(&buf->b_p_lw);
check_string_option(&buf->b_p_bkc);
}
/*
@ -3782,14 +3784,24 @@ did_set_string_option (
redraw_later_clear();
}
/* 'backupcopy' */
else if (varp == &p_bkc) {
if (opt_strings_flags(p_bkc, p_bkc_values, &bkc_flags, TRUE) != OK)
else if (gvarp == &p_bkc) {
char_u *bkc = p_bkc;
unsigned int *flags = &bkc_flags;
if (opt_flags & OPT_LOCAL) {
bkc = curbuf->b_p_bkc;
flags = &curbuf->b_bkc_flags;
}
if (opt_strings_flags(bkc, p_bkc_values, flags, TRUE) != OK) {
errmsg = e_invarg;
if (((bkc_flags & BKC_AUTO) != 0)
+ ((bkc_flags & BKC_YES) != 0)
+ ((bkc_flags & BKC_NO) != 0) != 1) {
}
if (((*flags & BKC_AUTO) != 0)
+ ((*flags & BKC_YES) != 0)
+ ((*flags & BKC_NO) != 0) != 1) {
/* Must have exactly one of "auto", "yes" and "no". */
(void)opt_strings_flags(oldval, p_bkc_values, &bkc_flags, TRUE);
(void)opt_strings_flags(oldval, p_bkc_values, flags, TRUE);
errmsg = e_invarg;
}
}
@ -6518,6 +6530,10 @@ void unset_global_local_option(char *name, void *from)
case PV_AR:
buf->b_p_ar = -1;
break;
case PV_BKC:
clear_string_option(&buf->b_p_bkc);
buf->b_bkc_flags = 0;
break;
case PV_TAGS:
clear_string_option(&buf->b_p_tags);
break;
@ -6581,6 +6597,7 @@ static char_u *get_varp_scope(struct vimoption *p, int opt_flags)
case PV_STL: return (char_u *)&(curwin->w_p_stl);
case PV_UL: return (char_u *)&(curbuf->b_p_ul);
case PV_LW: return (char_u *)&(curbuf->b_p_lw);
case PV_BKC: return (char_u *)&(curbuf->b_p_bkc);
}
return NULL; /* "cannot happen" */
}
@ -6610,6 +6627,8 @@ static char_u *get_varp(struct vimoption *p)
? (char_u *)&(curbuf->b_p_ar) : p->var;
case PV_TAGS: return *curbuf->b_p_tags != NUL
? (char_u *)&(curbuf->b_p_tags) : p->var;
case PV_BKC: return *curbuf->b_p_bkc != NUL
? (char_u *)&(curbuf->b_p_bkc) : p->var;
case PV_DEF: return *curbuf->b_p_def != NUL
? (char_u *)&(curbuf->b_p_def) : p->var;
case PV_INC: return *curbuf->b_p_inc != NUL
@ -6975,6 +6994,8 @@ void buf_copy_options(buf_T *buf, int flags)
* are not copied, start using the global value */
buf->b_p_ar = -1;
buf->b_p_ul = NO_LOCAL_UNDOLEVEL;
buf->b_p_bkc = empty_option;
buf->b_bkc_flags = 0;
buf->b_p_gp = empty_option;
buf->b_p_mp = empty_option;
buf->b_p_efm = empty_option;
@ -8116,3 +8137,10 @@ static bool briopt_check(win_T *wp)
return true;
}
/// Get the local or global value of 'backupcopy'.
///
/// @param buf The buffer.
unsigned int get_bkc_value(buf_T *buf)
{
return buf->b_bkc_flags ? buf->b_bkc_flags : bkc_flags;
}

View File

@ -292,7 +292,7 @@ EXTERN char_u *p_bs; /* 'backspace' */
EXTERN char_u *p_bg; /* 'background' */
EXTERN int p_bk; /* 'backup' */
EXTERN char_u *p_bkc; /* 'backupcopy' */
EXTERN unsigned bkc_flags;
EXTERN unsigned int bkc_flags; ///< flags from 'backupcopy'
#ifdef IN_OPTION_C
static char *(p_bkc_values[]) =
{"yes", "auto", "no", "breaksymlink", "breakhardlink", NULL};
@ -643,6 +643,7 @@ enum {
BV_AI = 0
, BV_AR
, BV_BH
, BV_BKC
, BV_BT
, BV_EFM
, BV_GP

View File

@ -281,7 +281,7 @@ static int included_patches[] = {
//459 NA
//458,
//457,
//456,
456,
455,
454,
//453 NA