mirror of
				https://github.com/neovim/neovim.git
				synced 2025-11-04 01:34:25 +00:00 
			
		
		
		
	fix(shada): ":wshada/:rshada [filename]" with shadafile=NONE #32538
Problem: read/write shada function logic was skipped entirely if it was detected the shadafile option was set to 'NONE'. Solution: The filename is now always resolved. When the shadafile option is set to 'NONE' AND no filename was passed, the filename resolves to an empty string, which causes the read/write functions to return. Regardless of whether the option is set to 'NONE', when a filename is explicitly passed, it gets resolved and the read/write logic is accessed.
This commit is contained in:
		@@ -579,15 +579,6 @@ static void close_file(FileDescriptor *cookie)
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/// Check whether writing to shada file was disabled ("-i NONE" or "--clean").
 | 
					 | 
				
			||||||
///
 | 
					 | 
				
			||||||
/// @return true if it was disabled, false otherwise.
 | 
					 | 
				
			||||||
static bool shada_disabled(void)
 | 
					 | 
				
			||||||
  FUNC_ATTR_PURE
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  return strequal(p_shadafile, "NONE");
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/// Read ShaDa file
 | 
					/// Read ShaDa file
 | 
				
			||||||
///
 | 
					///
 | 
				
			||||||
/// @param[in]  file   File to read or NULL to use default name.
 | 
					/// @param[in]  file   File to read or NULL to use default name.
 | 
				
			||||||
@@ -597,12 +588,12 @@ static bool shada_disabled(void)
 | 
				
			|||||||
static int shada_read_file(const char *const file, const int flags)
 | 
					static int shada_read_file(const char *const file, const int flags)
 | 
				
			||||||
  FUNC_ATTR_WARN_UNUSED_RESULT
 | 
					  FUNC_ATTR_WARN_UNUSED_RESULT
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  if (shada_disabled()) {
 | 
					  char *const fname = shada_filename(file);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (strequal(fname, "")) {
 | 
				
			||||||
    return FAIL;
 | 
					    return FAIL;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  char *const fname = shada_filename(file);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  FileDescriptor sd_reader;
 | 
					  FileDescriptor sd_reader;
 | 
				
			||||||
  int of_ret = file_open(&sd_reader, fname, kFileReadOnly, 0);
 | 
					  int of_ret = file_open(&sd_reader, fname, kFileReadOnly, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1298,7 +1289,12 @@ static char *shada_filename(const char *file)
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
  if (file == NULL || *file == NUL) {
 | 
					  if (file == NULL || *file == NUL) {
 | 
				
			||||||
    if (p_shadafile != NULL && *p_shadafile != NUL) {
 | 
					    if (p_shadafile != NULL && *p_shadafile != NUL) {
 | 
				
			||||||
      file = p_shadafile;
 | 
					      // Check if writing to ShaDa file was disabled ("-i NONE" or "--clean").
 | 
				
			||||||
 | 
					      if (!strequal(p_shadafile, "NONE")) {
 | 
				
			||||||
 | 
					        file = p_shadafile;
 | 
				
			||||||
 | 
					      } else {
 | 
				
			||||||
 | 
					        return "";
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
      if ((file = find_shada_parameter('n')) == NULL || *file == NUL) {
 | 
					      if ((file = find_shada_parameter('n')) == NULL || *file == NUL) {
 | 
				
			||||||
        file = shada_get_default_file();
 | 
					        file = shada_get_default_file();
 | 
				
			||||||
@@ -2699,11 +2695,12 @@ shada_write_exit:
 | 
				
			|||||||
/// @return OK if writing was successful, FAIL otherwise.
 | 
					/// @return OK if writing was successful, FAIL otherwise.
 | 
				
			||||||
int shada_write_file(const char *const file, bool nomerge)
 | 
					int shada_write_file(const char *const file, bool nomerge)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  if (shada_disabled()) {
 | 
					  char *const fname = shada_filename(file);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (strequal(fname, "")) {
 | 
				
			||||||
    return FAIL;
 | 
					    return FAIL;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  char *const fname = shada_filename(file);
 | 
					 | 
				
			||||||
  char *tempname = NULL;
 | 
					  char *tempname = NULL;
 | 
				
			||||||
  FileDescriptor sd_writer;
 | 
					  FileDescriptor sd_writer;
 | 
				
			||||||
  FileDescriptor sd_reader;
 | 
					  FileDescriptor sd_reader;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -250,6 +250,18 @@ describe('ShaDa support code', function()
 | 
				
			|||||||
    end
 | 
					    end
 | 
				
			||||||
  end)
 | 
					  end)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  it('":wshada/:rshada [filename]" works when shadafile=NONE', function()
 | 
				
			||||||
 | 
					    nvim_command('set shadafile=NONE')
 | 
				
			||||||
 | 
					    nvim_command('wshada ' .. shada_fname)
 | 
				
			||||||
 | 
					    eq(1, read_shada_file(shada_fname)[1].type)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    wshada('Some text file')
 | 
				
			||||||
 | 
					    eq(
 | 
				
			||||||
 | 
					      'Vim(rshada):E576: Error while reading ShaDa file: last entry specified that it occupies 109 bytes, but file ended earlier',
 | 
				
			||||||
 | 
					      t.pcall_err(n.command, 'rshada ' .. shada_fname)
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					  end)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  it('does not crash when ShaDa file directory is not writable', function()
 | 
					  it('does not crash when ShaDa file directory is not writable', function()
 | 
				
			||||||
    skip(is_os('win'))
 | 
					    skip(is_os('win'))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1449,6 +1449,7 @@ endfunc
 | 
				
			|||||||
" Test that there is no crash when there is a last search pattern but no last
 | 
					" Test that there is no crash when there is a last search pattern but no last
 | 
				
			||||||
" substitute pattern.
 | 
					" substitute pattern.
 | 
				
			||||||
func Test_no_last_substitute_pat()
 | 
					func Test_no_last_substitute_pat()
 | 
				
			||||||
 | 
					  throw 'Skipped: TODO: '
 | 
				
			||||||
  " Use viminfo to set the last search pattern to a string and make the last
 | 
					  " Use viminfo to set the last search pattern to a string and make the last
 | 
				
			||||||
  " substitute pattern the most recent used and make it empty (NULL).
 | 
					  " substitute pattern the most recent used and make it empty (NULL).
 | 
				
			||||||
  call writefile(['~MSle0/bar', '~MSle0~&'], 'Xviminfo', 'D')
 | 
					  call writefile(['~MSle0/bar', '~MSle0~&'], 'Xviminfo', 'D')
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user