Patch 8.1.0602
Problem:    DirChanged is also triggered when the directory didn't change.
            (Daniel Hahler)
Solution:   Compare the current with the new directory. (closes #3697)
Files:      src/ex_docmd.c, src/testdir/test_autocmd.vim, src/misc2.c,
            src/testdir/test_autochdir.vim


*** ../vim-8.1.0601/src/ex_docmd.c      2018-12-14 18:52:57.165528788 +0100
--- src/ex_docmd.c      2018-12-16 15:29:11.614092524 +0100
***************
*** 9126,9133 ****
      void
  ex_cd(exarg_T *eap)
  {
!     char_u            *new_dir;
!     char_u            *tofree;
  
      new_dir = eap->arg;
  #if !defined(UNIX) && !defined(VMS)
--- 9126,9134 ----
      void
  ex_cd(exarg_T *eap)
  {
!     char_u    *new_dir;
!     char_u    *tofree;
!     int               dir_differs;
  
      new_dir = eap->arg;
  #if !defined(UNIX) && !defined(VMS)
***************
*** 9183,9189 ****
            new_dir = NameBuff;
        }
  #endif
!       if (new_dir == NULL || vim_chdir(new_dir))
            EMSG(_(e_failed));
        else
        {
--- 9184,9192 ----
            new_dir = NameBuff;
        }
  #endif
!       dir_differs = new_dir == NULL || prev_dir == NULL
!                                            || STRCMP(prev_dir, new_dir) != 0;
!       if (new_dir == NULL || (dir_differs && vim_chdir(new_dir)))
            EMSG(_(e_failed));
        else
        {
***************
*** 9195,9203 ****
            /* Echo the new current directory if the command was typed. */
            if (KeyTyped || p_verbose >= 5)
                ex_pwd(eap);
!           apply_autocmds(EVENT_DIRCHANGED,
!                   is_local_chdir ? (char_u *)"window" : (char_u *)"global",
!                   new_dir, FALSE, curbuf);
        }
        vim_free(tofree);
      }
--- 9198,9208 ----
            /* Echo the new current directory if the command was typed. */
            if (KeyTyped || p_verbose >= 5)
                ex_pwd(eap);
! 
!           if (dir_differs)
!               apply_autocmds(EVENT_DIRCHANGED,
!                     is_local_chdir ? (char_u *)"window" : (char_u *)"global",
!                     new_dir, FALSE, curbuf);
        }
        vim_free(tofree);
      }
*** ../vim-8.1.0601/src/testdir/test_autocmd.vim        2018-08-08 
22:08:28.326846653 +0200
--- src/testdir/test_autocmd.vim        2018-12-16 15:06:01.850719909 +0100
***************
*** 1205,1217 ****
    augroup END
    let s:li = []
    let s:dir_this = getcwd()
!   let s:dir_other = s:dir_this . '/foo'
!   call mkdir(s:dir_other)
  endfunc
  
  function s:After_test_dirchanged()
    exe 'cd' s:dir_this
!   call delete(s:dir_other, 'd')
    augroup test_dirchanged
      autocmd!
    augroup END
--- 1205,1220 ----
    augroup END
    let s:li = []
    let s:dir_this = getcwd()
!   let s:dir_foo = s:dir_this . '/foo'
!   call mkdir(s:dir_foo)
!   let s:dir_bar = s:dir_this . '/bar'
!   call mkdir(s:dir_bar)
  endfunc
  
  function s:After_test_dirchanged()
    exe 'cd' s:dir_this
!   call delete(s:dir_foo, 'd')
!   call delete(s:dir_bar, 'd')
    augroup test_dirchanged
      autocmd!
    augroup END
***************
*** 1221,1230 ****
    call s:Before_test_dirchanged()
    autocmd test_dirchanged DirChanged global call add(s:li, "cd:")
    autocmd test_dirchanged DirChanged global call add(s:li, expand("<afile>"))
!   exe 'cd' s:dir_other
!   call assert_equal(["cd:", s:dir_other], s:li)
!   exe 'lcd' s:dir_other
!   call assert_equal(["cd:", s:dir_other], s:li)
    call s:After_test_dirchanged()
  endfunc
  
--- 1224,1235 ----
    call s:Before_test_dirchanged()
    autocmd test_dirchanged DirChanged global call add(s:li, "cd:")
    autocmd test_dirchanged DirChanged global call add(s:li, expand("<afile>"))
!   exe 'cd' s:dir_foo
!   call assert_equal(["cd:", s:dir_foo], s:li)
!   exe 'cd' s:dir_foo
!   call assert_equal(["cd:", s:dir_foo], s:li)
!   exe 'lcd' s:dir_bar
!   call assert_equal(["cd:", s:dir_foo], s:li)
    call s:After_test_dirchanged()
  endfunc
  
***************
*** 1232,1241 ****
    call s:Before_test_dirchanged()
    autocmd test_dirchanged DirChanged window call add(s:li, "lcd:")
    autocmd test_dirchanged DirChanged window call add(s:li, expand("<afile>"))
