From 8951b4f42a557d68f5aaab9cd9bc27b5e348e77d Mon Sep 17 00:00:00 2001 From: Andrey Smirnov Date: Fri, 21 Feb 2014 20:42:25 +0400 Subject: [PATCH] Reading control file from .deb package. --- debian/deb.go | 59 ++++++++++++++++++ debian/deb_test.go | 32 ++++++++++ ...oost-program-options-dev_1.49.0.1_i386.deb | Bin 0 -> 2738 bytes 3 files changed, 91 insertions(+) create mode 100644 debian/deb.go create mode 100644 debian/deb_test.go create mode 100644 system/files/libboost-program-options-dev_1.49.0.1_i386.deb diff --git a/debian/deb.go b/debian/deb.go new file mode 100644 index 00000000..194eac41 --- /dev/null +++ b/debian/deb.go @@ -0,0 +1,59 @@ +package debian + +import ( + "archive/tar" + "compress/gzip" + "fmt" + "github.com/mkrautz/goar" + "io" + "os" +) + +// GetControlFileFromDeb read control file from deb package +func GetControlFileFromDeb(packageFile string) (Stanza, 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 control.tar.gz part") + } + if err != nil { + return nil, fmt.Errorf("unable to read .deb archive: %s", err) + } + + if header.Name == "control.tar.gz" { + ungzip, err := gzip.NewReader(library) + if err != nil { + return nil, fmt.Errorf("unable to ungzip: %s", err) + } + defer ungzip.Close() + + untar := tar.NewReader(ungzip) + for { + tarHeader, err := untar.Next() + if err == io.EOF { + return nil, fmt.Errorf("unable to find control file") + } + if err != nil { + return nil, fmt.Errorf("unable to read .tar archive: %s", err) + } + + if tarHeader.Name == "./control" { + reader := NewControlFileReader(untar) + stanza, err := reader.ReadStanza() + if err != nil { + return nil, err + } + + return stanza, nil + } + } + } + } +} diff --git a/debian/deb_test.go b/debian/deb_test.go new file mode 100644 index 00000000..d3fb7e33 --- /dev/null +++ b/debian/deb_test.go @@ -0,0 +1,32 @@ +package debian + +import ( + . "launchpad.net/gocheck" + "path/filepath" + "runtime" +) + +type DebSuite struct { + debFile string +} + +var _ = Suite(&DebSuite{}) + +func (s *DebSuite) SetUpSuite(c *C) { + _, __file__, _, _ := runtime.Caller(0) + s.debFile = filepath.Join(filepath.Dir(__file__), "../system/files/libboost-program-options-dev_1.49.0.1_i386.deb") +} + +func (s *DebSuite) TestGetControlFileFromDeb(c *C) { + _, err := GetControlFileFromDeb("/no/such/file") + c.Check(err, ErrorMatches, ".*no such file or directory") + + _, __file__, _, _ := runtime.Caller(0) + _, err = GetControlFileFromDeb(__file__) + c.Check(err, ErrorMatches, "unable to read .deb archive: ar: missing global header") + + st, err := GetControlFileFromDeb(s.debFile) + c.Check(err, IsNil) + c.Check(st["Version"], Equals, "1.49.0.1") + c.Check(st["Package"], Equals, "libboost-program-options-dev") +} diff --git a/system/files/libboost-program-options-dev_1.49.0.1_i386.deb b/system/files/libboost-program-options-dev_1.49.0.1_i386.deb new file mode 100644 index 0000000000000000000000000000000000000000..a69ba17b217e1feb2f4f885c7f6de2370ec64169 GIT binary patch literal 2738 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 mN~AYn>+8mH-P<#)=dYNi0B=SAGqinvg