Add support for RAR archive preview

This commit is contained in:
Kovid Goyal 2025-11-27 09:33:15 +05:30
parent 37eead581b
commit 5f90102413
No known key found for this signature in database
GPG key ID: 06BC317B515ACE7C
4 changed files with 18 additions and 2 deletions

View file

@ -223,7 +223,7 @@ IGNORED_DEPENDENCY_CVES = [
# glib
'CVE-2025-4056', # Only affects Windows, on which we dont run
# github.com/nwaples/rardecode/v2
'CVE-2025-11579', # rardecode not present in kitty go.sum
'CVE-2025-11579', # rardecode is version 2.2.1, not vulnerable
]

1
go.mod
View file

@ -17,6 +17,7 @@ require (
github.com/kovidgoyal/go-parallel v1.1.1
github.com/kovidgoyal/go-shm v1.0.0
github.com/kovidgoyal/imaging v1.8.17
github.com/nwaples/rardecode/v2 v2.2.1
github.com/seancfoley/ipaddress-go v1.7.1
github.com/shirou/gopsutil/v4 v4.25.10
github.com/ulikunitz/xz v0.5.15

2
go.sum
View file

@ -40,6 +40,8 @@ github.com/kovidgoyal/imaging v1.8.17 h1:IDc7lbN2Qrn8s50y7Zt355HhOc+jUpvsScYAaGC
github.com/kovidgoyal/imaging v1.8.17/go.mod h1:uD4XKN42lLV9du0TsPkwi53yw23vz/qDmfpiDWCSUCE=
github.com/lufia/plan9stats v0.0.0-20230326075908-cb1d2100619a h1:N9zuLhTvBSRt0gWSiJswwQ2HqDmtX/ZCDJURnKUt1Ik=
github.com/lufia/plan9stats v0.0.0-20230326075908-cb1d2100619a/go.mod h1:JKx41uQRwqlTZabZc+kILPrO/3jlKnQ2Z8b7YiVw5cE=
github.com/nwaples/rardecode/v2 v2.2.1 h1:DgHK/O/fkTQEKBJxBMC5d9IU8IgauifbpG78+rZJMnI=
github.com/nwaples/rardecode/v2 v2.2.1/go.mod h1:7uz379lSxPe6j9nvzxUZ+n7mnJNgjsRNb6IbvGVHRmw=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU=

View file

@ -14,6 +14,7 @@ import (
"github.com/klauspost/compress/gzip"
"github.com/klauspost/compress/zip"
"github.com/klauspost/compress/zstd"
"github.com/nwaples/rardecode/v2"
"github.com/ulikunitz/xz"
"github.com/kovidgoyal/kitty/tools/utils"
@ -25,7 +26,7 @@ func IsSupportedArchiveFile(abspath string) bool {
name := strings.ToLower(filepath.Base(abspath))
ext := filepath.Ext(name)
switch ext {
case ".zip", ".tgz", ".tbz2", ".tzst", ".txz":
case ".zip", ".tgz", ".tbz2", ".tzst", ".txz", ".rar":
return true
case ".gz", ".bz2", ".zst", ".xz":
name = name[:len(name)-len(ext)]
@ -88,6 +89,18 @@ func (p *archive_preview) render() {
}
}
case ".rar":
r, err := rardecode.OpenReader(p.path, rardecode.SkipCheck)
if err == nil {
defer r.Close()
for len(names) < 500 {
hdr, err := r.Next()
if err != nil {
break
}
names = append(names, displayFilename(hdr.Name))
}
}
case ".gz", ".tgz":
if f, err := os.Open(p.path); err == nil {
defer f.Close()