diff --git a/deb/package.go b/deb/package.go index 65b373e4..d269ff68 100644 --- a/deb/package.go +++ b/deb/package.go @@ -188,6 +188,70 @@ func (p *Package) String() string { return fmt.Sprintf("%s_%s_%s", p.Name, p.Version, p.Architecture) } +// GetField returns fields from package +func (p *Package) GetField(name string) string { + switch name { + // $Version is handled in FieldQuery + case "$Source": + if p.IsSource { + return "" + } + source := p.Source + if source == "" { + return p.Name + } else if pos := strings.Index(source, "("); pos != -1 { + return strings.TrimSpace(source[:pos]) + } + return source + case "$SourceVersion": + if p.IsSource { + return "" + } + source := p.Source + if pos := strings.Index(source, "("); pos != -1 { + if pos2 := strings.LastIndex(source, ")"); pos2 != -1 && pos2 > pos { + return strings.TrimSpace(source[pos+1 : pos2]) + } + } + return p.Version + case "$Architecture": + return p.Architecture + case "$PackageType": + if p.IsSource { + return "source" + } + return "deb" + case "Name": + return p.Name + case "Version": + return p.Version + case "Architecture": + if p.IsSource { + return p.SourceArchitecture + } + return p.Architecture + case "Source": + return p.Source + case "Depends": + return strings.Join(p.Deps().Depends, ", ") + case "Pre-Depends": + return strings.Join(p.Deps().PreDepends, ", ") + case "Suggests": + return strings.Join(p.Deps().Suggests, ", ") + case "Recommends": + return strings.Join(p.Deps().Recommends, ", ") + case "Provides": + return strings.Join(p.Provides, ", ") + case "Build-Depends": + return strings.Join(p.Deps().BuildDepends, ", ") + case "Build-Depends-Indep": + return strings.Join(p.Deps().BuildDependsInDep, ", ") + default: + return p.Extra()[name] + } + return "" +} + // MatchesArchitecture checks whether packages matches specified architecture func (p *Package) MatchesArchitecture(arch string) bool { if p.Architecture == "all" && arch != "source" { diff --git a/deb/package_test.go b/deb/package_test.go index cb417e70..a9b203b6 100644 --- a/deb/package_test.go +++ b/deb/package_test.go @@ -119,6 +119,58 @@ func (s *PackageSuite) TestString(c *C) { c.Assert(p.String(), Equals, "alien-arena-common_7.40-2_i386") } +func (s *PackageSuite) TestGetField(c *C) { + p := NewPackageFromControlFile(s.stanza.Copy()) + + stanza2 := s.stanza.Copy() + delete(stanza2, "Source") + stanza2["Provides"] = "app, game" + p2 := NewPackageFromControlFile(stanza2) + + stanza3 := s.stanza.Copy() + stanza3["Source"] = "alien-arena (3.5)" + p3 := NewPackageFromControlFile(stanza3) + + p4, _ := NewSourcePackageFromControlFile(s.sourceStanza.Copy()) + + c.Check(p.GetField("$Source"), Equals, "alien-arena") + c.Check(p2.GetField("$Source"), Equals, "alien-arena-common") + c.Check(p3.GetField("$Source"), Equals, "alien-arena") + c.Check(p4.GetField("$Source"), Equals, "") + + c.Check(p.GetField("$SourceVersion"), Equals, "7.40-2") + c.Check(p2.GetField("$SourceVersion"), Equals, "7.40-2") + c.Check(p3.GetField("$SourceVersion"), Equals, "3.5") + c.Check(p4.GetField("$SourceVersion"), Equals, "") + + c.Check(p.GetField("$Architecture"), Equals, "i386") + c.Check(p4.GetField("$Architecture"), Equals, "source") + + c.Check(p.GetField("$PackageType"), Equals, "deb") + c.Check(p4.GetField("$PackageType"), Equals, "source") + + c.Check(p.GetField("Name"), Equals, "alien-arena-common") + c.Check(p4.GetField("Name"), Equals, "access-modifier-checker") + + c.Check(p.GetField("Architecture"), Equals, "i386") + c.Check(p4.GetField("Architecture"), Equals, "all") + + c.Check(p.GetField("Version"), Equals, "7.40-2") + + c.Check(p.GetField("Source"), Equals, "alien-arena") + c.Check(p2.GetField("Source"), Equals, "") + c.Check(p3.GetField("Source"), Equals, "alien-arena (3.5)") + c.Check(p4.GetField("Source"), Equals, "") + + c.Check(p.GetField("Depends"), Equals, "libc6 (>= 2.7), alien-arena-data (>= 7.40)") + + c.Check(p.GetField("Provides"), Equals, "") + c.Check(p2.GetField("Provides"), Equals, "app, game") + + c.Check(p.GetField("Section"), Equals, "contrib/games") + c.Check(p.GetField("Priority"), Equals, "extra") +} + func (s *PackageSuite) TestEquals(c *C) { p := NewPackageFromControlFile(s.stanza)