diff options
author | Marco Hinz <mh.codebro@gmail.com> | 2014-12-20 16:17:39 +0100 |
---|---|---|
committer | Florian Walch <florian@fwalch.com> | 2014-12-20 16:31:59 +0100 |
commit | 7e31044cd8c0a0f3333dd53c70f4f28957d8514d (patch) | |
tree | d51eab562ad70c059408faf82bb5addd184632ef /src | |
parent | 5a1cddc47bdb9cf2b4b0d0d449c34ed9d237ea90 (diff) | |
download | rneovim-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.c | 1 | ||||
-rw-r--r-- | src/nvim/buffer_defs.h | 2 | ||||
-rw-r--r-- | src/nvim/fileio.c | 11 | ||||
-rw-r--r-- | src/nvim/option.c | 42 | ||||
-rw-r--r-- | src/nvim/option_defs.h | 3 | ||||
-rw-r--r-- | src/nvim/version.c | 2 |
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 |