]> granicus.if.org Git - vim/commitdiff
updated for version 7.4.456 v7.4.456
authorBram Moolenaar <Bram@vim.org>
Tue, 23 Sep 2014 13:45:08 +0000 (15:45 +0200)
committerBram Moolenaar <Bram@vim.org>
Tue, 23 Sep 2014 13:45:08 +0000 (15:45 +0200)
Problem:    'backupcopy' is global, cannot write only some files in a
            different way.
Solution:   Make 'backupcopy' global-local. (Christian Brabandt)

runtime/doc/options.txt
src/buffer.c
src/fileio.c
src/option.c
src/option.h
src/proto/option.pro
src/structs.h
src/version.c

index 291ab833eeb964fb2750480c70444c8664aa55e1..790e66c7b449170ed842775657bc89d1d3e04cd8 100644 (file)
@@ -921,7 +921,7 @@ A jump table for the options with a short description can be found at |Q_op|.
 
                                                *'backupcopy'* *'bkc'*
 'backupcopy' 'bkc'     string  (Vi default for Unix: "yes", otherwise: "auto")
-                       global
+                       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.
index 4fc50321ce6cfe70777c11fbadd573518c611e34..9eb67164e9ecc10850e18fe4db4a7e8dae97bc93 100644 (file)
@@ -2001,6 +2001,7 @@ free_buf_options(buf, free_p_ff)
 #ifdef FEAT_LISP
     clear_string_option(&buf->b_p_lw);
 #endif
+    clear_string_option(&buf->b_p_bkc);
 }
 
 /*
index b9221ed400b8b8307c62211ed3075e83f5add14b..c7e846b82ade47e8f1ae9b2876ee7a197c0ed188 100644 (file)
@@ -3149,6 +3149,7 @@ buf_write(buf, fname, sfname, start, end, eap, append, forceit,
     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,10 +3648,10 @@ buf_write(buf, fname, sfname, start, end, eap, append, forceit,
        struct stat st;
 #endif
 
-       if ((bkc_flags & BKC_YES) || append)    /* "yes" */
+       if ((bkc & BKC_YES) || append)  /* "yes" */
            backup_copy = TRUE;
 #if defined(UNIX) || defined(WIN32)
-       else if ((bkc_flags & BKC_AUTO))        /* "auto" */
+       else if ((bkc & BKC_AUTO))      /* "auto" */
        {
            int         i;
 
@@ -3738,7 +3739,7 @@ buf_write(buf, fname, sfname, start, end, eap, append, forceit,
        /*
         * 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
            int lstat_res;
@@ -3746,24 +3747,24 @@ buf_write(buf, fname, sfname, start, end, eap, append, forceit,
            lstat_res = mch_lstat((char *)fname, &st);
 
            /* Symlinks. */
-           if ((bkc_flags & BKC_BREAKSYMLINK)
+           if ((bkc & BKC_BREAKSYMLINK)
                    && lstat_res == 0
                    && st.st_ino != st_old.st_ino)
                backup_copy = FALSE;
 
            /* Hardlinks. */
-           if ((bkc_flags & BKC_BREAKHARDLINK)
+           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_flags & BKC_BREAKSYMLINK) && mch_is_symbolic_link(fname))
+           if ((bkc & BKC_BREAKSYMLINK) && mch_is_symbolic_link(fname))
                backup_copy = FALSE;
 
            /* Hardlinks. */
-           if ((bkc_flags & BKC_BREAKHARDLINK) && mch_is_hard_link(fname))
+           if ((bkc & BKC_BREAKHARDLINK) && mch_is_hard_link(fname))
                backup_copy = FALSE;
 #  endif
 # endif
index 2007dee7dbfa32cf79f93d4c654e64319ef4052f..af9fb506fc7bcf98aafa5b602d1a9dc926f3aca9 100644 (file)
@@ -56,6 +56,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))
 #ifdef FEAT_QUICKFIX
 # define PV_BH         OPT_BUF(BV_BH)
 # define PV_BT         OPT_BUF(BV_BT)
