Spaces:
Configuration error
Configuration error
| package utils | |
| import ( | |
| "fmt" | |
| "os" | |
| "github.com/mholt/archiver/v3" | |
| ) | |
| func IsArchive(file string) bool { | |
| uaIface, err := archiver.ByExtension(file) | |
| if err != nil { | |
| return false | |
| } | |
| _, ok := uaIface.(archiver.Unarchiver) | |
| return ok | |
| } | |
| func ExtractArchive(archive, dst string) error { | |
| uaIface, err := archiver.ByExtension(archive) | |
| if err != nil { | |
| return err | |
| } | |
| un, ok := uaIface.(archiver.Unarchiver) | |
| if !ok { | |
| return fmt.Errorf("format specified by source filename is not an archive format: %s (%T)", archive, uaIface) | |
| } | |
| mytar := &archiver.Tar{ | |
| OverwriteExisting: true, | |
| MkdirAll: true, | |
| ImplicitTopLevelFolder: false, | |
| ContinueOnError: true, | |
| } | |
| switch v := uaIface.(type) { | |
| case *archiver.Tar: | |
| uaIface = mytar | |
| case *archiver.TarBrotli: | |
| v.Tar = mytar | |
| case *archiver.TarBz2: | |
| v.Tar = mytar | |
| case *archiver.TarGz: | |
| v.Tar = mytar | |
| case *archiver.TarLz4: | |
| v.Tar = mytar | |
| case *archiver.TarSz: | |
| v.Tar = mytar | |
| case *archiver.TarXz: | |
| v.Tar = mytar | |
| case *archiver.TarZstd: | |
| v.Tar = mytar | |
| } | |
| err = archiver.Walk(archive, func(f archiver.File) error { | |
| if f.FileInfo.Mode()&os.ModeSymlink != 0 { | |
| return fmt.Errorf("archive contains a symlink") | |
| } | |
| return nil | |
| }) | |
| if err != nil { | |
| return err | |
| } | |
| return un.Unarchive(archive, dst) | |
| } | |