From 5f90102413ec51db15570ae2829e1d1edefe281e Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Thu, 27 Nov 2025 09:33:15 +0530 Subject: [PATCH] Add support for RAR archive preview --- .github/workflows/ci.py | 2 +- go.mod | 1 + go.sum | 2 ++ kittens/choose_files/archive.go | 15 ++++++++++++++- 4 files changed, 18 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.py b/.github/workflows/ci.py index d9abffeca..c71f416d9 100644 --- a/.github/workflows/ci.py +++ b/.github/workflows/ci.py @@ -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 ] diff --git a/go.mod b/go.mod index ca9d4e870..37f8915b7 100644 --- a/go.mod +++ b/go.mod @@ -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 diff --git a/go.sum b/go.sum index 18b9b20af..af3914dba 100644 --- a/go.sum +++ b/go.sum @@ -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= diff --git a/kittens/choose_files/archive.go b/kittens/choose_files/archive.go index 5ab1684e3..ee2bca286 100644 --- a/kittens/choose_files/archive.go +++ b/kittens/choose_files/archive.go @@ -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()