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 -- [email protected] -- 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    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Raspunde prin e-mail lui