@@ -582,7 +583,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
@@ -5412,6 +5413,7 @@ check_buf_options(buf)
 #ifdef FEAT_LISP
     check_string_option(&buf->b_p_lw);
 #endif
+    check_string_option(&buf->b_p_bkc);
 }
 
 /*
@@ -5729,16 +5731,25 @@ did_set_string_option(opt_idx, varp, new_value_alloced, oldval, errbuf,
     }
 
     /* 'backupcopy' */
-    else if (varp == &p_bkc)
+    else if (gvarp == &p_bkc)
     {
-       if (opt_strings_flags(p_bkc, p_bkc_values, &bkc_flags, TRUE) != OK)
+       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 ((((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, &bkc_flags, TRUE);
+           (void)opt_strings_flags(oldval, p_bkc_values, flags, TRUE);
            errmsg = e_invarg;
        }
     }
@@ -9025,12 +9036,13 @@ get_option_value_strict(name, numval, stringval, opt_type, from)
 }
 
 /*
- * 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.
+ * 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 
+ * 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 
+ * 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,6 +9868,10 @@ unset_global_local_option(name, 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;
@@ -9961,6 +9977,7 @@ get_varp_scope(p, opt_flags)
 #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,6 +10010,8 @@ get_varp(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;
 #ifdef FEAT_FIND_ID
        case PV_DEF:    return *curbuf->b_p_def != NUL
                                    ? (char_u *)&(curbuf->b_p_def) : p->var;
@@ -10585,6 +10604,8 @@ buf_copy_options(buf, 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;
 #ifdef FEAT_QUICKFIX
            buf->b_p_gp = empty_option;
            buf->b_p_mp = empty_option;
@@ -12052,3 +12073,13 @@ briopt_check(wp)
     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;
+}
index 696d70d6a29d3eb3e6be777ddb060c587c0490fd..23cdecdf01752b822f25db68a33b9ee86f808250 100644 (file)
@@ -327,7 +327,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        bkc_flags;      /* flags from 'backupcopy' */
 #ifdef IN_OPTION_C
 static char *(p_bkc_values[]) = {"yes", "auto", "no", "breaksymlink", "breakhardlink", NULL};
 #endif
@@ -918,6 +918,9 @@ enum
     , BV_AR
 #ifdef FEAT_QUICKFIX
     , BV_BH
+#endif
+    , BV_BKC
+#ifdef FEAT_QUICKFIX
     , BV_BT
     , BV_EFM
     , BV_GP
index 3da74e62d053fecf1ba3b4441f4df7065c053020..2fe05aa048f7d0fe62d2491233af8042f16ee55e 100644 (file)
@@ -62,4 +62,5 @@ int check_ff_value __ARGS((char_u *p));
 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 : */
index 441fcaa1c4db6f2815ba3c13e478cfa82ef1ef96..d24175320f21939fab060217189a7577c16e1cfa 100644 (file)
@@ -137,7 +137,7 @@ typedef struct
 #ifdef FEAT_LINEBREAK
     int                wo_bri;
 # define w_p_bri w_onebuf_opt.wo_bri   /* 'breakindent' */
-    char_u             *wo_briopt;
+    char_u     *wo_briopt;
 # define w_p_briopt w_onebuf_opt.wo_briopt /* 'breakindentopt' */
 #endif
 #ifdef FEAT_DIFF
@@ -1537,6 +1537,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   b_bkc_flags;    /* flags for 'backupcopy' */
     int                b_p_ci;         /* 'copyindent' */
     int                b_p_bin;        /* 'binary' */
 #ifdef FEAT_MBYTE
index 9083083d1ef1ac91a3a0485b8eedd44b162dff24..50639fd642347f136314d65281d1b2060a65338c 100644 (file)
@@ -741,6 +741,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    456,
 /**/
     455,
 /**/