fix: respect URL covariance when updating mimetypes (#3079)

This commit is contained in:
三咲雅 misaki masa 2025-08-18 23:20:03 +08:00 committed by GitHub
parent a41931275c
commit fe9ce240b5
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
14 changed files with 94 additions and 113 deletions

102
Cargo.lock generated
View file

@ -136,9 +136,9 @@ dependencies = [
[[package]] [[package]]
name = "arbitrary" name = "arbitrary"
version = "1.4.1" version = "1.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223" checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1"
[[package]] [[package]]
name = "arc-swap" name = "arc-swap"
@ -194,9 +194,9 @@ dependencies = [
[[package]] [[package]]
name = "avif-serialize" name = "avif-serialize"
version = "0.8.5" version = "0.8.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2ea8ef51aced2b9191c08197f55450d830876d9933f8f48a429b354f1d496b42" checksum = "47c8fbc0f831f4519fe8b810b6a7a91410ec83031b8233f730a0480029f6a23f"
dependencies = [ dependencies = [
"arrayvec", "arrayvec",
] ]
@ -255,9 +255,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
[[package]] [[package]]
name = "bitflags" name = "bitflags"
version = "2.9.1" version = "2.9.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" checksum = "6a65b545ab31d687cff52899d4890855fec459eb6afe0da6417b8a18da87aa29"
dependencies = [ dependencies = [
"serde", "serde",
] ]
@ -280,15 +280,6 @@ dependencies = [
"wyz", "wyz",
] ]
[[package]]
name = "block2"
version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f"
dependencies = [
"objc2",
]
[[package]] [[package]]
name = "bstr" name = "bstr"
version = "1.12.0" version = "1.12.0"
@ -352,9 +343,9 @@ dependencies = [
[[package]] [[package]]
name = "cc" name = "cc"
version = "1.2.32" version = "1.2.33"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2352e5597e9c544d5e6d9c95190d5d27738ade584fa8db0a16e130e5c2b5296e" checksum = "3ee0f8803222ba5a7e2777dd72ca451868909b1ac410621b676adf07280e9b5f"
dependencies = [ dependencies = [
"jobserver", "jobserver",
"libc", "libc",
@ -578,7 +569,7 @@ version = "0.28.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "829d955a0bb380ef178a640b91779e3987da38c9aea133b20614cfed8cdea9c6" checksum = "829d955a0bb380ef178a640b91779e3987da38c9aea133b20614cfed8cdea9c6"
dependencies = [ dependencies = [
"bitflags 2.9.1", "bitflags 2.9.2",
"crossterm_winapi", "crossterm_winapi",
"mio", "mio",
"parking_lot", "parking_lot",
@ -594,7 +585,7 @@ version = "0.29.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d8b9f2e4c67f833b660cdb0a3523065869fb35570177239812ed4c905aeff87b" checksum = "d8b9f2e4c67f833b660cdb0a3523065869fb35570177239812ed4c905aeff87b"
dependencies = [ dependencies = [
"bitflags 2.9.1", "bitflags 2.9.2",
"crossterm_winapi", "crossterm_winapi",
"derive_more", "derive_more",
"document-features", "document-features",
@ -1178,7 +1169,7 @@ version = "0.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f37dccff2791ab604f9babef0ba14fbe0be30bd368dc541e2b08d07c8aa908f3" checksum = "f37dccff2791ab604f9babef0ba14fbe0be30bd368dc541e2b08d07c8aa908f3"
dependencies = [ dependencies = [
"bitflags 2.9.1", "bitflags 2.9.2",
"inotify-sys", "inotify-sys",
"libc", "libc",
] ]
@ -1222,7 +1213,7 @@ version = "0.7.9"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d93587f37623a1a17d94ef2bc9ada592f5465fe7732084ab7beefabe5c77c0c4" checksum = "d93587f37623a1a17d94ef2bc9ada592f5465fe7732084ab7beefabe5c77c0c4"
dependencies = [ dependencies = [
"bitflags 2.9.1", "bitflags 2.9.2",
"cfg-if", "cfg-if",
"libc", "libc",
] ]
@ -1340,7 +1331,7 @@ version = "0.1.9"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "391290121bad3d37fbddad76d8f5d1c1c314cfc646d143d7e07a3086ddff0ce3" checksum = "391290121bad3d37fbddad76d8f5d1c1c314cfc646d143d7e07a3086ddff0ce3"
dependencies = [ dependencies = [
"bitflags 2.9.1", "bitflags 2.9.2",
"libc", "libc",
] ]
@ -1562,7 +1553,7 @@ version = "8.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4d3d07927151ff8575b7087f245456e549fea62edf0ec4e565a5ee50c8402bc3" checksum = "4d3d07927151ff8575b7087f245456e549fea62edf0ec4e565a5ee50c8402bc3"
dependencies = [ dependencies = [
"bitflags 2.9.1", "bitflags 2.9.2",
"fsevent-sys", "fsevent-sys",
"inotify", "inotify",
"kqueue", "kqueue",
@ -1664,19 +1655,12 @@ dependencies = [
"malloc_buf", "malloc_buf",
] ]
[[package]]
name = "objc-sys"
version = "0.3.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310"
[[package]] [[package]]
name = "objc2" name = "objc2"
version = "0.5.2" version = "0.6.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "46a785d4eeff09c14c487497c162e92766fbb3e4059a71840cecc03d9a50b804" checksum = "561f357ba7f3a2a61563a186a163d0a3a5247e1089524a3981d49adb775078bc"
dependencies = [ dependencies = [
"objc-sys",
"objc2-encode", "objc2-encode",
] ]
@ -1688,13 +1672,11 @@ checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33"
[[package]] [[package]]
name = "objc2-foundation" name = "objc2-foundation"
version = "0.2.2" version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" checksum = "900831247d2fe1a09a683278e5384cfb8c80c79fe6b166f9d14bfdde0ea1b03c"
dependencies = [ dependencies = [
"bitflags 2.9.1", "bitflags 2.9.2",
"block2",
"libc",
"objc2", "objc2",
] ]
@ -1725,7 +1707,7 @@ version = "6.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "336b9c63443aceef14bea841b899035ae3abe89b7c486aaf4c5bd8aafedac3f0" checksum = "336b9c63443aceef14bea841b899035ae3abe89b7c486aaf4c5bd8aafedac3f0"
dependencies = [ dependencies = [
"bitflags 2.9.1", "bitflags 2.9.2",
"libc", "libc",
"once_cell", "once_cell",
"onig_sys", "onig_sys",
@ -1929,9 +1911,9 @@ dependencies = [
[[package]] [[package]]
name = "proc-macro2" name = "proc-macro2"
version = "1.0.97" version = "1.0.101"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d61789d7719defeb74ea5fe81f2fdfdbd28a803847077cecce2ff14e1472f6f1" checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de"
dependencies = [ dependencies = [
"unicode-ident", "unicode-ident",
] ]
@ -2080,7 +2062,7 @@ version = "0.29.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "eabd94c2f37801c20583fc49dd5cd6b0ba68c716787c2dd6ed18571e1e63117b" checksum = "eabd94c2f37801c20583fc49dd5cd6b0ba68c716787c2dd6ed18571e1e63117b"
dependencies = [ dependencies = [
"bitflags 2.9.1", "bitflags 2.9.2",
"cassowary", "cassowary",
"compact_str", "compact_str",
"crossterm 0.28.1", "crossterm 0.28.1",
@ -2160,7 +2142,7 @@ version = "0.5.17"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77"
dependencies = [ dependencies = [
"bitflags 2.9.1", "bitflags 2.9.2",
] ]
[[package]] [[package]]
@ -2171,7 +2153,7 @@ checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac"
dependencies = [ dependencies = [
"getrandom 0.2.16", "getrandom 0.2.16",
"libredox", "libredox",
"thiserror 2.0.14", "thiserror 2.0.15",
] ]
[[package]] [[package]]
@ -2251,7 +2233,7 @@ version = "0.38.44"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154"
dependencies = [ dependencies = [
"bitflags 2.9.1", "bitflags 2.9.2",
"errno", "errno",
"libc", "libc",
"linux-raw-sys 0.4.15", "linux-raw-sys 0.4.15",
@ -2264,7 +2246,7 @@ version = "1.0.8"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "11181fbabf243db407ef8df94a6ce0b2f9a733bd8be4ad02b4eda9602296cac8" checksum = "11181fbabf243db407ef8df94a6ce0b2f9a733bd8be4ad02b4eda9602296cac8"
dependencies = [ dependencies = [
"bitflags 2.9.1", "bitflags 2.9.2",
"errno", "errno",
"libc", "libc",
"linux-raw-sys 0.9.4", "linux-raw-sys 0.9.4",
@ -2515,9 +2497,9 @@ dependencies = [
[[package]] [[package]]
name = "syn" name = "syn"
version = "2.0.105" version = "2.0.106"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7bc3fcb250e53458e712715cf74285c1f889686520d79294a9ef3bd7aa1fc619" checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@ -2592,11 +2574,11 @@ dependencies = [
[[package]] [[package]]
name = "thiserror" name = "thiserror"
version = "2.0.14" version = "2.0.15"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0b0949c3a6c842cbde3f1686d6eea5a010516deb7085f79db747562d4102f41e" checksum = "80d76d3f064b981389ecb4b6b7f45a0bf9fdac1d5b9204c7bd6714fecc302850"
dependencies = [ dependencies = [
"thiserror-impl 2.0.14", "thiserror-impl 2.0.15",
] ]
[[package]] [[package]]
@ -2612,9 +2594,9 @@ dependencies = [
[[package]] [[package]]
name = "thiserror-impl" name = "thiserror-impl"
version = "2.0.14" version = "2.0.15"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cc5b44b4ab9c2fdd0e0512e6bece8388e214c0749f5862b114cc5b7a25daf227" checksum = "44d29feb33e986b6ea906bd9c3559a856983f92371b3eaa5e83782a351623de0"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@ -2886,9 +2868,9 @@ dependencies = [
[[package]] [[package]]
name = "trash" name = "trash"
version = "5.2.2" version = "5.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "22746c6b0c6d85d60a8f0d858f7057dfdf11297c132679f452ec908fba42b871" checksum = "65a334451012017a39758aa85a30827c13ac684245bf6b08249483c063f64ff3"
dependencies = [ dependencies = [
"chrono", "chrono",
"libc", "libc",
@ -3464,7 +3446,7 @@ version = "0.39.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1"
dependencies = [ dependencies = [
"bitflags 2.9.1", "bitflags 2.9.2",
] ]
[[package]] [[package]]
@ -3484,7 +3466,7 @@ dependencies = [
"crossterm 0.29.0", "crossterm 0.29.0",
"foldhash", "foldhash",
"futures", "futures",
"indexmap", "hashbrown",
"libc", "libc",
"mlua", "mlua",
"paste", "paste",
@ -3535,7 +3517,6 @@ version = "25.6.11"
dependencies = [ dependencies = [
"ansi-to-tui", "ansi-to-tui",
"foldhash", "foldhash",
"hashbrown",
"mlua", "mlua",
"paste", "paste",
"ratatui", "ratatui",
@ -3612,7 +3593,7 @@ name = "yazi-config"
version = "25.6.11" version = "25.6.11"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"bitflags 2.9.1", "bitflags 2.9.2",
"crossterm 0.29.0", "crossterm 0.29.0",
"dirs", "dirs",
"globset", "globset",
@ -3742,7 +3723,7 @@ version = "25.6.11"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"arc-swap", "arc-swap",
"bitflags 2.9.1", "bitflags 2.9.2",
"core-foundation-sys", "core-foundation-sys",
"dirs", "dirs",
"foldhash", "foldhash",
@ -3775,7 +3756,7 @@ name = "yazi-parser"
version = "25.6.11" version = "25.6.11"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"bitflags 2.9.1", "bitflags 2.9.2",
"crossterm 0.29.0", "crossterm 0.29.0",
"hashbrown", "hashbrown",
"mlua", "mlua",
@ -3796,7 +3777,6 @@ dependencies = [
"anyhow", "anyhow",
"crossterm 0.29.0", "crossterm 0.29.0",
"futures", "futures",
"globset",
"libc", "libc",
"mlua", "mlua",
"parking_lot", "parking_lot",

View file

@ -23,7 +23,7 @@ lto = false
ansi-to-tui = "7.0.0" ansi-to-tui = "7.0.0"
anyhow = "1.0.99" anyhow = "1.0.99"
base64 = "0.22.1" base64 = "0.22.1"
bitflags = { version = "2.9.1", features = [ "serde" ] } bitflags = { version = "2.9.2", features = [ "serde" ] }
clap = { version = "4.5.45", features = [ "derive" ] } clap = { version = "4.5.45", features = [ "derive" ] }
core-foundation-sys = "0.8.7" core-foundation-sys = "0.8.7"
crossterm = { version = "0.29.0", features = [ "event-stream" ] } crossterm = { version = "0.29.0", features = [ "event-stream" ] }

View file

@ -1 +1 @@
{"words":["Punct","KEYMAP","splitn","crossterm","YAZI","peekable","ratatui","syntect","pbpaste","pbcopy","oneshot","Posix","Lsar","XADDOS","zoxide","cands","Deque","precache","imageops","IFBLK","IFCHR","IFDIR","IFIFO","IFLNK","IFMT","IFSOCK","IRGRP","IROTH","IRUSR","ISGID","ISUID","ISVTX","IWGRP","IWOTH","IWUSR","IXGRP","IXOTH","IXUSR","libc","winsize","TIOCGWINSZ","xpixel","ypixel","ioerr","appender","Catppuccin","macchiato","gitmodules","Dotfiles","bashprofile","vimrc","flac","webp","exiftool","mediainfo","ripgrep","indexmap","indexmap","unwatch","canonicalize","serde","fsevent","Ueberzug","iterm","wezterm","sixel","chafa","ueberzugpp","Konsole","Überzug","pkgs","pdftoppm","poppler","singlefile","jpegopt","EXIF","rustfmt","mktemp","nanos","xclip","xsel","natord","Mintty","nixos","nixpkgs","SIGTSTP","SIGCONT","SIGCONT","mlua","nonstatic","userdata","metatable","natsort","backstack","luajit","Succ","Succ","cand","fileencoding","foldmethod","lightgreen","darkgray","lightred","lightyellow","lightcyan","nushell","msvc","aarch","linemode","sxyazi","rsplit","ZELLIJ","bitflags","bitflags","USERPROFILE","Neovim","vergen","gitcl","Renderable","preloaders","prec","Upserting","prio","Ghostty","Catmull","Lanczos","cmds","unyank","scrolloff","headsup","unsub","uzers","scopeguard","SPDLOG","globset","filetime","magick","magick","prefetcher","Prework","prefetchers","PREWORKERS","conds","translit","rxvt","Urxvt","realpath","realname","REPARSE","hardlink","hardlinking","nlink","nlink","linemodes","SIGSTOP","sevenzip","rsplitn","replacen","DECSET","DECRQM","repeek","cwds","tcsi","Hyprland","Wayfire","SWAYSOCK","btime","nsec","codegen","gethostname","fchmod","fdfind","Rustc","rustc","ffprobe","vframes","luma","obase","outln","errln","tmtheme","twox","cfgs","fstype","objc","rdev","runloop","exfat","rclone","DECRQSS","DECSCUSR","libvterm","Uninit","lockin","rposition","resvg","foldhash","tilded","futs","chdir","hashbrown"],"flagWords":[],"version":"0.2","language":"en"} {"version":"0.2","language":"en","flagWords":[],"words":["Punct","KEYMAP","splitn","crossterm","YAZI","peekable","ratatui","syntect","pbpaste","pbcopy","oneshot","Posix","Lsar","XADDOS","zoxide","cands","Deque","precache","imageops","IFBLK","IFCHR","IFDIR","IFIFO","IFLNK","IFMT","IFSOCK","IRGRP","IROTH","IRUSR","ISGID","ISUID","ISVTX","IWGRP","IWOTH","IWUSR","IXGRP","IXOTH","IXUSR","libc","winsize","TIOCGWINSZ","xpixel","ypixel","ioerr","appender","Catppuccin","macchiato","gitmodules","Dotfiles","bashprofile","vimrc","flac","webp","exiftool","mediainfo","ripgrep","indexmap","indexmap","unwatch","canonicalize","serde","fsevent","Ueberzug","iterm","wezterm","sixel","chafa","ueberzugpp","Konsole","Überzug","pkgs","pdftoppm","poppler","singlefile","jpegopt","EXIF","rustfmt","mktemp","nanos","xclip","xsel","natord","Mintty","nixos","nixpkgs","SIGTSTP","SIGCONT","SIGCONT","mlua","nonstatic","userdata","metatable","natsort","backstack","luajit","Succ","Succ","cand","fileencoding","foldmethod","lightgreen","darkgray","lightred","lightyellow","lightcyan","nushell","msvc","aarch","linemode","sxyazi","rsplit","ZELLIJ","bitflags","bitflags","USERPROFILE","Neovim","vergen","gitcl","Renderable","preloaders","prec","Upserting","prio","Ghostty","Catmull","Lanczos","cmds","unyank","scrolloff","headsup","unsub","uzers","scopeguard","SPDLOG","globset","filetime","magick","magick","prefetcher","Prework","prefetchers","PREWORKERS","conds","translit","rxvt","Urxvt","realpath","realname","REPARSE","hardlink","hardlinking","nlink","nlink","linemodes","SIGSTOP","sevenzip","rsplitn","replacen","DECSET","DECRQM","repeek","cwds","tcsi","Hyprland","Wayfire","SWAYSOCK","btime","nsec","codegen","gethostname","fchmod","fdfind","Rustc","rustc","ffprobe","vframes","luma","obase","outln","errln","tmtheme","twox","cfgs","fstype","objc","rdev","runloop","exfat","rclone","DECRQSS","DECSCUSR","libvterm","Uninit","lockin","rposition","resvg","foldhash","tilded","futs","chdir","hashbrown","JEMALLOC","RUSTFLAGS"]}

View file

@ -32,7 +32,7 @@ anyhow = { workspace = true }
crossterm = { workspace = true } crossterm = { workspace = true }
foldhash = { workspace = true } foldhash = { workspace = true }
futures = { workspace = true } futures = { workspace = true }
indexmap = { workspace = true } hashbrown = { workspace = true }
mlua = { workspace = true } mlua = { workspace = true }
paste = { workspace = true } paste = { workspace = true }
scopeguard = { workspace = true } scopeguard = { workspace = true }

View file

@ -1,10 +1,9 @@
use std::collections::HashMap;
use anyhow::Result; use anyhow::Result;
use hashbrown::HashMap;
use yazi_core::mgr::LINKED; use yazi_core::mgr::LINKED;
use yazi_macro::{act, render, succ}; use yazi_macro::{act, render, succ};
use yazi_parser::mgr::UpdateMimesOpt; use yazi_parser::mgr::UpdateMimesOpt;
use yazi_shared::event::Data; use yazi_shared::{event::Data, url::UrlCov};
use crate::{Actor, Ctx}; use crate::{Actor, Ctx};
@ -24,9 +23,9 @@ impl Actor for UpdateMimes {
.filter(|(url, mime)| cx.mgr.mimetype.by_url(url) != Some(mime)) .filter(|(url, mime)| cx.mgr.mimetype.by_url(url) != Some(mime))
.fold(HashMap::new(), |mut map, (u, m)| { .fold(HashMap::new(), |mut map, (u, m)| {
for u in linked.from_file(u.as_url()) { for u in linked.from_file(u.as_url()) {
map.insert(u, m.to_string()); map.insert(u.into(), m.to_string());
} }
map.insert(u.into_owned(), m.into_owned()); map.insert(u.into(), m.into_owned());
map map
}); });
@ -39,11 +38,11 @@ impl Actor for UpdateMimes {
.current() .current()
.paginate(cx.current().page) .paginate(cx.current().page)
.iter() .iter()
.filter(|&f| updates.contains_key(&f.url)) .filter(|&f| updates.contains_key(&UrlCov::new(&f.url)))
.cloned() .cloned()
.collect(); .collect();
let repeek = cx.hovered().is_some_and(|f| updates.contains_key(&f.url)); let repeek = cx.hovered().is_some_and(|f| updates.contains_key(&UrlCov::new(&f.url)));
cx.mgr.mimetype.extend(updates); cx.mgr.mimetype.extend(updates);
if repeek { if repeek {

View file

@ -22,7 +22,6 @@ yazi-shared = { path = "../yazi-shared", version = "25.6.11" }
# External dependencies # External dependencies
ansi-to-tui = { workspace = true } ansi-to-tui = { workspace = true }
foldhash = { workspace = true } foldhash = { workspace = true }
hashbrown = { workspace = true }
mlua = { workspace = true } mlua = { workspace = true }
paste = { workspace = true } paste = { workspace = true }
ratatui = { workspace = true } ratatui = { workspace = true }

View file

@ -34,7 +34,7 @@ fn main() -> Result<(), Box<dyn Error>> {
let profile = if target_os == "windows" { &["--profile", "release-windows"][..] } else { &[] }; let profile = if target_os == "windows" { &["--profile", "release-windows"][..] } else { &[] };
let mut child = Command::new(env::var_os("CARGO").unwrap()) let mut child = Command::new(env::var_os("CARGO").unwrap())
.args(&["install", "--force", "--locked"]) .args(["install", "--force", "--locked"])
.args(profile) .args(profile)
.args(crates) .args(crates)
.stdout(Stdio::piped()) .stdout(Stdio::piped())

View file

@ -13,5 +13,5 @@ proc-macro = true
[dependencies] [dependencies]
# External dependencies # External dependencies
syn = { version = "2.0.105", features = [ "full" ] } syn = { version = "2.0.106", features = [ "full" ] }
quote = "1.0.40" quote = "1.0.40"

View file

@ -2,7 +2,7 @@ use std::borrow::Cow;
use hashbrown::HashMap; use hashbrown::HashMap;
use yazi_fs::File; use yazi_fs::File;
use yazi_shared::{MIME_DIR, SStr, url::{Url, UrlBuf, UrlBufCov, UrlCov}}; use yazi_shared::{MIME_DIR, SStr, url::{Url, UrlBufCov, UrlCov}};
#[derive(Default)] #[derive(Default)]
pub struct Mimetype(HashMap<UrlBufCov, String>); pub struct Mimetype(HashMap<UrlBufCov, String>);
@ -34,7 +34,7 @@ impl Mimetype {
} }
#[inline] #[inline]
pub fn extend(&mut self, iter: impl IntoIterator<Item = (UrlBuf, String)>) { pub fn extend(&mut self, iter: impl IntoIterator<Item = (UrlBufCov, String)>) {
self.0.extend(iter.into_iter().map(|(u, m)| (UrlBufCov(u), m))); self.0.extend(iter);
} }
} }

View file

@ -164,8 +164,8 @@ mod tests {
fn test_insert_non_conflicting() { fn test_insert_non_conflicting() {
let mut s = Selected::default(); let mut s = Selected::default();
assert!(s.add(&url("/a/b"))); assert!(s.add(url("/a/b")));
assert!(s.add(&url("/c/d"))); assert!(s.add(url("/c/d")));
assert_eq!(s.inner.len(), 2); assert_eq!(s.inner.len(), 2);
} }
@ -173,27 +173,27 @@ mod tests {
fn test_insert_conflicting_parent() { fn test_insert_conflicting_parent() {
let mut s = Selected::default(); let mut s = Selected::default();
assert!(s.add(&url("/a"))); assert!(s.add(url("/a")));
assert!(!s.add(&url("/a/b"))); assert!(!s.add(url("/a/b")));
} }
#[test] #[test]
fn test_insert_conflicting_child() { fn test_insert_conflicting_child() {
let mut s = Selected::default(); let mut s = Selected::default();
assert!(s.add(&url("/a/b/c"))); assert!(s.add(url("/a/b/c")));
assert!(!s.add(&url("/a/b"))); assert!(!s.add(url("/a/b")));
assert!(s.add(&url("/a/b/d"))); assert!(s.add(url("/a/b/d")));
} }
#[test] #[test]
fn test_remove() { fn test_remove() {
let mut s = Selected::default(); let mut s = Selected::default();
assert!(s.add(&url("/a/b"))); assert!(s.add(url("/a/b")));
assert!(!s.remove(&url("/a/c"))); assert!(!s.remove(url("/a/c")));
assert!(s.remove(&url("/a/b"))); assert!(s.remove(url("/a/b")));
assert!(!s.remove(&url("/a/b"))); assert!(!s.remove(url("/a/b")));
assert!(s.inner.is_empty()); assert!(s.inner.is_empty());
assert!(s.parents.is_empty()); assert!(s.parents.is_empty());
} }
@ -204,7 +204,7 @@ mod tests {
assert_eq!( assert_eq!(
3, 3,
s.add_same([&url("/parent/child1"), &url("/parent/child2"), &url("/parent/child3")]) s.add_same([url("/parent/child1"), url("/parent/child2"), url("/parent/child3")])
); );
} }
@ -212,62 +212,62 @@ mod tests {
fn insert_many_with_existing_parent_fails() { fn insert_many_with_existing_parent_fails() {
let mut s = Selected::default(); let mut s = Selected::default();
s.add(&url("/parent")); s.add(url("/parent"));
assert_eq!(0, s.add_same([&url("/parent/child1"), &url("/parent/child2")])); assert_eq!(0, s.add_same([url("/parent/child1"), url("/parent/child2")]));
} }
#[test] #[test]
fn insert_many_with_existing_child_fails() { fn insert_many_with_existing_child_fails() {
let mut s = Selected::default(); let mut s = Selected::default();
s.add(&url("/parent/child1")); s.add(url("/parent/child1"));
assert_eq!(2, s.add_same([&url("/parent/child1"), &url("/parent/child2")])); assert_eq!(2, s.add_same([url("/parent/child1"), url("/parent/child2")]));
} }
#[test] #[test]
fn insert_many_empty_urls_list() { fn insert_many_empty_urls_list() {
let mut s = Selected::default(); let mut s = Selected::default();
assert_eq!(0, s.add_same([] as [&Url; 0])); assert_eq!(0, s.add_same([] as [Url; 0]));
} }
#[test] #[test]
fn insert_many_with_parent_as_child_of_another_url() { fn insert_many_with_parent_as_child_of_another_url() {
let mut s = Selected::default(); let mut s = Selected::default();
s.add(&url("/parent/child")); s.add(url("/parent/child"));
assert_eq!(0, s.add_same([&url("/parent/child/child1"), &url("/parent/child/child2")])); assert_eq!(0, s.add_same([url("/parent/child/child1"), url("/parent/child/child2")]));
} }
#[test] #[test]
fn insert_many_with_direct_parent_fails() { fn insert_many_with_direct_parent_fails() {
let mut s = Selected::default(); let mut s = Selected::default();
s.add(&url("/a")); s.add(url("/a"));
assert_eq!(0, s.add_same([&url("/a/b")])); assert_eq!(0, s.add_same([url("/a/b")]));
} }
#[test] #[test]
fn insert_many_with_nested_child_fails() { fn insert_many_with_nested_child_fails() {
let mut s = Selected::default(); let mut s = Selected::default();
s.add(&url("/a/b")); s.add(url("/a/b"));
assert_eq!(0, s.add_same([&url("/a")])); assert_eq!(0, s.add_same([url("/a")]));
assert_eq!(1, s.add_same([&url("/b"), &url("/a")])); assert_eq!(1, s.add_same([url("/b"), url("/a")]));
} }
#[test] #[test]
fn insert_many_sibling_directories_success() { fn insert_many_sibling_directories_success() {
let mut s = Selected::default(); let mut s = Selected::default();
assert_eq!(2, s.add_same([&url("/a/b"), &url("/a/c")])); assert_eq!(2, s.add_same([url("/a/b"), url("/a/c")]));
} }
#[test] #[test]
fn insert_many_with_grandchild_fails() { fn insert_many_with_grandchild_fails() {
let mut s = Selected::default(); let mut s = Selected::default();
s.add(&url("/a/b")); s.add(url("/a/b"));
assert_eq!(0, s.add_same([&url("/a/b/c")])); assert_eq!(0, s.add_same([url("/a/b/c")]));
} }
#[test] #[test]

View file

@ -75,7 +75,7 @@ pub fn url_relative_to_impl<'a>(from: UrlCow<'a>, to: UrlCow<'a>) -> Result<UrlC
if from.is_absolute() != to.is_absolute() { if from.is_absolute() != to.is_absolute() {
return if to.is_absolute() { return if to.is_absolute() {
Ok(to.into()) Ok(to)
} else { } else {
bail!("Urls must be both absolute or both relative: {from:?} and {to:?}"); bail!("Urls must be both absolute or both relative: {from:?} and {to:?}");
}; };
@ -92,7 +92,7 @@ pub fn url_relative_to_impl<'a>(from: UrlCow<'a>, to: UrlCow<'a>) -> Result<UrlC
(Some(RootDir), Some(RootDir)) => {} (Some(RootDir), Some(RootDir)) => {}
(Some(Prefix(a)), Some(Prefix(b))) if a == b => {} (Some(Prefix(a)), Some(Prefix(b))) if a == b => {}
(Some(Scheme(_) | Prefix(_) | RootDir), _) | (_, Some(Scheme(_) | Prefix(_) | RootDir)) => { (Some(Scheme(_) | Prefix(_) | RootDir), _) | (_, Some(Scheme(_) | Prefix(_) | RootDir)) => {
return Ok(to.into()); return Ok(to);
} }
(None, None) => break (None, None), (None, None) => break (None, None),
(a, b) if a != b => break (a, b), (a, b) if a != b => break (a, b),

View file

@ -29,7 +29,6 @@ yazi-widgets = { path = "../yazi-widgets", version = "25.6.11" }
anyhow = { workspace = true } anyhow = { workspace = true }
crossterm = { workspace = true } crossterm = { workspace = true }
futures = { workspace = true } futures = { workspace = true }
globset = { workspace = true }
mlua = { workspace = true } mlua = { workspace = true }
parking_lot = { workspace = true } parking_lot = { workspace = true }
paste = { workspace = true } paste = { workspace = true }

View file

@ -33,4 +33,4 @@ tracing = { workspace = true }
libc = { workspace = true } libc = { workspace = true }
[target.'cfg(not(target_os = "android"))'.dependencies] [target.'cfg(not(target_os = "android"))'.dependencies]
trash = "5.2.2" trash = "5.2.3"

View file

@ -3,7 +3,7 @@ use std::{hash::{Hash, Hasher}, ops::Deref};
use hashbrown::Equivalent; use hashbrown::Equivalent;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use crate::url::{Url, UrlBuf}; use crate::url::{Url, UrlBuf, UrlCow};
#[derive(Clone)] #[derive(Clone)]
pub struct UrlCov<'a>(Url<'a>); pub struct UrlCov<'a>(Url<'a>);
@ -54,14 +54,18 @@ impl From<UrlBuf> for UrlBufCov {
fn from(value: UrlBuf) -> Self { Self(value) } fn from(value: UrlBuf) -> Self { Self(value) }
} }
impl From<&UrlCov<'_>> for UrlBufCov {
fn from(value: &UrlCov<'_>) -> Self { Self(UrlBuf::from(&value.0)) }
}
impl From<UrlBufCov> for UrlBuf { impl From<UrlBufCov> for UrlBuf {
fn from(value: UrlBufCov) -> Self { value.0 } fn from(value: UrlBufCov) -> Self { value.0 }
} }
impl From<UrlCow<'_>> for UrlBufCov {
fn from(value: UrlCow<'_>) -> Self { Self(value.into_owned()) }
}
impl From<&UrlCov<'_>> for UrlBufCov {
fn from(value: &UrlCov<'_>) -> Self { Self(UrlBuf::from(&value.0)) }
}
impl<'a> From<&'a UrlBufCov> for Url<'a> { impl<'a> From<&'a UrlBufCov> for Url<'a> {
fn from(value: &'a UrlBufCov) -> Self { value.0.as_url() } fn from(value: &'a UrlBufCov) -> Self { value.0.as_url() }
} }