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)
- GEM (.gem - Ruby gems with nested tar structure)
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) error
- 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 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
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 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.