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
*** ../vim-7.4.455/runtime/doc/options.txt 2014-08-10 13:34:59.052785459 +0200
--- runtime/doc/options.txt 2014-09-23 14:28:40.530791041 +0200
***************
*** 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.
*** ../vim-7.4.455/src/buffer.c 2014-09-23 14:24:36.406790508 +0200
--- src/buffer.c 2014-09-23 14:28:40.530791041 +0200
***************
*** 2001,2006 ****
--- 2001,2007 ----
#ifdef FEAT_LISP
clear_string_option(&buf->b_p_lw);
#endif
+ clear_string_option(&buf->b_p_bkc);
}
/*
*** ../vim-7.4.455/src/fileio.c 2014-09-09 16:59:34.792537789 +0200
--- src/fileio.c 2014-09-23 14:28:40.530791041 +0200
***************
*** 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
*** ../vim-7.4.455/src/option.c 2014-09-09 17:33:02.700542175 +0200
--- src/option.c 2014-09-23 14:41:25.890792713 +0200
***************
*** 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;
+ }
*** ../vim-7.4.455/src/option.h 2014-08-06 14:52:05.047236174 +0200
--- src/option.h 2014-09-23 14:41:45.614792756 +0200
***************
*** 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
*** ../vim-7.4.455/src/proto/option.pro 2014-08-24 21:39:45.488526954 +0200
--- src/proto/option.pro 2014-09-23 14:28:40.534791041 +0200
***************
*** 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 : */
*** ../vim-7.4.455/src/structs.h 2014-08-10 13:34:59.064785459 +0200
--- src/structs.h 2014-09-23 14:41:56.218792779 +0200
***************
*** 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
*** ../vim-7.4.455/src/version.c 2014-09-23 14:24:36.410790508 +0200
--- src/version.c 2014-09-23 14:29:15.706791118 +0200
***************
*** 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 ///