diff options
author | Richard Doty <richard.a.doty@gmail.com> | 2021-12-29 14:39:08 +0000 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2021-12-29 14:39:08 +0000 |
commit | 3d0abad5bf4fe125e219f1b56c4e8200cb900e2a (patch) | |
tree | f10f9bde115165002eb54daec16909c0b5ed2cfc /src | |
parent | 264d3ddac0f9474816c20a0e92014d6f7f4b08ac (diff) |
patch 8.2.3933: after ":cd" fails ":cd -" is incorrectv8.2.3933
Problem: After ":cd" fails ":cd -" is incorrect.
Solution: Set the previous directory only after successfully changing
directory. (Richard Doty, closes #9419, closes #8983)
Diffstat (limited to 'src')
-rw-r--r-- | src/ex_docmd.c | 30 | ||||
-rw-r--r-- | src/testdir/test_cd.vim | 7 | ||||
-rw-r--r-- | src/version.c | 2 |
3 files changed, 25 insertions, 14 deletions
diff --git a/src/ex_docmd.c b/src/ex_docmd.c index d4c725c6fc..8f4f4aea5e 100644 --- a/src/ex_docmd.c +++ b/src/ex_docmd.c @@ -7359,7 +7359,6 @@ changedir_func( int forceit, cdscope_T scope) { - char_u *tofree; char_u *pdir = NULL; int dir_differs; int retval = FALSE; @@ -7385,20 +7384,11 @@ changedir_func( new_dir = pdir; } - // Free the previous directory - tofree = get_prevdir(scope); - // Save current directory for next ":cd -" if (mch_dirname(NameBuff, MAXPATHL) == OK) pdir = vim_strsave(NameBuff); else pdir = NULL; - if (scope == CDSCOPE_WINDOW) - curwin->w_prevdir = pdir; - else if (scope == CDSCOPE_TABPAGE) - curtab->tp_prevdir = pdir; - else - prev_dir = pdir; // For UNIX ":cd" means: go to home directory. // On other systems too if 'cdhome' is set. @@ -7425,10 +7415,23 @@ changedir_func( dir_differs = new_dir == NULL || pdir == NULL || pathcmp((char *)pdir, (char *)new_dir, -1) != 0; if (new_dir == NULL || (dir_differs && vim_chdir(new_dir))) + { emsg(_(e_failed)); + vim_free(pdir); + } else { char_u *acmd_fname; + char_u **pp; + + if (scope == CDSCOPE_WINDOW) + pp = &curwin->w_prevdir; + else if (scope == CDSCOPE_TABPAGE) + pp = &curtab->tp_prevdir; + else + pp = &prev_dir; + vim_free(*pp); + *pp = pdir; post_chdir(scope); @@ -7445,7 +7448,6 @@ changedir_func( } retval = TRUE; } - vim_free(tofree); return retval; } @@ -7565,9 +7567,9 @@ do_sleep(long msec, int hide_cursor) # endif if (hide_cursor) - cursor_sleep(); + cursor_sleep(); else - cursor_on(); + cursor_on(); out_flush_cursor(FALSE, FALSE); while (!got_int && done < msec) @@ -7619,7 +7621,7 @@ do_sleep(long msec, int hide_cursor) (void)vpeekc(); if (hide_cursor) - cursor_unsleep(); + cursor_unsleep(); } /* diff --git a/src/testdir/test_cd.vim b/src/testdir/test_cd.vim index 566e9f6ba6..c2217c944b 100644 --- a/src/testdir/test_cd.vim +++ b/src/testdir/test_cd.vim @@ -44,6 +44,13 @@ func Test_cd_minus() cd - call assert_equal(path, getcwd()) + " Test for :cd - after a failed :cd + call assert_fails('cd /nonexistent', 'E344:') + call assert_equal(path, getcwd()) + cd - + call assert_equal(path_dotdot, getcwd()) + cd - + " Test for :cd - without a previous directory let lines =<< trim [SCRIPT] call assert_fails('cd -', 'E186:') diff --git a/src/version.c b/src/version.c index bbfa0ffa99..2b1ce02d50 100644 --- a/src/version.c +++ b/src/version.c @@ -750,6 +750,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 3933, +/**/ 3932, /**/ 3931, |