feat: initial goget release — modern IPv6-first download utility
This commit is contained in:
@@ -0,0 +1,84 @@
|
||||
//go:build linux || freebsd
|
||||
// +build linux freebsd
|
||||
|
||||
package archive
|
||||
|
||||
import (
|
||||
"io"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// Extractor is the interface for archive extraction
|
||||
type Extractor interface {
|
||||
Name() string
|
||||
Extensions() []string
|
||||
Extract(r io.Reader, destDir string) error
|
||||
CanHandle(filename string) bool
|
||||
}
|
||||
|
||||
// BaseExtractor provides a basic implementation
|
||||
type BaseExtractor struct {
|
||||
name string
|
||||
extensions []string
|
||||
}
|
||||
|
||||
func NewBaseExtractor(name string, extensions []string) *BaseExtractor {
|
||||
return &BaseExtractor{name: name, extensions: extensions}
|
||||
}
|
||||
|
||||
func (b *BaseExtractor) Name() string { return b.name }
|
||||
func (b *BaseExtractor) Extensions() []string { return b.extensions }
|
||||
func (b *BaseExtractor) CanHandle(filename string) bool {
|
||||
filename = strings.ToLower(filename)
|
||||
for _, ext := range b.extensions {
|
||||
if strings.HasSuffix(filename, ext) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// DetectArchiveFormat detects the archive format by file extension
|
||||
func DetectArchiveFormat(filename string) string {
|
||||
filename = strings.ToLower(filename)
|
||||
if strings.HasSuffix(filename, ".tar.gz") || strings.HasSuffix(filename, ".tgz") {
|
||||
return "tar.gz"
|
||||
}
|
||||
if strings.HasSuffix(filename, ".tar.bz2") || strings.HasSuffix(filename, ".tbz2") {
|
||||
return "tar.bz2"
|
||||
}
|
||||
if strings.HasSuffix(filename, ".zip") {
|
||||
return "zip"
|
||||
}
|
||||
if strings.HasSuffix(filename, ".tar") {
|
||||
return "tar"
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
// IsArchiveFormat checks whether the filename looks like an archive
|
||||
func IsArchiveFormat(filename string) bool { return DetectArchiveFormat(filename) != "" }
|
||||
|
||||
// GetArchiveAndCompression splits filename into archive + compression parts
|
||||
func GetArchiveAndCompression(filename string) (archive, compression string) {
|
||||
filename = strings.ToLower(filename)
|
||||
if strings.HasSuffix(filename, ".tar.gz") || strings.HasSuffix(filename, ".tgz") {
|
||||
return "tar", "gzip"
|
||||
}
|
||||
if strings.HasSuffix(filename, ".tar.bz2") || strings.HasSuffix(filename, ".tbz2") {
|
||||
return "tar", "bzip2"
|
||||
}
|
||||
if strings.HasSuffix(filename, ".zip") {
|
||||
return "zip", ""
|
||||
}
|
||||
if strings.HasSuffix(filename, ".tar") {
|
||||
return "tar", ""
|
||||
}
|
||||
if strings.HasSuffix(filename, ".gz") {
|
||||
return "", "gzip"
|
||||
}
|
||||
if strings.HasSuffix(filename, ".bz2") {
|
||||
return "", "bzip2"
|
||||
}
|
||||
return "", ""
|
||||
}
|
||||
Reference in New Issue
Block a user