From 782ac1a36a2a45456755c3d6035055c4c5af894a Mon Sep 17 00:00:00 2001 From: Andrey Smirnov Date: Wed, 18 Mar 2015 22:19:12 +0300 Subject: [PATCH] ChangesFile can produce Query each package file should satisfy. #71 --- deb/changes.go | 44 ++++++++++++++++++++++++++++++++++++++++++++ deb/changes_test.go | 34 +++++++++++++++++++++++++++------- 2 files changed, 71 insertions(+), 7 deletions(-) diff --git a/deb/changes.go b/deb/changes.go index 084e9258..b0b67afa 100644 --- a/deb/changes.go +++ b/deb/changes.go @@ -18,6 +18,9 @@ type Changes struct { Files PackageFiles BasePath, ChangesName string TempDir string + Source string + Binary []string + Architectures []string Stanza Stanza } @@ -90,6 +93,9 @@ func (c *Changes) VerifyAndParse(acceptUnsigned, ignoreSignature bool, verifier c.Distribution = c.Stanza["Distribution"] c.Changes = c.Stanza["Changes"] + c.Source = c.Stanza["Source"] + c.Binary = strings.Fields(c.Stanza["Binary"]) + c.Architectures = strings.Fields(c.Stanza["Architecture"]) c.Files, err = c.Files.ParseSumFields(c.Stanza) if err != nil { @@ -153,6 +159,44 @@ func (c *Changes) Cleanup() error { return os.RemoveAll(c.TempDir) } +// PackageQuery returns query that every package should match to be included +func (c *Changes) PackageQuery() (PackageQuery, error) { + var archQuery PackageQuery = &FieldQuery{Field: "$Architecture", Relation: VersionEqual, Value: ""} + for _, arch := range c.Architectures { + archQuery = &OrQuery{L: &FieldQuery{Field: "$Architecture", Relation: VersionEqual, Value: arch}, R: archQuery} + } + + // if c.Source is empty, this would never match + sourceQuery := &AndQuery{ + L: &FieldQuery{Field: "$PackageType", Relation: VersionEqual, Value: "source"}, + R: &FieldQuery{Field: "Name", Relation: VersionEqual, Value: c.Source}, + } + + var binaryQuery PackageQuery + if len(c.Binary) > 0 { + binaryQuery = &FieldQuery{Field: "Name", Relation: VersionEqual, Value: c.Binary[0]} + for _, binary := range c.Binary[1:] { + binaryQuery = &OrQuery{ + L: &FieldQuery{Field: "Name", Relation: VersionEqual, Value: binary}, + R: binaryQuery, + } + } + + binaryQuery = &AndQuery{ + L: &NotQuery{Q: &FieldQuery{Field: "$PackageType", Relation: VersionEqual, Value: "source"}}, + R: binaryQuery} + } + + var nameQuery PackageQuery + if binaryQuery == nil { + nameQuery = sourceQuery + } else { + nameQuery = &OrQuery{L: sourceQuery, R: binaryQuery} + } + + return &AndQuery{L: archQuery, R: nameQuery}, nil +} + // CollectChangesFiles walks filesystem collecting all .changes files func CollectChangesFiles(locations []string, reporter aptly.ResultReporter) (changesFiles, failedFiles []string) { for _, location := range locations { diff --git a/deb/changes_test.go b/deb/changes_test.go index 058e7fb8..9d99fa5e 100644 --- a/deb/changes_test.go +++ b/deb/changes_test.go @@ -7,22 +7,25 @@ import ( ) type ChangesSuite struct { + Dir, Path string } var _ = Suite(&ChangesSuite{}) -func (s *ChangesSuite) TestParseAndVerify(c *C) { - dir := c.MkDir() - path := filepath.Join(dir, "calamares.changes") +func (s *ChangesSuite) SetUpTest(c *C) { + s.Dir = c.MkDir() + s.Path = filepath.Join(s.Dir, "calamares.changes") - f, err := os.Create(path) + f, err := os.Create(s.Path) c.Assert(err, IsNil) f.WriteString(changesFile) f.Close() +} - changes, err := NewChanges(path) - c.Check(err, IsNil) +func (s *ChangesSuite) TestParseAndVerify(c *C) { + changes, err := NewChanges(s.Path) + c.Assert(err, IsNil) err = changes.VerifyAndParse(true, true, &NullVerifier{}) c.Check(err, IsNil) @@ -34,7 +37,24 @@ func (s *ChangesSuite) TestParseAndVerify(c *C) { c.Check(changes.Files[0].Checksums.MD5, Equals, "05fd8f3ffe8f362c5ef9bad2f936a56e") c.Check(changes.Files[0].Checksums.SHA1, Equals, "79f10e955dab6eb25b7f7bae18213f367a3a0396") c.Check(changes.Files[0].Checksums.SHA256, Equals, "35b3280a7b1ffe159a276128cb5c408d687318f60ecbb8ab6dedb2e49c4e82dc") - c.Check(changes.BasePath, Equals, dir) + c.Check(changes.BasePath, Equals, s.Dir) + c.Check(changes.Architectures, DeepEquals, []string{"source", "amd64"}) + c.Check(changes.Source, Equals, "calamares") + c.Check(changes.Binary, DeepEquals, []string{"calamares", "calamares-dbg"}) +} + +func (s *ChangesSuite) TestPackageQuery(c *C) { + changes, err := NewChanges(s.Path) + c.Assert(err, IsNil) + + err = changes.VerifyAndParse(true, true, &NullVerifier{}) + c.Check(err, IsNil) + + q, err := changes.PackageQuery() + c.Check(err, IsNil) + + c.Check(q.String(), Equals, + "(($Architecture (= amd64)) | (($Architecture (= source)) | ($Architecture (= )))), ((($PackageType (= source)), (Name (= calamares))) | ((!($PackageType (= source))), ((Name (= calamares-dbg)) | (Name (= calamares)))))") } var changesFile = `Format: 1.8