diff --git a/debian/list.go b/debian/list.go index 80cab2ac..189448a9 100644 --- a/debian/list.go +++ b/debian/list.go @@ -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 } diff --git a/debian/version.go b/debian/version.go index f66b3843..b3203f56 100644 --- a/debian/version.go +++ b/debian/version.go @@ -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) } diff --git a/debian/version_test.go b/debian/version_test.go index 2f448678..7d83cf21 100644 --- a/debian/version_test.go +++ b/debian/version_test.go @@ -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.*") }