Documentation
¶
Overview ¶
Package archives provides in-memory archive reading and browsing capabilities.
It supports multiple archive formats including:
- ZIP (.zip, .jar, .whl, .nupkg, .egg, .vsix)
- TAR (.tar, .tar.gz, .tgz, .crate, .tar.bz2, .tar.xz, .tar.zst)
- GEM (.gem - Ruby gems with nested tar structure)
- CONDA (.conda - v2 conda packages, zip of zstd tarballs)
The .apk extension is routed by content since Android packages are ZIP and Alpine packages are gzipped tar. Filenames without a recognised extension are opened by inspecting the first bytes.
The package is designed to work entirely in memory without writing to disk, making it suitable for browsing cached artifacts on-demand.
Index ¶
- Constants
- Variables
- func ExtractAll(r Reader, dir string, opts ...ExtractOption) error
- type ExtractOption
- type FileInfo
- type Reader
- func Open(filename string, content io.Reader) (Reader, error)
- func OpenBytes(filename string, content []byte) (Reader, error)
- func OpenBytesWithPrefix(filename string, content []byte, stripPrefix string) (Reader, error)
- func OpenWithPrefix(filename string, content io.Reader, stripPrefix string) (Reader, error)
Constants ¶
const ( SHA256 = "sha256" SHA512 = "sha512" SHA1 = "sha1" MD5 = "md5" )
Supported hash algorithm names for Reader.Hash.
Variables ¶
var ErrDecompressLimit = errors.New("decompressed content exceeds size limit")
var ErrEntryLimit = errors.New("archive entry count exceeds limit")
var ErrExtractLimit = errors.New("extracted bytes exceed limit")
ErrExtractLimit is returned by ExtractAll when the total decompressed bytes written would exceed the WithMaxBytes limit.
var ErrUnsafePath = errors.New("archive entry escapes target directory")
ErrUnsafePath is returned by ExtractAll when an archive entry name would resolve outside the target directory.
Functions ¶
func ExtractAll ¶ added in v0.5.0
func ExtractAll(r Reader, dir string, opts ...ExtractOption) error
ExtractAll writes every entry in r under dir, creating dir and any intermediate directories as needed. Entry permissions are preserved where the archive format records them; entries with no stored mode are written as 0644 (files) or 0755 (directories).
All filesystem operations are confined to dir using os.Root, so a symlink under dir cannot redirect a write outside it. Entry names are additionally validated with filepath.Localize: absolute paths, names containing ".." elements that escape dir, and platform-invalid names cause ExtractAll to return ErrUnsafePath wrapping the offending entry name. Entries that the archive marks as non-regular (symlinks, devices) are skipped.
Types ¶
type ExtractOption ¶ added in v0.7.0
type ExtractOption func(*extractConfig)
ExtractOption configures ExtractAll.
func WithMaxBytes ¶ added in v0.7.0
func WithMaxBytes(n int64) ExtractOption
WithMaxBytes caps the total number of decompressed bytes ExtractAll will write. The limit is enforced against bytes actually read from each entry, not header-declared sizes, so an archive whose headers under-report content still cannot exceed it. A value of zero or less disables the limit.
type FileInfo ¶
type FileInfo struct {
Path string // Full path within archive
Name string // Base name
Size int64 // Uncompressed size in bytes
ModTime time.Time // Modification time
IsDir bool // Whether this is a directory
Mode uint32 // fs.FileMode value: permission bits plus fs.ModeType bits
HasMode bool // Whether Mode was recorded by the archive
CompressedSize int64 // Compressed size (if available)
}
FileInfo represents metadata about a file in an archive.
type Reader ¶
type Reader interface {
// List returns all files in the archive.
List() ([]FileInfo, error)
// ListDir returns files in a specific directory path.
// Use "" or "/" for root directory.
ListDir(dirPath string) ([]FileInfo, error)
// Extract reads a specific file from the archive.
// Returns io.ReadCloser for the file content.
Extract(filePath string) (io.ReadCloser, error)
// Hash returns the hex-encoded digest of the raw archive bytes using
// the named algorithm. Supported algorithms are SHA256, SHA512, SHA1
// and MD5. The hash is computed over the original archive as passed
// to Open, not the decompressed contents.
Hash(algo string) (string, error)
// Close releases resources associated with the reader.
Close() error
}
Reader provides methods to browse and extract files from archives.
func Open ¶
Open creates an archive reader for the given content. The filename is used first to detect the archive format. If it has no supported extension, the content is checked for a supported physical format. Recognised archives are read entirely into memory. An unrecognised stream with no supported extension is rejected after reading at most 512 bytes.
func OpenBytes ¶ added in v0.3.0
OpenBytes is like Open but accepts the archive content as a byte slice. The slice is retained (not copied) for the lifetime of the Reader and must not be modified by the caller after this call.
func OpenBytesWithPrefix ¶ added in v0.3.0
OpenBytesWithPrefix is like OpenWithPrefix but accepts the archive content as a byte slice. The slice is retained (not copied) for the lifetime of the Reader and must not be modified by the caller after this call.