Fix to support dependency variants.

This commit is contained in:
Andrey Smirnov
2014-01-09 14:38:36 +04:00
parent ba30a42d6d
commit 10da8330b0
4 changed files with 72 additions and 11 deletions

32
debian/list.go vendored
View File

@@ -109,24 +109,36 @@ func (l *PackageList) VerifyDependencies(options int, architectures []string, so
}
for _, dep := range p.GetDependencies(options) {
dep, err := parseDependency(dep)
variants, err := parseDependencyVariants(dep)
if err != nil {
return nil, fmt.Errorf("unable to process package %s: %s", p, err)
}
dep.Architecture = arch
variantsMissing := make([]Dependency, 0, len(variants))
hash := dep.Hash()
_, ok := cache[hash]
if ok {
continue
for _, dep := range variants {
dep.Architecture = arch
hash := dep.Hash()
_, ok := cache[hash]
if ok {
continue
}
if sources.Search(dep) == nil {
variantsMissing = append(variantsMissing, dep)
cache[hash] = false
} else {
cache[hash] = true
}
}
if sources.Search(dep) == nil {
missing = append(missing, dep)
cache[hash] = false
if options&DepFollowAllVariants == DepFollowAllVariants {
missing = append(missing, variantsMissing...)
} else {
cache[hash] = true
if len(variantsMissing) == len(variants) {
missing = append(missing, variantsMissing...)
}
}
}
}

15
debian/list_test.go vendored
View File

@@ -164,10 +164,12 @@ func (s *PackageIndexedListSuite) SetUpTest(c *C) {
&Package{Name: "app", Version: "1.1~bp1", Architecture: "i386", PreDepends: []string{"dpkg (>= 1.6)"}, Depends: []string{"lib (>> 0.9)", "data (>= 1.0)"}},
&Package{Name: "mailer", Version: "3.5.8", Architecture: "i386", Provides: "mail-agent"},
&Package{Name: "app", Version: "1.1~bp1", Architecture: "amd64", PreDepends: []string{"dpkg (>= 1.6)"}, Depends: []string{"lib (>> 0.9)", "data (>= 1.0)"}},
&Package{Name: "app", Version: "1.1~bp1", Architecture: "arm", PreDepends: []string{"dpkg (>= 1.6)"}, Depends: []string{"lib (>> 0.9)", "data (>= 1.0)"}},
&Package{Name: "app", Version: "1.1~bp1", Architecture: "arm", PreDepends: []string{"dpkg (>= 1.6)"}, Depends: []string{"lib (>> 0.9) | libx (>= 1.5)", "data (>= 1.0) | mail-agent"}},
&Package{Name: "app", Version: "1.0", Architecture: "s390", PreDepends: []string{"dpkg >= 1.6)"}, Depends: []string{"lib (>> 0.9)", "data (>= 1.0)"}},
&Package{Name: "aa", Version: "2.0-1", Architecture: "i386", PreDepends: []string{"dpkg (>= 1.6)"}},
&Package{Name: "dpkg", Version: "1.6.1-3", Architecture: "amd64"},
&Package{Name: "libx", Version: "1.5", Architecture: "arm", PreDepends: []string{"dpkg (>= 1.6)"}},
&Package{Name: "dpkg", Version: "1.6.1-3", Architecture: "arm"},
}
for _, p := range s.packages {
s.pl.Add(p)
@@ -218,6 +220,17 @@ func (s *PackageIndexedListSuite) TestVerifyDependencies(c *C) {
c.Check(err, IsNil)
c.Check(missing, DeepEquals, []Dependency{Dependency{Pkg: "lib", Relation: VersionGreater, Version: "0.9", Architecture: "amd64"}})
missing, err = s.pl.VerifyDependencies(0, []string{"arm"}, s.list)
c.Check(err, IsNil)
c.Check(missing, DeepEquals, []Dependency{})
missing, err = s.pl.VerifyDependencies(DepFollowAllVariants, []string{"arm"}, s.list)
c.Check(err, IsNil)
c.Check(missing, DeepEquals, []Dependency{Dependency{Pkg: "lib", Relation: VersionGreater, Version: "0.9", Architecture: "arm"},
Dependency{Pkg: "mail-agent", Relation: VersionDontCare, Version: "", Architecture: "arm"}})
_, err = s.pl.VerifyDependencies(0, []string{"i386", "amd64", "s390"}, s.list)
c.Check(err, ErrorMatches, "unable to process package app-1.0_s390:.*")

15
debian/version.go vendored
View File

@@ -213,6 +213,21 @@ func (d *Dependency) String() string {
return fmt.Sprintf("%s (%s %s) [%s]", d.Pkg, rel, d.Version, d.Architecture)
}
// parseDependencyVariants parses dependencies in format "pkg (>= 1.35) | other-package"
func parseDependencyVariants(variants string) (l []Dependency, err error) {
parts := strings.Split(variants, "|")
l = make([]Dependency, len(parts))
for i, part := range parts {
l[i], err = parseDependency(strings.TrimSpace(part))
if err != nil {
return nil, err
}
}
return
}
// parseDependency parses dependency in format "pkg (>= 1.35)" into parts
func parseDependency(dep string) (d Dependency, err error) {
if !strings.HasSuffix(dep, ")") {

View File

@@ -154,6 +154,27 @@ func (s *VersionSuite) TestParseDependency(c *C) {
c.Check(e, ErrorMatches, "unable to parse.*")
}
func (s *VersionSuite) TestParseDependencyVariants(c *C) {
l, e := parseDependencyVariants("dpkg (>= 1.6)")
c.Check(e, IsNil)
c.Check(l, HasLen, 1)
c.Check(l[0].Pkg, Equals, "dpkg")
c.Check(l[0].Relation, Equals, VersionGreaterOrEqual)
c.Check(l[0].Version, Equals, "1.6")
l, e = parseDependencyVariants("dpkg (>= 1.6) | mailer-agent")
c.Check(e, IsNil)
c.Check(l, HasLen, 2)
c.Check(l[0].Pkg, Equals, "dpkg")
c.Check(l[0].Relation, Equals, VersionGreaterOrEqual)
c.Check(l[0].Version, Equals, "1.6")
c.Check(l[1].Pkg, Equals, "mailer-agent")
c.Check(l[1].Relation, Equals, VersionDontCare)
_, e = parseDependencyVariants("dpkg(==1.6)")
c.Check(e, ErrorMatches, "relation unknown.*")
}
func (s *VersionSuite) TestDependencyString(c *C) {
d, _ := parseDependency("dpkg(>>1.6)")
d.Architecture = "i386"