patch 9.2.0475: runtime(netrw): bookmark paths not normalized

Commit: 
https://github.com/vim/vim/commit/74019bea8c97077bfd66cd63dc0ffa279fd729ac
Author: J. Paulo Seibt <[email protected]>
Date:   Mon May 11 17:08:48 2026 +0000

    patch 9.2.0475: runtime(netrw): bookmark paths not normalized
    
    Problem:  the bookmarks list can have duplicate entries, more often
              in win32 (due to mixed slashes and capitalization) and when
              g:netrw_keepdir=0 (which could introduce relative paths).
              Duplicate entries could be: C:oo\BAR az.file
                                         c:oo ar az.file
                                         c:/foo\BAR/baz.file
                                         BAR/baz.file
    Solution: Normalize the paths and make sure they are always absolute
              (J. Paulo Seibt).
    
    closes: #20194
    
    Signed-off-by: J. Paulo Seibt <[email protected]>
    Signed-off-by: Christian Brabandt <[email protected]>

diff --git a/runtime/doc/pi_netrw.txt b/runtime/doc/pi_netrw.txt
index 2d98a8407..3f744bc8f 100644
--- a/runtime/doc/pi_netrw.txt
+++ b/runtime/doc/pi_netrw.txt
@@ -1142,6 +1142,8 @@ One may easily "bookmark" the currently browsed directory 
by using >
 
        mb
 <
+Note: Bookmarked paths are normalized and stored as absolute paths.
+
                                                                *.netrwbook*
 Bookmarks are retained in between sessions of vim in a file called .netrwbook
 as a |List|, which is typically stored in the first directory on the user's
diff --git a/runtime/pack/dist/opt/netrw/autoload/netrw.vim 
b/runtime/pack/dist/opt/netrw/autoload/netrw.vim
index 7d73af8fa..fbd396566 100644
--- a/runtime/pack/dist/opt/netrw/autoload/netrw.vim
+++ b/runtime/pack/dist/opt/netrw/autoload/netrw.vim
@@ -1,7 +1,7 @@
 " Creator:    Charles E Campbell
 " Previous Maintainer: Luca Saccarola <[email protected]>
 " Maintainer: This runtime file is looking for a new maintainer.
-" Last Change: 2026 May 10
+" Last Change: 2026 May 11
 " Copyright:  Copyright (C) 2016 Charles E. Campbell {{{1
 "             Permission is hereby granted to use and distribute this code,
 "             with or without modifications, provided that this copyright
@@ -8979,21 +8979,30 @@ function s:MakeSshCmd(sshcmd)
     return sshcmd
 endfunction
 
-" s:MakeBookmark: enters a bookmark into Netrw's bookmark system   {{{2
+" s:MakeBookmark: enters a bookmark into Netrw's bookmark system {{{2
+" Note that bookmark paths should always be absolute.
 function s:MakeBookmark(fname)
 
     if !exists("g:netrw_bookmarklist")
-        let g:netrw_bookmarklist= []
+        let g:netrw_bookmarklist = []
     endif
 
-    if index(g:netrw_bookmarklist,a:fname) == -1
-        " curdir not currently in g:netrw_bookmarklist, so include it
-        if isdirectory(s:NetrwFile(a:fname)) && a:fname !~ '/$'
-            " Directory without a trailing slash
-            call add(g:netrw_bookmarklist, s:NetrwFile(a:fname) . '/')
-        else
-            call add(g:netrw_bookmarklist, s:NetrwFile(a:fname))
-        endif
+    " Normalize path to prevent duplicate entries
+    let bookmark_path = netrw#fs#AbsPath(s:NetrwFile(a:fname))
+    let ignore_case = 0
+    if has('win32')
+        let bookmark_path = substitute(bookmark_path, '\', '/', 'ge')
+        let ignore_case = 1
+    endif
+    let bookmark_path = simplify(bookmark_path)
+
+    if isdirectory(bookmark_path) && bookmark_path !~ '/$'
+        let bookmark_path .= '/'
+    endif
+
+    if index(g:netrw_bookmarklist, bookmark_path, 0, ignore_case) == -1
+        " Not currently in the bookmarks list, so include it
+        call add(g:netrw_bookmarklist, bookmark_path)
         call sort(g:netrw_bookmarklist)
     endif
 
diff --git a/runtime/pack/dist/opt/netrw/doc/netrw.txt 
b/runtime/pack/dist/opt/netrw/doc/netrw.txt
index 144bab5fb..168deed34 100644
--- a/runtime/pack/dist/opt/netrw/doc/netrw.txt
+++ b/runtime/pack/dist/opt/netrw/doc/netrw.txt
@@ -1142,6 +1142,8 @@ One may easily "bookmark" the currently browsed directory 
by using >
 
        mb
 <
+Note: Bookmarked paths are normalized and stored as absolute paths.
+
                                                                *.netrwbook*
 Bookmarks are retained in between sessions of vim in a file called .netrwbook
 as a |List|, which is typically stored in the first directory on the user's
diff --git a/src/testdir/test_plugin_netrw.vim 
b/src/testdir/test_plugin_netrw.vim
index 5a86c29b7..c6bd589a4 100644
--- a/src/testdir/test_plugin_netrw.vim
+++ b/src/testdir/test_plugin_netrw.vim
@@ -692,7 +692,7 @@ func Test_netrw_bookmark_marked_file()
   " Make sure Vim's working directory diverge from Netrw's
   let g:netrw_keepdir = 1
   let g:netrw_bookmarklist = []
-  let test_workdir = 'Xtest_workdir'
+  let test_workdir = getcwd() . '/Xtest_workdir'
   let test_netrw_curdir = test_workdir . '/Xtest_netrw_curdir'
   call mkdir(test_netrw_curdir, 'p')
   call writefile([], test_netrw_curdir . '/test_file')
@@ -700,8 +700,16 @@ func Test_netrw_bookmark_marked_file()
   execute 'cd ' . test_workdir
   call Test_MakeBookmark(test_netrw_curdir, 'test_file')
 
+  " Bookmark paths should be absolute and normalized to prevent duplicates on 
win32
+  let expected_path = netrw#fs#AbsPath(test_netrw_curdir . '/test_file')
+  if has('win32')
+    let expected_path = substitute(expected_path, '\', '/', 'ge')
+  endif
+  let expected_path = simplify(expected_path)
+
   call assert_equal(1, len(g:netrw_bookmarklist))
-  call assert_match(test_netrw_curdir . '/test_file', g:netrw_bookmarklist[0])
+  call assert_equal(expected_path, g:netrw_bookmarklist[0])
+  call assert_true(isabsolutepath(g:netrw_bookmarklist[0]), 'Bookmark paths 
should be absolute')
 
   " Tear down
   execute 'cd ' . save_workdir
diff --git a/src/version.c b/src/version.c
index 9240b0995..9e794b7ed 100644
--- a/src/version.c
+++ b/src/version.c
@@ -729,6 +729,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    475,
 /**/
     474,
 /**/

-- 
-- 
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].
To view this discussion visit 
https://groups.google.com/d/msgid/vim_dev/E1wMUDh-00HML4-Sy%40256bit.org.

Raspunde prin e-mail lui