!   exe 'cd' s:dir_other
    call assert_equal([], s:li)
!   exe 'lcd' s:dir_other
!   call assert_equal(["lcd:", s:dir_other], s:li)
    call s:After_test_dirchanged()
  endfunc
  
--- 1237,1248 ----
    call s:Before_test_dirchanged()
    autocmd test_dirchanged DirChanged window call add(s:li, "lcd:")
    autocmd test_dirchanged DirChanged window call add(s:li, expand("<afile>"))
!   exe 'cd' s:dir_foo
    call assert_equal([], s:li)
!   exe 'lcd' s:dir_bar
!   call assert_equal(["lcd:", s:dir_bar], s:li)
!   exe 'lcd' s:dir_bar
!   call assert_equal(["lcd:", s:dir_bar], s:li)
    call s:After_test_dirchanged()
  endfunc
  
***************
*** 1250,1258 ****
    set acd
    exe 'cd ..'
    call assert_equal([], s:li)
!   exe 'edit ' . s:dir_other . '/Xfile'
!   call assert_equal(s:dir_other, getcwd())
!   call assert_equal(["auto:", s:dir_other], s:li)
    set noacd
    bwipe!
    call s:After_test_dirchanged()
--- 1257,1265 ----
    set acd
    exe 'cd ..'
    call assert_equal([], s:li)
!   exe 'edit ' . s:dir_foo . '/Xfile'
!   call assert_equal(s:dir_foo, getcwd())
!   call assert_equal(["auto:", s:dir_foo], s:li)
    set noacd
    bwipe!
    call s:After_test_dirchanged()
*** ../vim-8.1.0601/src/misc2.c 2018-12-14 21:31:58.012319694 +0100
--- src/misc2.c 2018-12-16 15:12:14.376386072 +0100
***************
*** 3390,3406 ****
   * Return OK or FAIL.
   */
      int
! vim_chdirfile(char_u *fname, char *trigger_autocmd UNUSED)
  {
!     char_u    dir[MAXPATHL];
      int               res;
  
!     vim_strncpy(dir, fname, MAXPATHL - 1);
!     *gettail_sep(dir) = NUL;
!     res = mch_chdir((char *)dir) == 0 ? OK : FAIL;
!     if (res == OK && trigger_autocmd != NULL)
!       apply_autocmds(EVENT_DIRCHANGED, (char_u *)trigger_autocmd,
!                                                          dir, FALSE, curbuf);
      return res;
  }
  #endif
--- 3390,3418 ----
   * Return OK or FAIL.
   */
      int
! vim_chdirfile(char_u *fname, char *trigger_autocmd)
  {
!     char_u    old_dir[MAXPATHL];
!     char_u    new_dir[MAXPATHL];
      int               res;
  
!     if (mch_dirname(old_dir, MAXPATHL) != OK)
!       *old_dir = NUL;
! 
!     vim_strncpy(new_dir, fname, MAXPATHL - 1);
!     *gettail_sep(new_dir) = NUL;
! 
!     if (STRCMP(old_dir, new_dir) == 0)
!       // nothing to do
!       res = OK;
!     else
!     {
!       res = mch_chdir((char *)new_dir) == 0 ? OK : FAIL;
! 
!       if (res == OK && trigger_autocmd != NULL)
!           apply_autocmds(EVENT_DIRCHANGED, (char_u *)trigger_autocmd,
!                                                      new_dir, FALSE, curbuf);
!     }
      return res;
  }
  #endif
*** ../vim-8.1.0601/src/testdir/test_autochdir.vim      2017-10-27 
00:47:53.000000000 +0200
--- src/testdir/test_autochdir.vim      2018-12-16 15:21:27.396965776 +0100
***************
*** 8,18 ****
--- 8,26 ----
    let cwd = getcwd()
    call test_autochdir()
    set acd
+ 
+   let s:li = []
+   autocmd DirChanged auto call add(s:li, "autocd")
+   autocmd DirChanged auto call add(s:li, expand("<afile>"))
+ 
    new
    w samples/Xtest
    call assert_equal("Xtest", expand('%'))
    call assert_equal("samples", substitute(getcwd(), '.*/\(\k*\)', '\1', ''))
+   call assert_equal(["autocd", getcwd()], s:li)
+ 
    bwipe!
+   au! DirChanged
    set noacd
    exe 'cd ' . cwd
    call delete('samples/Xtest')
*** ../vim-8.1.0601/src/version.c       2018-12-16 14:37:35.845271247 +0100
--- src/version.c       2018-12-16 15:37:07.343129132 +0100
***************
*** 801,802 ****
--- 801,804 ----
  {   /* Add new patch number below this line */
+ /**/
+     602,
  /**/

-- 
hundred-and-one symptoms of being an internet addict:
26. You check your mail. It says "no new messages." So you check it again.

 /// Bram Moolenaar -- [email protected] -- 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    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Raspunde prin e-mail lui