51 lines
951 B
Go
Executable File
51 lines
951 B
Go
Executable File
package extract
|
|
|
|
import "strings"
|
|
|
|
type format int
|
|
|
|
const (
|
|
formatNone format = iota
|
|
formatZip
|
|
formatTar
|
|
formatTarGzip
|
|
formatTarBzip2
|
|
)
|
|
|
|
var knownSuffixes = []struct {
|
|
suffix string
|
|
format format
|
|
}{
|
|
{".tar.gz", formatTarGzip},
|
|
{".tgz", formatTarGzip},
|
|
{".tar.bz2", formatTarBzip2},
|
|
{".tbz2", formatTarBzip2},
|
|
{".tbz", formatTarBzip2},
|
|
{".tar", formatTar},
|
|
{".zip", formatZip},
|
|
}
|
|
|
|
func detect(name string) (format, string) {
|
|
lowerName := strings.ToLower(name)
|
|
for _, known := range knownSuffixes {
|
|
if strings.HasSuffix(lowerName, known.suffix) {
|
|
return known.format, known.suffix
|
|
}
|
|
}
|
|
return formatNone, ""
|
|
}
|
|
|
|
func IsArchive(name string) bool {
|
|
archiveFormat, _ := detect(name)
|
|
return archiveFormat != formatNone
|
|
}
|
|
|
|
func DirectoryName(archiveName string) string {
|
|
_, suffix := detect(archiveName)
|
|
base := strings.Trim(archiveName[:len(archiveName)-len(suffix)], ". ")
|
|
if base == "" {
|
|
return "extracted"
|
|
}
|
|
return base
|
|
}
|