aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMarco Hinz <mh.codebro@gmail.com>2014-12-20 16:17:39 +0100
committerFlorian Walch <florian@fwalch.com>2014-12-20 16:31:59 +0100
commit7e31044cd8c0a0f3333dd53c70f4f28957d8514d (patch)
treed51eab562ad70c059408faf82bb5addd184632ef /src
parent5a1cddc47bdb9cf2b4b0d0d449c34ed9d237ea90 (diff)
downloadrneovim-7e31044cd8c0a0f3333dd53c70f4f28957d8514d.tar.gz
rneovim-7e31044cd8c0a0f3333dd53c70f4f28957d8514d.tar.bz2
rneovim-7e31044cd8c0a0f3333dd53c70f4f28957d8514d.zip
vim-patch:7.4.456
Problem: 'backupcopy' is global, cannot write only some files in a different way. Solution: Make 'backupcopy' global-local. (Christian Brabandt) https://code.google.com/p/vim/source/detail?r=v7-4-456
Diffstat (limited to 'src')
-rw-r--r--src/nvim/buffer.c1
-rw-r--r--src/nvim/buffer_defs.h2
-rw-r--r--src/nvim/fileio.c11
-rw-r--r--src/nvim/option.c42
-rw-r--r--src/nvim/option_defs.h3
-rw-r--r--src/nvim/version.c2
6 files changed, 47 insertions, 14 deletions
diff --git a/src/nvim/buffer.c b/src/nvim/buffer.c
index 8327f3c836..4c40cd631e 100644
--- a/src/nvim/buffer.c
+++ b/src/nvim/buffer.c
@@ -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);
}
/*
diff --git a/src/nvim/buffer_defs.h b/src/nvim/buffer_defs.h
index 23f20c3c75..ff5f7853a3 100644
--- a/src/nvim/buffer_defs.h
+++ b/src/nvim/buffer_defs.h
@@ -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' */
diff --git a/src/nvim/fileio.c b/src/nvim/fileio.c
index 9c6d7c96bb..82613f5b07 100644
--- a/src/nvim/fileio.c
+++ b/src/nvim/fileio.c
@@ -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))) {
diff --git a/src/nvim/option.c b/src/nvim/option.c
index 5b5570fad4..afe678aae2 100644
--- a/src/nvim/option.c
+++ b/src/nvim/option.c
@@ -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;
+}
diff --git a/src/nvim/option_defs.h b/src/nvim/option_defs.h
index 4422fbc756..8b36df3276 100644
--- a/src/nvim/option_defs.h
+++ b/src/nvim/option_defs.h
@@ -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
diff --git a/src/nvim/version.c b/src/nvim/version.c
index 245f797306..54646d6061 100644
--- a/src/nvim/version.c
+++ b/src/nvim/version.c
@@ -281,7 +281,7 @@ static int included_patches[] = {
//459 NA
//458,
//457,
- //456,
+ 456,
455,
454,
//453 NA