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    ///
