[vim/f19] - patchlevel 880
Karsten Hopp
karsten at fedoraproject.org
Mon Apr 15 15:07:46 UTC 2013
commit bd0f9e2f6fc17b207147c17f12c17afe4d25fd3d
Author: Karsten Hopp <karsten at redhat.com>
Date: Mon Apr 15 17:02:33 2013 +0200
- patchlevel 880
7.3.880 | 287 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 287 insertions(+), 0 deletions(-)
---
diff --git a/7.3.880 b/7.3.880
new file mode 100644
index 0000000..14a9384
--- /dev/null
+++ b/7.3.880
@@ -0,0 +1,287 @@
+To: vim_dev at googlegroups.com
+Subject: Patch 7.3.880
+Fcc: outbox
+From: Bram Moolenaar <Bram at moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 7.3.880
+Problem: When writing viminfo, old history lines may replace lines written
+ more recently by another Vim instance.
+Solution: Mark history entries that were read from viminfo and overwrite
+ them when merging with the current viminfo.
+Files: src/ex_getln.c
+
+
+*** ../vim-7.3.879/src/ex_getln.c 2013-03-19 16:46:59.000000000 +0100
+--- src/ex_getln.c 2013-04-05 18:56:08.000000000 +0200
+***************
+*** 56,61 ****
+--- 56,62 ----
+ typedef struct hist_entry
+ {
+ int hisnum; /* identifying number */
++ int viminfo; /* when TRUE hisstr comes from viminfo */
+ char_u *hisstr; /* actual entry, separator char after the NUL */
+ } histentry_T;
+
+***************
+*** 113,118 ****
+--- 114,120 ----
+ static int ExpandRTDir __ARGS((char_u *pat, int *num_file, char_u ***file, char *dirname[]));
+ # ifdef FEAT_CMDHIST
+ static char_u *get_history_arg __ARGS((expand_T *xp, int idx));
++ static void clear_hist_entry __ARGS((histentry_T *hisptr));
+ # endif
+ # if defined(FEAT_USR_CMDS) && defined(FEAT_EVAL)
+ static int ExpandUserDefined __ARGS((expand_T *xp, regmatch_T *regmatch, int *num_file, char_u ***file));
+***************
+*** 5343,5352 ****
+ if (hisidx[type] < 0) /* there are no entries yet */
+ {
+ for (i = 0; i < newlen; ++i)
+! {
+! temp[i].hisnum = 0;
+! temp[i].hisstr = NULL;
+! }
+ }
+ else if (newlen > hislen) /* array becomes bigger */
+ {
+--- 5345,5351 ----
+ if (hisidx[type] < 0) /* there are no entries yet */
+ {
+ for (i = 0; i < newlen; ++i)
+! clear_hist_entry(&temp[i]);
+ }
+ else if (newlen > hislen) /* array becomes bigger */
+ {
+***************
+*** 5354,5363 ****
+ temp[i] = history[type][i];
+ j = i;
+ for ( ; i <= newlen - (hislen - hisidx[type]); ++i)
+! {
+! temp[i].hisnum = 0;
+! temp[i].hisstr = NULL;
+! }
+ for ( ; j < hislen; ++i, ++j)
+ temp[i] = history[type][j];
+ }
+--- 5353,5359 ----
+ temp[i] = history[type][i];
+ j = i;
+ for ( ; i <= newlen - (hislen - hisidx[type]); ++i)
+! clear_hist_entry(&temp[i]);
+ for ( ; j < hislen; ++i, ++j)
+ temp[i] = history[type][j];
+ }
+***************
+*** 5385,5390 ****
+--- 5381,5395 ----
+ }
+ }
+
++ static void
++ clear_hist_entry(hisptr)
++ histentry_T *hisptr;
++ {
++ hisptr->hisnum = 0;
++ hisptr->viminfo = FALSE;
++ hisptr->hisstr = NULL;
++ }
++
+ /*
+ * Check if command line 'str' is already in history.
+ * If 'move_to_front' is TRUE, matching entry is moved to end of history.
+***************
+*** 5433,5440 ****
+ history[type][last_i] = history[type][i];
+ last_i = i;
+ }
+- history[type][i].hisstr = str;
+ history[type][i].hisnum = ++hisnum[type];
+ return TRUE;
+ }
+ return FALSE;
+--- 5438,5446 ----
+ history[type][last_i] = history[type][i];
+ last_i = i;
+ }
+ history[type][i].hisnum = ++hisnum[type];
++ history[type][i].viminfo = FALSE;
++ history[type][i].hisstr = str;
+ return TRUE;
+ }
+ return FALSE;
+***************
+*** 5498,5505 ****
+ /* Current line is from the same mapping, remove it */
+ hisptr = &history[HIST_SEARCH][hisidx[HIST_SEARCH]];
+ vim_free(hisptr->hisstr);
+! hisptr->hisstr = NULL;
+! hisptr->hisnum = 0;
+ --hisnum[histype];
+ if (--hisidx[HIST_SEARCH] < 0)
+ hisidx[HIST_SEARCH] = hislen - 1;
+--- 5504,5510 ----
+ /* Current line is from the same mapping, remove it */
+ hisptr = &history[HIST_SEARCH][hisidx[HIST_SEARCH]];
+ vim_free(hisptr->hisstr);
+! clear_hist_entry(hisptr);
+ --hisnum[histype];
+ if (--hisidx[HIST_SEARCH] < 0)
+ hisidx[HIST_SEARCH] = hislen - 1;
+***************
+*** 5520,5525 ****
+--- 5525,5531 ----
+ hisptr->hisstr[len + 1] = sep;
+
+ hisptr->hisnum = ++hisnum[histype];
++ hisptr->viminfo = FALSE;
+ if (histype == HIST_SEARCH && in_map)
+ last_maptick = maptick;
+ }
+***************
+*** 5709,5716 ****
+ for (i = hislen; i--;)
+ {
+ vim_free(hisptr->hisstr);
+! hisptr->hisnum = 0;
+! hisptr++->hisstr = NULL;
+ }
+ hisidx[histype] = -1; /* mark history as cleared */
+ hisnum[histype] = 0; /* reset identifier counter */
+--- 5715,5721 ----
+ for (i = hislen; i--;)
+ {
+ vim_free(hisptr->hisstr);
+! clear_hist_entry(hisptr);
+ }
+ hisidx[histype] = -1; /* mark history as cleared */
+ hisnum[histype] = 0; /* reset identifier counter */
+***************
+*** 5755,5770 ****
+ {
+ found = TRUE;
+ vim_free(hisptr->hisstr);
+! hisptr->hisstr = NULL;
+! hisptr->hisnum = 0;
+ }
+ else
+ {
+ if (i != last)
+ {
+ history[histype][last] = *hisptr;
+! hisptr->hisstr = NULL;
+! hisptr->hisnum = 0;
+ }
+ if (--last < 0)
+ last += hislen;
+--- 5760,5773 ----
+ {
+ found = TRUE;
+ vim_free(hisptr->hisstr);
+! clear_hist_entry(hisptr);
+ }
+ else
+ {
+ if (i != last)
+ {
+ history[histype][last] = *hisptr;
+! clear_hist_entry(hisptr);
+ }
+ if (--last < 0)
+ last += hislen;
+***************
+*** 5808,5815 ****
+ history[histype][i] = history[histype][j];
+ i = j;
+ }
+! history[histype][i].hisstr = NULL;
+! history[histype][i].hisnum = 0;
+ if (--i < 0)
+ i += hislen;
+ hisidx[histype] = i;
+--- 5811,5817 ----
+ history[histype][i] = history[histype][j];
+ i = j;
+ }
+! clear_hist_entry(&history[histype][i]);
+ if (--i < 0)
+ i += hislen;
+ hisidx[histype] = i;
+***************
+*** 6043,6054 ****
+
+ for (type = 0; type < HIST_COUNT; ++type)
+ {
+! /*
+! * Count the number of empty spaces in the history list. If there are
+! * more spaces available than we request, then fill them up.
+! */
+ for (i = 0, num = 0; i < hislen; i++)
+! if (history[type][i].hisstr == NULL)
+ num++;
+ len = asklen;
+ if (num > len)
+--- 6045,6055 ----
+
+ for (type = 0; type < HIST_COUNT; ++type)
+ {
+! /* Count the number of empty spaces in the history list. Entries read
+! * from viminfo previously are also considered empty. If there are
+! * more spaces available than we request, then fill them up. */
+ for (i = 0, num = 0; i < hislen; i++)
+! if (history[type][i].hisstr == NULL || history[type][i].viminfo)
+ num++;
+ len = asklen;
+ if (num > len)
+***************
+*** 6141,6147 ****
+ hisidx[type] = hislen - 1;
+ do
+ {
+! if (history[type][idx].hisstr != NULL)
+ break;
+ if (++idx == hislen)
+ idx = 0;
+--- 6142,6149 ----
+ hisidx[type] = hislen - 1;
+ do
+ {
+! if (history[type][idx].hisstr != NULL
+! || history[type][idx].viminfo)
+ break;
+ if (++idx == hislen)
+ idx = 0;
+***************
+*** 6153,6158 ****
+--- 6155,6161 ----
+ {
+ vim_free(history[type][idx].hisstr);
+ history[type][idx].hisstr = viminfo_history[type][i];
++ history[type][idx].viminfo = TRUE;
+ if (--idx < 0)
+ idx = hislen - 1;
+ }
+*** ../vim-7.3.879/src/version.c 2013-04-05 17:43:10.000000000 +0200
+--- src/version.c 2013-04-05 18:54:11.000000000 +0200
+***************
+*** 730,731 ****
+--- 730,733 ----
+ { /* Add new patch number below this line */
++ /**/
++ 880,
+ /**/
+
+--
+hundred-and-one symptoms of being an internet addict:
+122. You ask if the Netaholics Anonymous t-shirt you ordered can be
+ sent to you via e-mail.
+
+ /// Bram Moolenaar -- Bram at 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 ///
More information about the scm-commits
mailing list