Switch to using internal debian control file parser.

This commit is contained in:
Andrey Smirnov
2013-12-23 17:13:09 +04:00
parent bf11f7b4bb
commit c38592dc02
6 changed files with 59 additions and 81 deletions

9
debian/format.go vendored
View File

@@ -10,6 +10,15 @@ import (
// Stanza or paragraph of Debian control file
type Stanza map[string]string
// Copy returns copy of Stanza
func (s Stanza) Copy() (result Stanza) {
result = make(Stanza, len(s))
for k, v := range s {
result[k] = v
}
return
}
// Parsing errors
var (
ErrMalformedStanza = errors.New("malformed stanza syntax")

37
debian/list_test.go vendored
View File

@@ -1,7 +1,6 @@
package debian
import (
debc "github.com/smira/godebiancontrol"
. "launchpad.net/gocheck"
)
@@ -15,28 +14,20 @@ var _ = Suite(&PackageListSuite{})
func (s *PackageListSuite) SetUpTest(c *C) {
s.list = NewPackageList()
paraGen := func() debc.Paragraph {
para := make(debc.Paragraph)
for k, v := range packagePara {
para[k] = v
}
return para
}
s.p1 = NewPackageFromControlFile(paraGen())
s.p2 = NewPackageFromControlFile(paraGen())
para := paraGen()
para["Package"] = "mars-invaders"
s.p3 = NewPackageFromControlFile(para)
para = paraGen()
para["Size"] = "42"
s.p4 = NewPackageFromControlFile(para)
para = paraGen()
para["Package"] = "lonely-strangers"
s.p5 = NewPackageFromControlFile(para)
para = paraGen()
para["Version"] = "99.1"
s.p6 = NewPackageFromControlFile(para)
s.p1 = NewPackageFromControlFile(packageStanza.Copy())
s.p2 = NewPackageFromControlFile(packageStanza.Copy())
stanza := packageStanza.Copy()
stanza["Package"] = "mars-invaders"
s.p3 = NewPackageFromControlFile(stanza)
stanza = packageStanza.Copy()
stanza["Size"] = "42"
s.p4 = NewPackageFromControlFile(stanza)
stanza = packageStanza.Copy()
stanza["Package"] = "lonely-strangers"
s.p5 = NewPackageFromControlFile(stanza)
stanza = packageStanza.Copy()
stanza["Version"] = "99.1"
s.p6 = NewPackageFromControlFile(stanza)
}
func (s *PackageListSuite) TestAddLen(c *C) {

7
debian/package.go vendored
View File

@@ -5,7 +5,6 @@ import (
"fmt"
"github.com/smira/aptly/database"
"github.com/smira/aptly/utils"
debc "github.com/smira/godebiancontrol"
"github.com/ugorji/go/codec"
"os"
"strconv"
@@ -25,10 +24,10 @@ type Package struct {
PreDepends []string
Suggests []string
Recommends []string
Extra debc.Paragraph
Extra Stanza
}
func parseDependencies(input debc.Paragraph, key string) []string {
func parseDependencies(input Stanza, key string) []string {
value, ok := input[key]
if !ok {
return nil
@@ -40,7 +39,7 @@ func parseDependencies(input debc.Paragraph, key string) []string {
}
// NewPackageFromControlFile creates Package from parsed Debian control file
func NewPackageFromControlFile(input debc.Paragraph) *Package {
func NewPackageFromControlFile(input Stanza) *Package {
result := &Package{
Name: input["Package"],
Version: input["Version"],

View File

@@ -2,23 +2,19 @@ package debian
import (
"github.com/smira/aptly/database"
debc "github.com/smira/godebiancontrol"
. "launchpad.net/gocheck"
)
var packagePara = debc.Paragraph{"Source": "alien-arena", "Depends": "libc6 (>= 2.7), alien-arena-data (>= 7.40)", "Filename": "pool/contrib/a/alien-arena/alien-arena-common_7.40-2_i386.deb", "SHA1": "46955e48cad27410a83740a21d766ce362364024", "SHA256": "eb4afb9885cba6dc70cccd05b910b2dbccc02c5900578be5e99f0d3dbf9d76a5", "Priority": "extra", "Maintainer": "Debian Games Team <pkg-games-devel@lists.alioth.debian.org>", "Description": "Common files for Alien Arena client and server ALIEN ARENA is a standalone 3D first person online deathmatch shooter\n crafted from the original source code of Quake II and Quake III, released\n by id Software under the GPL license. With features including 32 bit\n graphics, new particle engine and effects, light blooms, reflective water,\n hi resolution textures and skins, hi poly models, stain maps, ALIEN ARENA\n pushes the envelope of graphical beauty rivaling today's top games.\n .\n This package installs the common files for Alien Arena.\n", "Homepage": "http://red.planetarena.org", "Tag": "role::app-data, role::shared-lib, special::auto-inst-parts", "Installed-Size": "456", "Version": "7.40-2", "Replaces": "alien-arena (<< 7.33-1)", "Size": "187518", "MD5sum": "1e8cba92c41420aa7baa8a5718d67122", "Package": "alien-arena-common", "Section": "contrib/games", "Architecture": "i386"}
var packageStanza = Stanza{"Source": "alien-arena", "Depends": "libc6 (>= 2.7), alien-arena-data (>= 7.40)", "Filename": "pool/contrib/a/alien-arena/alien-arena-common_7.40-2_i386.deb", "SHA1": "46955e48cad27410a83740a21d766ce362364024", "SHA256": "eb4afb9885cba6dc70cccd05b910b2dbccc02c5900578be5e99f0d3dbf9d76a5", "Priority": "extra", "Maintainer": "Debian Games Team <pkg-games-devel@lists.alioth.debian.org>", "Description": "Common files for Alien Arena client and server ALIEN ARENA is a standalone 3D first person online deathmatch shooter\n crafted from the original source code of Quake II and Quake III, released\n by id Software under the GPL license. With features including 32 bit\n graphics, new particle engine and effects, light blooms, reflective water,\n hi resolution textures and skins, hi poly models, stain maps, ALIEN ARENA\n pushes the envelope of graphical beauty rivaling today's top games.\n .\n This package installs the common files for Alien Arena.\n", "Homepage": "http://red.planetarena.org", "Tag": "role::app-data, role::shared-lib, special::auto-inst-parts", "Installed-Size": "456", "Version": "7.40-2", "Replaces": "alien-arena (<< 7.33-1)", "Size": "187518", "MD5sum": "1e8cba92c41420aa7baa8a5718d67122", "Package": "alien-arena-common", "Section": "contrib/games", "Architecture": "i386"}
type PackageSuite struct {
para debc.Paragraph
para Stanza
}
var _ = Suite(&PackageSuite{})
func (s *PackageSuite) SetUpTest(c *C) {
s.para = make(debc.Paragraph)
for k, v := range packagePara {
s.para[k] = v
}
s.para = packageStanza.Copy()
}
func (s *PackageSuite) TestNewFromPara(c *C) {
@@ -57,11 +53,8 @@ func (s *PackageSuite) TestString(c *C) {
func (s *PackageSuite) TestEquals(c *C) {
p := NewPackageFromControlFile(s.para)
para2 := make(debc.Paragraph)
for k, v := range packagePara {
para2[k] = v
}
p2 := NewPackageFromControlFile(para2)
stanza2 := packageStanza.Copy()
p2 := NewPackageFromControlFile(stanza2)
c.Check(p.Equals(p2), Equals, true)
p2.Depends = []string{"package1"}
@@ -77,11 +70,7 @@ type PackageCollectionSuite struct {
var _ = Suite(&PackageCollectionSuite{})
func (s *PackageCollectionSuite) SetUpTest(c *C) {
para := make(debc.Paragraph)
for k, v := range packagePara {
para[k] = v
}
s.p = NewPackageFromControlFile(para)
s.p = NewPackageFromControlFile(packageStanza.Copy())
s.db, _ = database.OpenDB(c.MkDir())
s.collection = NewPackageCollection(s.db)
}

41
debian/remote.go vendored
View File

@@ -7,7 +7,6 @@ import (
"fmt"
"github.com/smira/aptly/database"
"github.com/smira/aptly/utils"
debc "github.com/smira/godebiancontrol"
"github.com/ugorji/go/codec"
"log"
"net/url"
@@ -33,7 +32,7 @@ type RemoteRepo struct {
// List of architectures to fetch, if empty, then fetch all architectures
Architectures []string
// Meta-information about repository
Meta debc.Paragraph
Meta Stanza
// Last update date
LastDownloadDate time.Time
// "Snapshot" of current list of packages
@@ -109,18 +108,13 @@ func (repo *RemoteRepo) Fetch(d utils.Downloader) error {
}
defer release.Close()
paras, err := debc.Parse(release)
sreader := NewControlFileReader(release)
stanza, err := sreader.ReadStanza()
if err != nil {
return err
}
if len(paras) != 1 {
return fmt.Errorf("wrong number of parts in Release file")
}
para := paras[0]
architectures := strings.Split(para["Architectures"], " ")
architectures := strings.Split(stanza["Architectures"], " ")
if len(repo.Architectures) == 0 {
repo.Architectures = architectures
} else {
@@ -131,7 +125,7 @@ func (repo *RemoteRepo) Fetch(d utils.Downloader) error {
}
}
components := strings.Split(para["Components"], " ")
components := strings.Split(stanza["Components"], " ")
if len(repo.Components) == 0 {
repo.Components = components
} else {
@@ -142,10 +136,10 @@ func (repo *RemoteRepo) Fetch(d utils.Downloader) error {
}
}
delete(para, "MD5Sum")
delete(para, "SHA1")
delete(para, "SHA256")
repo.Meta = para
delete(stanza, "MD5Sum")
delete(stanza, "SHA1")
delete(stanza, "SHA256")
repo.Meta = stanza
return nil
}
@@ -163,13 +157,18 @@ func (repo *RemoteRepo) Download(d utils.Downloader, packageCollection *PackageC
}
defer packagesFile.Close()
paras, err := debc.Parse(packagesReader)
if err != nil {
return err
}
sreader := NewControlFileReader(packagesReader)
for _, para := range paras {
p := NewPackageFromControlFile(para)
for {
stanza, err := sreader.ReadStanza()
if err != nil {
return err
}
if stanza == nil {
break
}
p := NewPackageFromControlFile(stanza)
list.Add(p)
}

23
debian/remote_test.go vendored
View File

@@ -3,7 +3,6 @@ package debian
import (
"github.com/smira/aptly/database"
"github.com/smira/aptly/utils"
debc "github.com/smira/godebiancontrol"
. "launchpad.net/gocheck"
"testing"
)
@@ -22,21 +21,13 @@ type PackageListMixinSuite struct {
func (s *PackageListMixinSuite) SetUpPackages() {
s.list = NewPackageList()
paraGen := func() debc.Paragraph {
para := make(debc.Paragraph)
for k, v := range packagePara {
para[k] = v
}
return para
}
s.p1 = NewPackageFromControlFile(paraGen())
para := paraGen()
para["Package"] = "mars-invaders"
s.p2 = NewPackageFromControlFile(para)
para = paraGen()
para["Package"] = "lonely-strangers"
s.p3 = NewPackageFromControlFile(para)
s.p1 = NewPackageFromControlFile(packageStanza.Copy())
stanza := packageStanza.Copy()
stanza["Package"] = "mars-invaders"
s.p2 = NewPackageFromControlFile(stanza)
stanza = packageStanza.Copy()
stanza["Package"] = "lonely-strangers"
s.p3 = NewPackageFromControlFile(stanza)
s.list.Add(s.p1)
s.list.Add(s.p2)