Refactor to use single struct Dependency.

This commit is contained in:
Andrey Smirnov
2014-01-08 18:38:02 +04:00
parent 4969c31e38
commit 5dbb771ba8
3 changed files with 62 additions and 52 deletions

16
debian/list.go vendored
View File

@@ -66,8 +66,8 @@ const (
// VerifyDependencies looks for missing dependencies in package list.
//
// Analysis would be peformed for each architecture
func (l *PackageList) VerifyDependencies(options int, architectures []string, sources *PackageIndexedList) ([]string, error) {
missing := make([]string, 0, 100)
func (l *PackageList) VerifyDependencies(options int, architectures []string, sources *PackageIndexedList) ([]Dependency, error) {
missing := make([]Dependency, 0, 100)
for _, arch := range architectures {
for _, p := range l.packages {
@@ -76,13 +76,15 @@ func (l *PackageList) VerifyDependencies(options int, architectures []string, so
}
for _, dep := range p.GetDependencies(options) {
pkg, relation, version, err := parseDependency(dep)
dep, err := parseDependency(dep)
if err != nil {
return nil, fmt.Errorf("unable to process pkg %s: %s", p, err)
return nil, fmt.Errorf("unable to process package %s: %s", p, err)
}
if sources.Search(arch, pkg, relation, version) != nil {
missing = append(missing, fmt.Sprintf("%s [%s]", formatDependency(pkg, relation, version), arch))
dep.Architecture = arch
if sources.Search(dep) != nil {
missing = append(missing, dep)
}
}
}
@@ -151,7 +153,7 @@ func (l *PackageIndexedList) Append(pl *PackageList) {
}
// Search searches package index for specified package
func (l *PackageIndexedList) Search(arch string, pkg string, relation int, version string) *Package {
func (l *PackageIndexedList) Search(dep Dependency) *Package {
return nil
}

30
debian/version.go vendored
View File

@@ -180,11 +180,19 @@ const (
VersionGreater
)
// Dependency is a parsed version of Debian dependency to package
type Dependency struct {
Pkg string
Relation int
Version string
Architecture string
}
// parseDependency parses dependency in format "pkg (>= 1.35)" into parts
func parseDependency(dep string) (pkg string, relation int, version string, err error) {
func parseDependency(dep string) (d Dependency, err error) {
if !strings.HasSuffix(dep, ")") {
pkg = strings.TrimSpace(dep)
relation = VersionDontCare
d.Pkg = strings.TrimSpace(dep)
d.Relation = VersionDontCare
return
}
@@ -194,27 +202,27 @@ func parseDependency(dep string) (pkg string, relation int, version string, err
return
}
pkg = strings.TrimSpace(dep[0:i])
d.Pkg = strings.TrimSpace(dep[0:i])
rel := dep[i+1 : i+2]
if dep[i+2] == '>' || dep[i+2] == '<' || dep[i+2] == '=' {
rel += dep[i+2 : i+3]
version = strings.TrimSpace(dep[i+3 : len(dep)-1])
d.Version = strings.TrimSpace(dep[i+3 : len(dep)-1])
} else {
version = strings.TrimSpace(dep[i+2 : len(dep)-1])
d.Version = strings.TrimSpace(dep[i+2 : len(dep)-1])
}
switch rel {
case "<", "<=":
relation = VersionLessOrEqual
d.Relation = VersionLessOrEqual
case ">", ">=":
relation = VersionGreaterOrEqual
d.Relation = VersionGreaterOrEqual
case "<<":
relation = VersionLess
d.Relation = VersionLess
case ">>":
relation = VersionGreater
d.Relation = VersionGreater
case "=":
relation = VersionEqual
d.Relation = VersionEqual
default:
err = fmt.Errorf("relation unknown: %s", rel)
}

View File

@@ -99,57 +99,57 @@ func (s *VersionSuite) TestCompareVersions(c *C) {
}
func (s *VersionSuite) TestParseDependency(c *C) {
p, r, v, e := parseDependency("dpkg (>= 1.6)")
d, e := parseDependency("dpkg (>= 1.6)")
c.Check(e, IsNil)
c.Check(p, Equals, "dpkg")
c.Check(r, Equals, VersionGreaterOrEqual)
c.Check(v, Equals, "1.6")
c.Check(d.Pkg, Equals, "dpkg")
c.Check(d.Relation, Equals, VersionGreaterOrEqual)
c.Check(d.Version, Equals, "1.6")
p, r, v, e = parseDependency("dpkg(>>1.6)")
d, e = parseDependency("dpkg(>>1.6)")
c.Check(e, IsNil)
c.Check(p, Equals, "dpkg")
c.Check(r, Equals, VersionGreater)
c.Check(v, Equals, "1.6")
c.Check(d.Pkg, Equals, "dpkg")
c.Check(d.Relation, Equals, VersionGreater)
c.Check(d.Version, Equals, "1.6")
p, r, v, e = parseDependency("dpkg (> 1.6)")
d, e = parseDependency("dpkg (> 1.6)")
c.Check(e, IsNil)
c.Check(p, Equals, "dpkg")
c.Check(r, Equals, VersionGreaterOrEqual)
c.Check(v, Equals, "1.6")
c.Check(d.Pkg, Equals, "dpkg")
c.Check(d.Relation, Equals, VersionGreaterOrEqual)
c.Check(d.Version, Equals, "1.6")
p, r, v, e = parseDependency("dpkg (< 1.6)")
d, e = parseDependency("dpkg (< 1.6)")
c.Check(e, IsNil)
c.Check(p, Equals, "dpkg")
c.Check(r, Equals, VersionLessOrEqual)
c.Check(v, Equals, "1.6")
c.Check(d.Pkg, Equals, "dpkg")
c.Check(d.Relation, Equals, VersionLessOrEqual)
c.Check(d.Version, Equals, "1.6")
p, r, v, e = parseDependency("dpkg (= 1.6)")
d, e = parseDependency("dpkg (= 1.6)")
c.Check(e, IsNil)
c.Check(p, Equals, "dpkg")
c.Check(r, Equals, VersionEqual)
c.Check(v, Equals, "1.6")
c.Check(d.Pkg, Equals, "dpkg")
c.Check(d.Relation, Equals, VersionEqual)
c.Check(d.Version, Equals, "1.6")
p, r, v, e = parseDependency("dpkg (<< 1.6)")
d, e = parseDependency("dpkg (<< 1.6)")
c.Check(e, IsNil)
c.Check(p, Equals, "dpkg")
c.Check(r, Equals, VersionLess)
c.Check(v, Equals, "1.6")
c.Check(d.Pkg, Equals, "dpkg")
c.Check(d.Relation, Equals, VersionLess)
c.Check(d.Version, Equals, "1.6")
p, r, v, e = parseDependency("dpkg(>>1.6)")
d, e = parseDependency("dpkg(>>1.6)")
c.Check(e, IsNil)
c.Check(p, Equals, "dpkg")
c.Check(r, Equals, VersionGreater)
c.Check(v, Equals, "1.6")
c.Check(d.Pkg, Equals, "dpkg")
c.Check(d.Relation, Equals, VersionGreater)
c.Check(d.Version, Equals, "1.6")
p, r, v, e = parseDependency("dpkg ")
d, e = parseDependency("dpkg ")
c.Check(e, IsNil)
c.Check(p, Equals, "dpkg")
c.Check(r, Equals, VersionDontCare)
c.Check(v, Equals, "")
c.Check(d.Pkg, Equals, "dpkg")
c.Check(d.Relation, Equals, VersionDontCare)
c.Check(d.Version, Equals, "")
p, r, v, e = parseDependency("dpkg(==1.6)")
d, e = parseDependency("dpkg(==1.6)")
c.Check(e, ErrorMatches, "relation unknown.*")
p, r, v, e = parseDependency("dpkg==1.6)")
d, e = parseDependency("dpkg==1.6)")
c.Check(e, ErrorMatches, "unable to parse.*")
}