Getting contents from .deb files. #142

This commit is contained in:
Andrey Smirnov
2015-03-24 22:09:36 +03:00
parent 3e138fd6db
commit a6c40f3193
2 changed files with 91 additions and 1 deletions
+77
View File
@@ -2,12 +2,16 @@ package deb
import (
"archive/tar"
"compress/bzip2"
"compress/gzip"
"fmt"
"github.com/mkrautz/goar"
"github.com/remyoudompheng/go-liblzma"
"github.com/smira/aptly/utils"
"github.com/smira/lzma"
"io"
"os"
"strings"
)
// GetControlFileFromDeb reads control file from deb package
@@ -95,3 +99,76 @@ func GetControlFileFromDsc(dscFile string, verifier utils.Verifier) (Stanza, err
return stanza, nil
}
// GetContentsFromDeb returns list of files installed by .deb package
func GetContentsFromDeb(packageFile string) ([]string, error) {
file, err := os.Open(packageFile)
if err != nil {
return nil, err
}
defer file.Close()
library := ar.NewReader(file)
for {
header, err := library.Next()
if err == io.EOF {
return nil, fmt.Errorf("unable to find data.tar.* part")
}
if err != nil {
return nil, fmt.Errorf("unable to read .deb archive: %s", err)
}
if strings.HasPrefix(header.Name, "data.tar") {
var tarInput io.Reader
fmt.Println(header.Name)
switch header.Name {
case "data.tar":
tarInput = library
case "data.tar.gz":
ungzip, err := gzip.NewReader(library)
if err != nil {
return nil, fmt.Errorf("unable to ungzip: %s", err)
}
defer ungzip.Close()
tarInput = ungzip
case "data.tar.bz2":
tarInput = bzip2.NewReader(library)
case "data.tar.xz":
unxz, err := xz.NewReader(library)
if err != nil {
return nil, fmt.Errorf("unable to unxz: %s", err)
}
defer unxz.Close()
tarInput = unxz
case "data.tar.lzma":
unlzma := lzma.NewReader(library)
defer unlzma.Close()
tarInput = unlzma
default:
return nil, fmt.Errorf("unsupported tar compression: %s", header.Name)
}
untar := tar.NewReader(tarInput)
var results []string
for {
tarHeader, err := untar.Next()
if err == io.EOF {
return results, nil
}
if err != nil {
return nil, fmt.Errorf("unable to read .tar archive: %s", err)
}
if tarHeader.Typeflag == tar.TypeDir {
continue
}
if strings.HasPrefix(tarHeader.Name, "./") {
tarHeader.Name = tarHeader.Name[2:]
}
results = append(results, tarHeader.Name)
}
}
}
}