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
+9 -7
View File
@@ -66,8 +66,8 @@ const (
// VerifyDependencies looks for missing dependencies in package list. // VerifyDependencies looks for missing dependencies in package list.
// //
// Analysis would be peformed for each architecture // Analysis would be peformed for each architecture
func (l *PackageList) VerifyDependencies(options int, architectures []string, sources *PackageIndexedList) ([]string, error) { func (l *PackageList) VerifyDependencies(options int, architectures []string, sources *PackageIndexedList) ([]Dependency, error) {
missing := make([]string, 0, 100) missing := make([]Dependency, 0, 100)
for _, arch := range architectures { for _, arch := range architectures {
for _, p := range l.packages { for _, p := range l.packages {
@@ -76,13 +76,15 @@ func (l *PackageList) VerifyDependencies(options int, architectures []string, so
} }
for _, dep := range p.GetDependencies(options) { for _, dep := range p.GetDependencies(options) {
pkg, relation, version, err := parseDependency(dep) dep, err := parseDependency(dep)
if err != nil { 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 { dep.Architecture = arch
missing = append(missing, fmt.Sprintf("%s [%s]", formatDependency(pkg, relation, version), 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 // 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 return nil
} }
+19 -11
View File
@@ -180,11 +180,19 @@ const (
VersionGreater 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 // 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, ")") { if !strings.HasSuffix(dep, ")") {
pkg = strings.TrimSpace(dep) d.Pkg = strings.TrimSpace(dep)
relation = VersionDontCare d.Relation = VersionDontCare
return return
} }
@@ -194,27 +202,27 @@ func parseDependency(dep string) (pkg string, relation int, version string, err
return return
} }
pkg = strings.TrimSpace(dep[0:i]) d.Pkg = strings.TrimSpace(dep[0:i])
rel := dep[i+1 : i+2] rel := dep[i+1 : i+2]
if dep[i+2] == '>' || dep[i+2] == '<' || dep[i+2] == '=' { if dep[i+2] == '>' || dep[i+2] == '<' || dep[i+2] == '=' {
rel += dep[i+2 : i+3] 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 { } else {
version = strings.TrimSpace(dep[i+2 : len(dep)-1]) d.Version = strings.TrimSpace(dep[i+2 : len(dep)-1])
} }
switch rel { switch rel {
case "<", "<=": case "<", "<=":
relation = VersionLessOrEqual d.Relation = VersionLessOrEqual
case ">", ">=": case ">", ">=":
relation = VersionGreaterOrEqual d.Relation = VersionGreaterOrEqual
case "<<": case "<<":
relation = VersionLess d.Relation = VersionLess
case ">>": case ">>":
relation = VersionGreater d.Relation = VersionGreater
case "=": case "=":
relation = VersionEqual d.Relation = VersionEqual
default: default:
err = fmt.Errorf("relation unknown: %s", rel) err = fmt.Errorf("relation unknown: %s", rel)
} }
+34 -34
View File
@@ -99,57 +99,57 @@ func (s *VersionSuite) TestCompareVersions(c *C) {
} }
func (s *VersionSuite) TestParseDependency(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(e, IsNil)
c.Check(p, Equals, "dpkg") c.Check(d.Pkg, Equals, "dpkg")
c.Check(r, Equals, VersionGreaterOrEqual) c.Check(d.Relation, Equals, VersionGreaterOrEqual)
c.Check(v, Equals, "1.6") 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(e, IsNil)
c.Check(p, Equals, "dpkg") c.Check(d.Pkg, Equals, "dpkg")
c.Check(r, Equals, VersionGreater) c.Check(d.Relation, Equals, VersionGreater)
c.Check(v, Equals, "1.6") 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(e, IsNil)
c.Check(p, Equals, "dpkg") c.Check(d.Pkg, Equals, "dpkg")
c.Check(r, Equals, VersionGreaterOrEqual) c.Check(d.Relation, Equals, VersionGreaterOrEqual)
c.Check(v, Equals, "1.6") 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(e, IsNil)
c.Check(p, Equals, "dpkg") c.Check(d.Pkg, Equals, "dpkg")
c.Check(r, Equals, VersionLessOrEqual) c.Check(d.Relation, Equals, VersionLessOrEqual)
c.Check(v, Equals, "1.6") 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(e, IsNil)
c.Check(p, Equals, "dpkg") c.Check(d.Pkg, Equals, "dpkg")
c.Check(r, Equals, VersionEqual) c.Check(d.Relation, Equals, VersionEqual)
c.Check(v, Equals, "1.6") 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(e, IsNil)
c.Check(p, Equals, "dpkg") c.Check(d.Pkg, Equals, "dpkg")
c.Check(r, Equals, VersionLess) c.Check(d.Relation, Equals, VersionLess)
c.Check(v, Equals, "1.6") 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(e, IsNil)
c.Check(p, Equals, "dpkg") c.Check(d.Pkg, Equals, "dpkg")
c.Check(r, Equals, VersionGreater) c.Check(d.Relation, Equals, VersionGreater)
c.Check(v, Equals, "1.6") c.Check(d.Version, Equals, "1.6")
p, r, v, e = parseDependency("dpkg ") d, e = parseDependency("dpkg ")
c.Check(e, IsNil) c.Check(e, IsNil)
c.Check(p, Equals, "dpkg") c.Check(d.Pkg, Equals, "dpkg")
c.Check(r, Equals, VersionDontCare) c.Check(d.Relation, Equals, VersionDontCare)
c.Check(v, Equals, "") 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.*") 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.*") c.Check(e, ErrorMatches, "unable to parse.*")
} }