mirror of
https://github.com/aptly-dev/aptly.git
synced 2026-04-20 19:38:39 +00:00
Fix to support dependency variants.
This commit is contained in:
32
debian/list.go
vendored
32
debian/list.go
vendored
@@ -109,24 +109,36 @@ func (l *PackageList) VerifyDependencies(options int, architectures []string, so
|
|||||||
}
|
}
|
||||||
|
|
||||||
for _, dep := range p.GetDependencies(options) {
|
for _, dep := range p.GetDependencies(options) {
|
||||||
dep, err := parseDependency(dep)
|
variants, err := parseDependencyVariants(dep)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("unable to process package %s: %s", p, err)
|
return nil, fmt.Errorf("unable to process package %s: %s", p, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
dep.Architecture = arch
|
variantsMissing := make([]Dependency, 0, len(variants))
|
||||||
|
|
||||||
hash := dep.Hash()
|
for _, dep := range variants {
|
||||||
_, ok := cache[hash]
|
dep.Architecture = arch
|
||||||
if ok {
|
|
||||||
continue
|
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 {
|
if options&DepFollowAllVariants == DepFollowAllVariants {
|
||||||
missing = append(missing, dep)
|
missing = append(missing, variantsMissing...)
|
||||||
cache[hash] = false
|
|
||||||
} else {
|
} else {
|
||||||
cache[hash] = true
|
if len(variantsMissing) == len(variants) {
|
||||||
|
missing = append(missing, variantsMissing...)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
15
debian/list_test.go
vendored
15
debian/list_test.go
vendored
@@ -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: "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: "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: "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: "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: "aa", Version: "2.0-1", Architecture: "i386", PreDepends: []string{"dpkg (>= 1.6)"}},
|
||||||
&Package{Name: "dpkg", Version: "1.6.1-3", Architecture: "amd64"},
|
&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 {
|
for _, p := range s.packages {
|
||||||
s.pl.Add(p)
|
s.pl.Add(p)
|
||||||
@@ -218,6 +220,17 @@ func (s *PackageIndexedListSuite) TestVerifyDependencies(c *C) {
|
|||||||
c.Check(err, IsNil)
|
c.Check(err, IsNil)
|
||||||
c.Check(missing, DeepEquals, []Dependency{Dependency{Pkg: "lib", Relation: VersionGreater, Version: "0.9", Architecture: "amd64"}})
|
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)
|
_, err = s.pl.VerifyDependencies(0, []string{"i386", "amd64", "s390"}, s.list)
|
||||||
|
|
||||||
c.Check(err, ErrorMatches, "unable to process package app-1.0_s390:.*")
|
c.Check(err, ErrorMatches, "unable to process package app-1.0_s390:.*")
|
||||||
|
|||||||
15
debian/version.go
vendored
15
debian/version.go
vendored
@@ -213,6 +213,21 @@ func (d *Dependency) String() string {
|
|||||||
return fmt.Sprintf("%s (%s %s) [%s]", d.Pkg, rel, d.Version, d.Architecture)
|
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
|
// parseDependency parses dependency in format "pkg (>= 1.35)" into parts
|
||||||
func parseDependency(dep string) (d Dependency, err error) {
|
func parseDependency(dep string) (d Dependency, err error) {
|
||||||
if !strings.HasSuffix(dep, ")") {
|
if !strings.HasSuffix(dep, ")") {
|
||||||
|
|||||||
21
debian/version_test.go
vendored
21
debian/version_test.go
vendored
@@ -154,6 +154,27 @@ func (s *VersionSuite) TestParseDependency(c *C) {
|
|||||||
c.Check(e, ErrorMatches, "unable to parse.*")
|
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) {
|
func (s *VersionSuite) TestDependencyString(c *C) {
|
||||||
d, _ := parseDependency("dpkg(>>1.6)")
|
d, _ := parseDependency("dpkg(>>1.6)")
|
||||||
d.Architecture = "i386"
|
d.Architecture = "i386"
|
||||||
|
|||||||
Reference in New Issue
Block a user