Created attachment 158617 [details] normal dir SUMMARY 1. When cutting a file from a symlinked directory, Dolphin doesn't gray out the file icon to indicate it's cut. 2. When pasting that file elsewhere, it's still visible in the original directory, until manually refresh. STEPS TO REPRODUCE 1. cd ~/tmp; mkdir dir1; touch dir1/{a,b}.txt; ln -s dir1 dir_s ///// Normal dir, expected result 2. Open Dolphin and go to ~/tmp/dir1 3. Select a.txt and press C-x. 4. Notice the file icon is grayed out. 5. Go to ~/Desktop and press C-v. 6. Go back to ~/tmp/dir1. Notice a.txt is gone. ///// Symlinked dir, the bug 7. Go to ~/tmp/dir_s. 8. Select b.txt and press C-x. 9. Notice the file icon is not grayed out. 10. Go to ~/Desktop and press C-v. 11. Go back to ~/tmp/dir_s. Notice b.txt is still there. 12. Press F5. b.txt is gone. The bug is still present with the latest kio/kf5 and dolphin/master, so I believe it's different from https://bugs.kde.org/show_bug.cgi?id=387663 SOFTWARE/OS VERSIONS Linux/KDE Plasma: (available in About System) KDE Plasma Version: 5.27.4 KDE Frameworks Version: 5.105 KDE Gears Version: 23.04 Qt Version: 5.15.9
Created attachment 158618 [details] symlinked dir
I believe this bug is new in Dolphin 23.04.
And output from: QT_LOGGING_RULES="kf5.kcoreaddons.kdirwatch.debug=true;kf.kio.core.dirlister.debug=true" dolphin kf.kio.core.dirlister: +KCoreDirLister kf.kio.core.dirlister: kf.kio.core: Malformed JSON protocol file for protocol: "trash" , number of the ExtraNames fields should match the number of ExtraTypes fields kf.kio.core.dirlister: KCoreDirLister(0x55a9cd989b40) url= QUrl("tags:/") keep= false reload= true kf.kio.core.dirlister: lister: KCoreDirLister(0x55a9cd989b40) silent= true kf.kio.core.dirlister: KCoreDirLister(0x55a9cd989b40) kf.kio.core.dirlister: Iterating over dirs () kf.kio.core.dirlister: Reloading directory: QUrl("tags:/") kf.kio.core.dirlister: Entry now being listed by (KCoreDirLister(0x55a9cd989b40)) kf.kio.core.dirlister: +KCoreDirLister kf.kio.core.dirlister: KDirLister(0x55a9cda7fc30) url= QUrl("trash:/") keep= false reload= false kf.kio.core.dirlister: lister: KDirLister(0x55a9cda7fc30) silent= true kf.kio.core.dirlister: KDirLister(0x55a9cda7fc30) kf.kio.core.dirlister: Iterating over dirs () kf.kio.core.dirlister: Listing directory: QUrl("trash:/") kf.kio.core.dirlister: Entry now being listed by (KDirLister(0x55a9cda7fc30)) kf.kio.core.dirlister: +KCoreDirLister kf.kio.core.dirlister: KDirLister(0x55a9ce0d1430) url= QUrl("file:///home/jin") keep= false reload= false kf.kio.core.dirlister: lister: KDirLister(0x55a9ce0d1430) silent= true kf.kio.core.dirlister: KDirLister(0x55a9ce0d1430) kf.kio.core.dirlister: Iterating over dirs () kf.kio.core.dirlister: Listing directory: QUrl("file:///home/jin") kf.kio.core.dirlister: Entry now being listed by (KDirLister(0x55a9ce0d1430)) kf.kio.core.dirlister: +KCoreDirLister kf.kio.core.dirlister: KCoreDirLister(0x55a9ce19a288) url= QUrl("tags:/") keep= false reload= true kf.kio.core.dirlister: lister: KCoreDirLister(0x55a9ce19a288) silent= true kf.kio.core.dirlister: KCoreDirLister(0x55a9ce19a288) kf.kio.core.dirlister: Iterating over dirs () kf.kio.core.dirlister: Entry currently being listed: QUrl("tags:/") by (KCoreDirLister(0x55a9cd989b40)) kf.kio.core.dirlister: Listing 0 cached items soon kf.kio.core.dirlister: Creating CachedItemsJob KCoreDirListerPrivate::CachedItemsJob(0x55a9ce1a2a60) for lister KCoreDirLister(0x55a9ce19a288) QUrl("tags:/") kf.kio.core.dirlister: KCoreDirLister(0x55a9ce19a288) url= QUrl("tags:/") keep= false reload= true kf.kio.core.dirlister: lister: KCoreDirLister(0x55a9ce19a288) silent= true kf.kio.core.dirlister: KCoreDirListerPrivate::CachedItemsJob(0x55a9ce1a2a60) kf.kio.core.dirlister: Still having a listjob KIO::ListJob(0x55a9cd97db90) , so not moving to currently-holding. kf.kio.core.dirlister: KCoreDirLister(0x55a9ce19a288) url= QUrl("tags:/") kf.kio.core.dirlister: found lister KCoreDirLister(0x55a9ce19a288) in list - for QUrl("tags:/") kf.kio.core.dirlister: KCoreDirLister(0x55a9ce19a288) kf.kio.core.dirlister: Iterating over dirs (QUrl("tags:/")) kf.kio.core.dirlister: KCoreDirLister(0x55a9ce19a288) _url: QUrl("tags:/") kf.kio.core.dirlister: Entry currently being listed: QUrl("tags:/") by (KCoreDirLister(0x55a9cd989b40)) kf.kio.core.dirlister: Listing 0 cached items soon kf.kio.core.dirlister: Creating CachedItemsJob KCoreDirListerPrivate::CachedItemsJob(0x55a9ce1a44e0) for lister KCoreDirLister(0x55a9ce19a288) QUrl("tags:/") kf.kio.core.dirlister: KCoreDirLister(0x55a9ce19a288) url= QUrl("tags:/") keep= false reload= true kf.kio.core.dirlister: lister: KCoreDirLister(0x55a9ce19a288) silent= true kf.kio.core.dirlister: KCoreDirListerPrivate::CachedItemsJob(0x55a9ce1a44e0) kf.kio.core.dirlister: Still having a listjob KIO::ListJob(0x55a9cd97db90) , so not moving to currently-holding. kf.kio.core.dirlister: KCoreDirLister(0x55a9ce19a288) url= QUrl("tags:/") kf.kio.core.dirlister: found lister KCoreDirLister(0x55a9ce19a288) in list - for QUrl("tags:/") kf.kio.core.dirlister: KCoreDirLister(0x55a9ce19a288) kf.kio.core.dirlister: Iterating over dirs (QUrl("tags:/")) kf.kio.core.dirlister: KCoreDirLister(0x55a9ce19a288) _url: QUrl("tags:/") kf.kio.core.dirlister: Entry currently being listed: QUrl("tags:/") by (KCoreDirLister(0x55a9cd989b40)) kf.kio.core.dirlister: Listing 0 cached items soon kf.kio.core.dirlister: Creating CachedItemsJob KCoreDirListerPrivate::CachedItemsJob(0x55a9ce1b84b0) for lister KCoreDirLister(0x55a9ce19a288) QUrl("tags:/") kf.kio.core.dirlister: KDirLister(0x55a9ce0d1430) url= QUrl("file:///home/jin/tmp") keep= false reload= false kf.kio.core.dirlister: lister: KDirLister(0x55a9ce0d1430) silent= true kf.kio.core.dirlister: KDirLister(0x55a9ce0d1430) url= QUrl("file:///home/jin") kf.kio.core.dirlister: found lister KDirLister(0x55a9ce0d1430) in list - for QUrl("file:///home/jin") kf.kio.core.dirlister: Killing list job KIO::ListJob(0x55a9ce17f680) for QUrl("file:///home/jin") kf.kio.core.dirlister: finished listing QUrl("file:///home/jin") kf.kio.core.dirlister: KDirLister(0x55a9ce0d1430) kf.kio.core.dirlister: Iterating over dirs (QUrl("file:///home/jin")) kf.kio.core.dirlister: KDirLister(0x55a9ce0d1430) _url: QUrl("file:///home/jin") kf.kio.core.dirlister: Listing directory: QUrl("file:///home/jin/tmp") kf.kio.core.dirlister: Entry now being listed by (KDirLister(0x55a9ce0d1430)) kf.kio.core.dirlister: Still having a listjob KIO::ListJob(0x55a9cd97db90) , so not moving to currently-holding. kf.kio.workers.trash: Directory "/mnt/shared/.Trash-1000" exists but didn't pass the security checks, can't use it kf.kio.core.dirlister: new entries for QUrl("tags:/") kf.kio.core.dirlister: finished listing QUrl("tags:/") kf.kio.core.dirlister: new entries for QUrl("trash:/") kf.kio.core.dirlister: Adding item: QUrl("trash:/0-a.txt (1)") kf.kio.core.dirlister: Adding item: QUrl("trash:/0-a.txt") kf.kio.core.dirlister: Adding item: QUrl("trash:/0-b.txt") kf.kio.core.dirlister: Adding item: QUrl("trash:/0-dir1 (1)") kf.kio.core.dirlister: Adding item: QUrl("trash:/0-dir1") kf.kio.core.dirlister: Adding item: QUrl("trash:/0-dir_s (1)") kf.kio.core.dirlister: Adding item: QUrl("trash:/0-dir_s") kf.kio.core.dirlister: Adding item: QUrl("trash:/0-Screenshot_20230502_162014.jpg") kf.kio.core.dirlister: Adding item: QUrl("trash:/0-Screenshot_20230502_162018.jpg") kf.kio.core.dirlister: Adding item: QUrl("trash:/0-Screenshot_20230502_162042.jpg") kf.kio.core.dirlister: Adding item: QUrl("trash:/0-subdir") kf.kio.core.dirlister: in QUrl("trash:/") item: QUrl("trash:/0-Screenshot_20230502_162014.jpg") kf.kio.core.dirlister: in QUrl("trash:/") item: QUrl("trash:/0-Screenshot_20230502_162018.jpg") kf.kio.core.dirlister: in QUrl("trash:/") item: QUrl("trash:/0-Screenshot_20230502_162042.jpg") kf.kio.core.dirlister: in QUrl("trash:/") item: QUrl("trash:/0-a.txt") kf.kio.core.dirlister: in QUrl("trash:/") item: QUrl("trash:/0-a.txt (1)") kf.kio.core.dirlister: in QUrl("trash:/") item: QUrl("trash:/0-b.txt") kf.kio.core.dirlister: in QUrl("trash:/") item: QUrl("trash:/0-dir1") kf.kio.core.dirlister: in QUrl("trash:/") item: QUrl("trash:/0-dir1 (1)") kf.kio.core.dirlister: in QUrl("trash:/") item: QUrl("trash:/0-dir_s") kf.kio.core.dirlister: in QUrl("trash:/") item: QUrl("trash:/0-dir_s (1)") kf.kio.core.dirlister: in QUrl("trash:/") item: QUrl("trash:/0-subdir") kf.kio.core.dirlister: new entries for QUrl("file:///home/jin/tmp") kf.kio.core.dirlister: Adding item: QUrl("file:///home/jin/tmp/dir1") kf.kio.core.dirlister: Adding item: QUrl("file:///home/jin/tmp/dir_s") kf.kio.core.dirlister: in QUrl("file:///home/jin/tmp") item: QUrl("file:///home/jin/tmp/dir1") kf.kio.core.dirlister: in QUrl("file:///home/jin/tmp") item: QUrl("file:///home/jin/tmp/dir_s") kf.kio.core.dirlister: finished listing QUrl("trash:/") kf.kio.core.dirlister: finished listing QUrl("file:///home/jin/tmp") kf.kio.core.dirlister: KDirLister(0x55a9ce0d1430) url= QUrl("file:///home/jin/tmp/dir_s") keep= false reload= false kf.kio.core.dirlister: lister: KDirLister(0x55a9ce0d1430) silent= true kf.kio.core.dirlister: KDirLister(0x55a9ce0d1430) url= QUrl("file:///home/jin/tmp") kf.kio.core.dirlister: KDirLister(0x55a9ce0d1430) kf.kio.core.dirlister: Iterating over dirs (QUrl("file:///home/jin/tmp")) kf.kio.core.dirlister: KDirLister(0x55a9ce0d1430) _url: QUrl("file:///home/jin/tmp") kf.kio.core.dirlister: KDirLister(0x55a9ce0d1430) item moved into cache: QUrl("file:///home/jin/tmp") kf.kio.core.dirlister: Listing directory: QUrl("file:///home/jin/tmp/dir_s") kf.kio.core.dirlister: Entry now being listed by (KDirLister(0x55a9ce0d1430)) kf.kio.core.dirlister: new entries for QUrl("file:///home/jin/tmp/dir_s") kf.kio.core.dirlister: Adding item: QUrl("file:///home/jin/tmp/dir_s/b.txt") kf.kio.core.dirlister: Adding item: QUrl("file:///home/jin/tmp/dir_s/a.txt") kf.kio.core.dirlister: in QUrl("file:///home/jin/tmp/dir_s") item: QUrl("file:///home/jin/tmp/dir_s/a.txt") kf.kio.core.dirlister: in QUrl("file:///home/jin/tmp/dir_s") item: QUrl("file:///home/jin/tmp/dir_s/b.txt") kf.kio.core.dirlister: finished listing QUrl("file:///home/jin/tmp/dir_s") kf.kio.core.dirlister: KDirLister(0x55a9ce0d1430) url= QUrl("file:///home/jin/Desktop") keep= false reload= false kf.kio.core.dirlister: lister: KDirLister(0x55a9ce0d1430) silent= true kf.kio.core.dirlister: KDirLister(0x55a9ce0d1430) url= QUrl("file:///home/jin/tmp/dir_s") kf.kio.core.dirlister: KDirLister(0x55a9ce0d1430) kf.kio.core.dirlister: Iterating over dirs (QUrl("file:///home/jin/tmp/dir_s")) kf.kio.core.dirlister: KDirLister(0x55a9ce0d1430) _url: QUrl("file:///home/jin/tmp/dir_s") kf.kio.core.dirlister: KDirLister(0x55a9ce0d1430) item moved into cache: QUrl("file:///home/jin/tmp/dir_s") kf.kio.core.dirlister: Listing directory: QUrl("file:///home/jin/Desktop") kf.kio.core.dirlister: Entry now being listed by (KDirLister(0x55a9ce0d1430)) kf.kio.core.dirlister: new entries for QUrl("file:///home/jin/Desktop") kf.kio.core.dirlister: Adding item: QUrl("file:///home/jin/Desktop/b.txt") kf.kio.core.dirlister: Adding item: QUrl("file:///home/jin/Desktop/.directory") kf.kio.core.dirlister: Adding item: QUrl("file:///home/jin/Desktop/a.txt") kf.kio.core.dirlister: in QUrl("file:///home/jin/Desktop") item: QUrl("file:///home/jin/Desktop/a.txt") kf.kio.core.dirlister: in QUrl("file:///home/jin/Desktop") item: QUrl("file:///home/jin/Desktop/b.txt") kf.kio.core.dirlister: finished listing QUrl("file:///home/jin/Desktop") kf.kio.core.dirlister: QUrl("file:///home/jin/Desktop") kf.kio.core.dirlister: QUrl("file:///home/jin/Desktop") kf.kio.core.dirlister: QUrl("file:///home/jin/Desktop") listers= () holders= (KDirLister(0x55a9ce0d1430)) kf.kio.core.dirlister: Killed= false kf.kio.core.dirlister: update started in QUrl("file:///home/jin/Desktop") kf.kio.core.dirlister: 1 kf.kio.core.dirlister: QUrl("file:///home/jin/tmp/dir1") known as (QUrl("file:///home/jin/tmp/dir1"), QUrl("file:///home/jin/tmp/dir_s")) kf.kio.core.dirlister: 3 kf.kio.core.dirlister: finished update QUrl("file:///home/jin/Desktop") kf.kio.core.dirlister: file changed: "a.txt" kf.kio.core.dirlister: "/home/jin/Desktop" kf.kio.core.dirlister: aborted, directory QUrl("file:///home/jin") not in cache. kf.kio.core.dirlister: "/home/jin/Desktop/a.txt" kf.kio.core.dirlister: "/home/jin/Desktop" kf.kio.core.dirlister: had pending update "/home/jin/Desktop/a.txt" kf.kio.core.dirlister: forgetting about individual update to "/home/jin/Desktop/a.txt" kf.kio.core.dirlister: aborted, directory QUrl("file:///home/jin") not in cache. kf.kio.core.dirlister: QUrl("file:///home/jin/Desktop") kf.kio.core.dirlister: QUrl("file:///home/jin/Desktop") listers= () holders= (KDirLister(0x55a9ce0d1430)) kf.kio.core.dirlister: Killed= false kf.kio.core.dirlister: update started in QUrl("file:///home/jin/Desktop") kf.kio.core.dirlister: finished update QUrl("file:///home/jin/Desktop") kf.kio.core.dirlister: KDirLister(0x55a9ce0d1430) url= QUrl("file:///home/jin/tmp/dir_s") keep= false reload= false kf.kio.core.dirlister: lister: KDirLister(0x55a9ce0d1430) silent= true kf.kio.core.dirlister: KDirLister(0x55a9ce0d1430) url= QUrl("file:///home/jin/Desktop") kf.kio.core.dirlister: KDirLister(0x55a9ce0d1430) kf.kio.core.dirlister: Iterating over dirs (QUrl("file:///home/jin/Desktop")) kf.kio.core.dirlister: KDirLister(0x55a9ce0d1430) _url: QUrl("file:///home/jin/Desktop") kf.kio.core.dirlister: KDirLister(0x55a9ce0d1430) item moved into cache: QUrl("file:///home/jin/Desktop") kf.kio.core.dirlister: Entry in cache: QUrl("file:///home/jin/tmp/dir_s") kf.kio.core.dirlister: Creating CachedItemsJob KCoreDirListerPrivate::CachedItemsJob(0x55a9ce3bc0c0) for lister KDirLister(0x55a9ce0d1430) QUrl("file:///home/jin/tmp/dir_s") kf.kio.core.dirlister: emitting 2 for lister KDirLister(0x55a9ce0d1430) kf.kio.core.dirlister: in QUrl("file:///home/jin/tmp/dir_s") item: QUrl("file:///home/jin/tmp/dir_s/a.txt") kf.kio.core.dirlister: in QUrl("file:///home/jin/tmp/dir_s") item: QUrl("file:///home/jin/tmp/dir_s/b.txt") kf.kio.core.dirlister: Moving from listing to holding, because no more job KDirLister(0x55a9ce0d1430) QUrl("file:///home/jin/tmp/dir_s") kf.kio.core.dirlister: ~KCoreDirLister KCoreDirLister(0x55a9ce19a288) kf.kio.core.dirlister: lister: KCoreDirLister(0x55a9ce19a288) silent= false kf.kio.core.dirlister: KCoreDirLister(0x55a9ce19a288) url= QUrl("tags:/") kf.kio.core.dirlister: KCoreDirLister(0x55a9ce19a288) kf.kio.core.dirlister: Iterating over dirs (QUrl("tags:/")) kf.kio.core.dirlister: KCoreDirLister(0x55a9ce19a288) _url: QUrl("tags:/") kf.kio.core.dirlister: ~KCoreDirLister KCoreDirLister(0x55a9ce0d1430) kf.kio.core.dirlister: lister: KCoreDirLister(0x55a9ce0d1430) silent= false kf.kio.core.dirlister: KCoreDirLister(0x55a9ce0d1430) url= QUrl("file:///home/jin/tmp/dir_s") kf.kio.core.dirlister: KCoreDirLister(0x55a9ce0d1430) kf.kio.core.dirlister: Iterating over dirs (QUrl("file:///home/jin/tmp/dir_s")) kf.kio.core.dirlister: KCoreDirLister(0x55a9ce0d1430) _url: QUrl("file:///home/jin/tmp/dir_s") kf.kio.core.dirlister: KCoreDirLister(0x55a9ce0d1430) item moved into cache: QUrl("file:///home/jin/tmp/dir_s") kf.kio.core.dirlister: ~KCoreDirLister KCoreDirLister(0x55a9cd989b40) kf.kio.core.dirlister: lister: KCoreDirLister(0x55a9cd989b40) silent= false kf.kio.core.dirlister: KCoreDirLister(0x55a9cd989b40) url= QUrl("tags:/") kf.kio.core.dirlister: KCoreDirLister(0x55a9cd989b40) kf.kio.core.dirlister: Iterating over dirs (QUrl("tags:/")) kf.kio.core.dirlister: KCoreDirLister(0x55a9cd989b40) _url: QUrl("tags:/") kf.kio.core.dirlister: KCoreDirLister(0x55a9cd989b40) item moved into cache: QUrl("tags:/") kf.kio.core.dirlister: ~KCoreDirLister KCoreDirLister(0x55a9cda7fc30) kf.kio.core.dirlister: lister: KCoreDirLister(0x55a9cda7fc30) silent= false kf.kio.core.dirlister: KCoreDirLister(0x55a9cda7fc30) url= QUrl("trash:/") kf.kio.core.dirlister: KCoreDirLister(0x55a9cda7fc30) kf.kio.core.dirlister: Iterating over dirs (QUrl("trash:/")) kf.kio.core.dirlister: KCoreDirLister(0x55a9cda7fc30) _url: QUrl("trash:/") kf.kio.core.dirlister: KCoreDirLister(0x55a9cda7fc30) item moved into cache: QUrl("trash:/") kf.kio.core.dirlister:
A possibly relevant merge request was started @ https://invent.kde.org/frameworks/kio/-/merge_requests/1285
*** Bug 463184 has been marked as a duplicate of this bug. ***
Git commit dbf5af9393a9dc3026d255dac4fb3535e1557bdb by Méven Car, on behalf of Méven Car. Committed on 19/05/2023 at 12:09. Pushed by meven into branch 'master'. KdirLister: update symlink dir content on file removal When looking for the item in lstItems, we already know the path of url is contained within the dir examined. M +18 -3 autotests/kdirlistertest.cpp M +1 -4 src/core/kcoredirlister.cpp https://invent.kde.org/frameworks/kio/commit/dbf5af9393a9dc3026d255dac4fb3535e1557bdb
Git commit 1e81a0aa82cf7df184a7011acbb20c4ec16a64a5 by Méven Car. Committed on 19/05/2023 at 13:01. Pushed by meven into branch 'kf5'. KdirLister: update symlink dir content on file removal When looking for the item in lstItems, we already know the path of url is contained within the dir examined. (cherry picked from commit dbf5af9393a9dc3026d255dac4fb3535e1557bdb) M +18 -3 autotests/kdirlistertest.cpp M +1 -4 src/core/kcoredirlister.cpp https://invent.kde.org/frameworks/kio/commit/1e81a0aa82cf7df184a7011acbb20c4ec16a64a5
*** Bug 470881 has been marked as a duplicate of this bug. ***
*** Bug 469324 has been marked as a duplicate of this bug. ***