diff options
author | Ingo Karkat <swdev@ingo-karkat.de> | 2012-11-26 09:54:40 +0100 |
---|---|---|
committer | Ingo Karkat <swdev@ingo-karkat.de> | 2012-11-26 10:02:04 +0100 |
commit | 10afe7fc2610ebfa5279a140fcd4aead61033175 (patch) | |
tree | b582697454d9951a585cda108b5262b4079bc9ae | |
parent | 44b04871f812418ac0fe7b38e59222de118d07cb (diff) | |
download | vim-easytags-10afe7fc2610ebfa5279a140fcd4aead61033175.tar.gz |
FIX: Prevent cache corruption by moving before tags write.
A side effect of xolox#easytags#write_tagsfile() is that the entries argument is joined together. This then causes problems in s:cache_tagged_files_in(), where the filename element is addressed via entry[1]. When the entries have been flattened, this accesses a single character, and then the cache is corrupted.
To fix this, move the cache update before the writing of the tags file. This avoids the need to make a copy of the entries before flattening them.
-rw-r--r-- | autoload/xolox/easytags.vim | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/autoload/xolox/easytags.vim b/autoload/xolox/easytags.vim index 2088f48..9ddea30 100644 --- a/autoload/xolox/easytags.vim +++ b/autoload/xolox/easytags.vim @@ -246,15 +246,17 @@ function! s:filter_merge_tags(filter_tags, tagsfile, output, context) " {{{3 call filter(entries, join(filters, ' && ')) endif let num_filtered = num_old_entries - len(entries) - " Merge old/new tags and write tags file. + " Merge old/new tags. call extend(entries, a:output) + " We've already read the tags file, cache the tagged files before the entries + " get flattened by the write. + let fname = s:canonicalize(a:tagsfile, a:context) + call s:cache_tagged_files_in(fname, getftime(fname), entries, a:context) + " And write tags file. if !xolox#easytags#write_tagsfile(a:tagsfile, headers, entries) let msg = "Failed to write filtered tags file %s!" throw printf(msg, fnamemodify(a:tagsfile, ':~')) endif - " We've already read the tags file, might as well cache the tagged files :-) - let fname = s:canonicalize(a:tagsfile, a:context) - call s:cache_tagged_files_in(fname, getftime(fname), entries, a:context) return num_filtered endfunction |