| To: vim_dev@googlegroups.com |
| Subject: Patch 7.4.456 |
| Fcc: outbox |
| From: Bram Moolenaar <Bram@moolenaar.net> |
| Mime-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| |
| Patch 7.4.456 |
| Problem: 'backupcopy' is global, cannot write only some files in a |
| different way. |
| Solution: Make 'backupcopy' global-local. (Christian Brabandt) |
| Files: runtime/doc/options.txt, src/buffer.c, src/fileio.c, src/option.c, |
| src/option.h, src/proto/option.pro, src/structs.h |
| |
| |
| |
| |
| |
| *** 921,927 **** |
| |
| *'backupcopy'* *'bkc'* |
| 'backupcopy' 'bkc' string (Vi default for Unix: "yes", otherwise: "auto") |
| ! global |
| {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. |
| --- 921,927 ---- |
| |
| *'backupcopy'* *'bkc'* |
| 'backupcopy' 'bkc' string (Vi default for Unix: "yes", otherwise: "auto") |
| ! 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. |
| |
| |
| |
| *** 2001,2006 **** |
| --- 2001,2007 ---- |
| #ifdef FEAT_LISP |
| clear_string_option(&buf->b_p_lw); |
| #endif |
| + clear_string_option(&buf->b_p_bkc); |
| } |
| |
| /* |
| |
| |
| |
| *** 3149,3154 **** |
| --- 3149,3155 ---- |
| int write_undo_file = FALSE; |
| context_sha256_T sha_ctx; |
| #endif |
| + unsigned int bkc = get_bkc_value(buf); |
| |
| if (fname == NULL || *fname == NUL) /* safety check */ |
| return FAIL; |
| |
| *** 3647,3656 **** |
| struct stat st; |
| #endif |
| |
| ! if ((bkc_flags & BKC_YES) || append) /* "yes" */ |
| backup_copy = TRUE; |
| #if defined(UNIX) || defined(WIN32) |
| ! else if ((bkc_flags & BKC_AUTO)) /* "auto" */ |
| { |
| int i; |
| |
| --- 3648,3657 ---- |
| struct stat st; |
| #endif |
| |
| ! if ((bkc & BKC_YES) || append) /* "yes" */ |
| backup_copy = TRUE; |
| #if defined(UNIX) || defined(WIN32) |
| ! else if ((bkc & BKC_AUTO)) /* "auto" */ |
| { |
| int i; |
| |
| |
| *** 3738,3744 **** |
| /* |
| * Break symlinks and/or hardlinks if we've been asked to. |
| */ |
| ! if ((bkc_flags & BKC_BREAKSYMLINK) || (bkc_flags & BKC_BREAKHARDLINK)) |
| { |
| # ifdef UNIX |
| int lstat_res; |
| --- 3739,3745 ---- |
| /* |
| * Break symlinks and/or hardlinks if we've been asked to. |
| */ |
| ! if ((bkc & BKC_BREAKSYMLINK) || (bkc & BKC_BREAKHARDLINK)) |
| { |
| # ifdef UNIX |
| int lstat_res; |
| |
| *** 3746,3769 **** |
| lstat_res = mch_lstat((char *)fname, &st); |
| |
| /* Symlinks. */ |
| ! if ((bkc_flags & BKC_BREAKSYMLINK) |
| && lstat_res == 0 |
| && st.st_ino != st_old.st_ino) |
| backup_copy = FALSE; |
| |
| /* Hardlinks. */ |
| ! if ((bkc_flags & BKC_BREAKHARDLINK) |
| && st_old.st_nlink > 1 |
| && (lstat_res != 0 || st.st_ino == st_old.st_ino)) |
| backup_copy = FALSE; |
| # else |
| # if defined(WIN32) |
| /* Symlinks. */ |
| ! if ((bkc_flags & BKC_BREAKSYMLINK) && mch_is_symbolic_link(fname)) |
| backup_copy = FALSE; |
| |
| /* Hardlinks. */ |
| ! if ((bkc_flags & BKC_BREAKHARDLINK) && mch_is_hard_link(fname)) |
| backup_copy = FALSE; |
| # endif |
| # endif |
| --- 3747,3770 ---- |
| lstat_res = mch_lstat((char *)fname, &st); |
| |
| /* Symlinks. */ |
| ! if ((bkc & BKC_BREAKSYMLINK) |
| && lstat_res == 0 |
| && st.st_ino != st_old.st_ino) |
| backup_copy = FALSE; |
| |
| /* Hardlinks. */ |
| ! if ((bkc & BKC_BREAKHARDLINK) |
| && st_old.st_nlink > 1 |
| && (lstat_res != 0 || st.st_ino == st_old.st_ino)) |
| backup_copy = FALSE; |
| # else |
| # if defined(WIN32) |
| /* Symlinks. */ |
| ! if ((bkc & BKC_BREAKSYMLINK) && mch_is_symbolic_link(fname)) |
| backup_copy = FALSE; |
| |
| /* Hardlinks. */ |
| ! if ((bkc & BKC_BREAKHARDLINK) && mch_is_hard_link(fname)) |
| backup_copy = FALSE; |
| # endif |
| # endif |
| |
| |
| |
| *** 56,61 **** |
| --- 56,62 ---- |
| */ |
| #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)) |
| #ifdef FEAT_QUICKFIX |
| # define PV_BH OPT_BUF(BV_BH) |
| # define PV_BT OPT_BUF(BV_BT) |
| |
| *** 582,588 **** |
| (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, |
| #ifdef UNIX |
| {(char_u *)"yes", (char_u *)"auto"} |
| #else |
| --- 583,589 ---- |
| (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_BKC, |
| #ifdef UNIX |
| {(char_u *)"yes", (char_u *)"auto"} |
| #else |
| |
| *** 5412,5417 **** |
| --- 5413,5419 ---- |
| #ifdef FEAT_LISP |
| check_string_option(&buf->b_p_lw); |
| #endif |
| + check_string_option(&buf->b_p_bkc); |
| } |
| |
| /* |
| |
| *** 5729,5744 **** |
| } |
| |
| /* 'backupcopy' */ |
| ! else if (varp == &p_bkc) |
| { |
| ! if (opt_strings_flags(p_bkc, p_bkc_values, &bkc_flags, TRUE) != OK) |
| errmsg = e_invarg; |
| ! if (((bkc_flags & BKC_AUTO) != 0) |
| ! + ((bkc_flags & BKC_YES) != 0) |
| ! + ((bkc_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); |
| errmsg = e_invarg; |
| } |
| } |
| --- 5731,5755 ---- |
| } |
| |
| /* 'backupcopy' */ |
| ! 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 ((((int)*flags & BKC_AUTO) != 0) |
| ! + (((int)*flags & BKC_YES) != 0) |
| ! + (((int)*flags & BKC_NO) != 0) != 1) |
| { |
| /* Must have exactly one of "auto", "yes" and "no". */ |
| ! (void)opt_strings_flags(oldval, p_bkc_values, flags, TRUE); |
| errmsg = e_invarg; |
| } |
| } |
| |
| *** 9025,9036 **** |
| } |
| |
| /* |
| ! * Iterate over options. First argument is a pointer to a pointer to a structure |
| ! * inside options[] array, second is option type like in the above function. |
| * |
| ! * If first argument points to NULL it is assumed that iteration just started |
| * and caller needs the very first value. |
| ! * If first argument points to the end marker function returns NULL and sets |
| * first argument to NULL. |
| * |
| * Returns full option name for current option on each call. |
| --- 9036,9048 ---- |
| } |
| |
| /* |
| ! * Iterate over options. First argument is a pointer to a pointer to a |
| ! * structure inside options[] array, second is option type like in the above |
| ! * function. |
| * |
| ! * If first argument points to NULL it is assumed that iteration just started |
| * and caller needs the very first value. |
| ! * If first argument points to the end marker function returns NULL and sets |
| * first argument to NULL. |
| * |
| * Returns full option name for current option on each call. |
| |
| *** 9856,9861 **** |
| --- 9868,9877 ---- |
| 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; |
| |
| *** 9961,9966 **** |
| --- 9977,9983 ---- |
| #ifdef FEAT_LISP |
| case PV_LW: return (char_u *)&(curbuf->b_p_lw); |
| #endif |
| + case PV_BKC: return (char_u *)&(curbuf->b_p_bkc); |
| } |
| return NULL; /* "cannot happen" */ |
| } |
| |
| *** 9993,9998 **** |
| --- 10010,10017 ---- |
| ? (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; |
| #ifdef FEAT_FIND_ID |
| case PV_DEF: return *curbuf->b_p_def != NUL |
| ? (char_u *)&(curbuf->b_p_def) : p->var; |
| |
| *** 10585,10590 **** |
| --- 10604,10611 ---- |
| * 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; |
| #ifdef FEAT_QUICKFIX |
| buf->b_p_gp = empty_option; |
| buf->b_p_mp = empty_option; |
| |
| *** 12052,12054 **** |
| --- 12073,12085 ---- |
| return OK; |
| } |
| #endif |
| + |
| + /* |
| + * Get the local or global value of 'backupcopy'. |
| + */ |
| + unsigned int |
| + get_bkc_value(buf) |
| + buf_T *buf; |
| + { |
| + return buf->b_bkc_flags ? buf->b_bkc_flags : bkc_flags; |
| + } |
| |
| |
| |
| *** 327,333 **** |
| EXTERN char_u *p_bg; /* 'background' */ |
| EXTERN int p_bk; /* 'backup' */ |
| EXTERN char_u *p_bkc; /* 'backupcopy' */ |
| ! EXTERN unsigned bkc_flags; |
| #ifdef IN_OPTION_C |
| static char *(p_bkc_values[]) = {"yes", "auto", "no", "breaksymlink", "breakhardlink", NULL}; |
| #endif |
| --- 327,333 ---- |
| EXTERN char_u *p_bg; /* 'background' */ |
| EXTERN int p_bk; /* 'backup' */ |
| EXTERN char_u *p_bkc; /* 'backupcopy' */ |
| ! EXTERN unsigned bkc_flags; /* flags from 'backupcopy' */ |
| #ifdef IN_OPTION_C |
| static char *(p_bkc_values[]) = {"yes", "auto", "no", "breaksymlink", "breakhardlink", NULL}; |
| #endif |
| |
| *** 918,923 **** |
| --- 918,926 ---- |
| , BV_AR |
| #ifdef FEAT_QUICKFIX |
| , BV_BH |
| + #endif |
| + , BV_BKC |
| + #ifdef FEAT_QUICKFIX |
| , BV_BT |
| , BV_EFM |
| , BV_GP |
| |
| |
| |
| *** 62,65 **** |
| --- 62,66 ---- |
| long get_sw_value __ARGS((buf_T *buf)); |
| long get_sts_value __ARGS((void)); |
| void find_mps_values __ARGS((int *initc, int *findc, int *backwards, int switchit)); |
| + unsigned int get_bkc_value __ARGS((buf_T *buf)); |
| /* vim: set ft=c : */ |
| |
| |
| |
| *** 137,143 **** |
| #ifdef FEAT_LINEBREAK |
| int wo_bri; |
| # define w_p_bri w_onebuf_opt.wo_bri /* 'breakindent' */ |
| ! char_u *wo_briopt; |
| # define w_p_briopt w_onebuf_opt.wo_briopt /* 'breakindentopt' */ |
| #endif |
| #ifdef FEAT_DIFF |
| --- 137,143 ---- |
| #ifdef FEAT_LINEBREAK |
| int wo_bri; |
| # define w_p_bri w_onebuf_opt.wo_bri /* 'breakindent' */ |
| ! char_u *wo_briopt; |
| # define w_p_briopt w_onebuf_opt.wo_briopt /* 'breakindentopt' */ |
| #endif |
| #ifdef FEAT_DIFF |
| |
| *** 1537,1542 **** |
| --- 1537,1544 ---- |
| |
| int b_p_ai; /* 'autoindent' */ |
| int b_p_ai_nopaste; /* b_p_ai saved for paste mode */ |
| + char_u *b_p_bkc; /* 'backupcopy' */ |
| + unsigned b_bkc_flags; /* flags for 'backupcopy' */ |
| int b_p_ci; /* 'copyindent' */ |
| int b_p_bin; /* 'binary' */ |
| #ifdef FEAT_MBYTE |
| |
| |
| |
| *** 743,744 **** |
| --- 743,746 ---- |
| { /* Add new patch number below this line */ |
| + /**/ |
| + 456, |
| /**/ |
| |
| -- |
| If Apple would build a car... |
| ... it would be powered by the sun, be reliable, five times |
| as fast and twice as easy to drive; but would only run on |
| five percent of the roads. |
| |
| /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ |
| /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ |
| \\\ an exciting new programming language -- http://www.Zimbu.org /// |
| \\\ help me help AIDS victims -- http://ICCF-Holland.org /// |