patch 8.1.0602: DirChanged is also triggered when directory didn't change
Problem: DirChanged is also triggered when the directory didn't change.
(Daniel Hahler)
Solution: Compare the current with the new directory. (closes #3697)
diff --git a/src/misc2.c b/src/misc2.c
index fbf8a08..4e3b845 100644
--- a/src/misc2.c
+++ b/src/misc2.c
@@ -3390,17 +3390,29 @@
* Return OK or FAIL.
*/
int
-vim_chdirfile(char_u *fname, char *trigger_autocmd UNUSED)
+vim_chdirfile(char_u *fname, char *trigger_autocmd)
{
- char_u dir[MAXPATHL];
+ char_u old_dir[MAXPATHL];
+ char_u new_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);
+ 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