mirror of
https://github.com/aptly-dev/aptly.git
synced 2026-06-07 05:42:42 +00:00
Introduce regexp query matching.
This commit is contained in:
+19
-2
@@ -3,6 +3,7 @@ package query
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/smira/aptly/deb"
|
||||
"regexp"
|
||||
"strings"
|
||||
"unicode"
|
||||
"unicode/utf8"
|
||||
@@ -135,7 +136,15 @@ func (p *parser) D() deb.PackageQuery {
|
||||
r, _ := utf8.DecodeRuneInString(field)
|
||||
if strings.HasPrefix(field, "$") || unicode.IsUpper(r) {
|
||||
// special field or regular field
|
||||
return &deb.FieldQuery{Field: field, Relation: operatorToRelation(operator), Value: value}
|
||||
q := &deb.FieldQuery{Field: field, Relation: operatorToRelation(operator), Value: value}
|
||||
if q.Relation == deb.VersionRegexp {
|
||||
var err error
|
||||
q.Regexp, err = regexp.Compile(q.Value)
|
||||
if err != nil {
|
||||
panic(fmt.Sprintf("regexp compile failed: %s", err))
|
||||
}
|
||||
}
|
||||
return q
|
||||
} else if operator == 0 && value == "" {
|
||||
if pkg, version, arch, ok := parsePackageRef(field); ok {
|
||||
// query for specific package
|
||||
@@ -144,11 +153,19 @@ func (p *parser) D() deb.PackageQuery {
|
||||
}
|
||||
|
||||
// regular dependency-like query
|
||||
return &deb.DependencyQuery{Dep: deb.Dependency{
|
||||
q := &deb.DependencyQuery{Dep: deb.Dependency{
|
||||
Pkg: field,
|
||||
Relation: operatorToRelation(operator),
|
||||
Version: value,
|
||||
Architecture: p.ArchCondition()}}
|
||||
if q.Dep.Relation == deb.VersionRegexp {
|
||||
var err error
|
||||
q.Dep.Regexp, err = regexp.Compile(q.Dep.Version)
|
||||
if err != nil {
|
||||
panic(fmt.Sprintf("regexp compile failed: %s", err))
|
||||
}
|
||||
}
|
||||
return q
|
||||
}
|
||||
|
||||
// condition := '(' <operator> value ')' |
|
||||
|
||||
+18
-1
@@ -3,6 +3,7 @@ package query
|
||||
import (
|
||||
"github.com/smira/aptly/deb"
|
||||
. "launchpad.net/gocheck"
|
||||
"regexp"
|
||||
)
|
||||
|
||||
type SyntaxSuite struct {
|
||||
@@ -32,7 +33,8 @@ func (s *SyntaxSuite) TestParsing(c *C) {
|
||||
c.Assert(err, IsNil)
|
||||
c.Check(q.(*deb.AndQuery).L, DeepEquals, &deb.DependencyQuery{Dep: deb.Dependency{Pkg: "package", Relation: deb.VersionDontCare}})
|
||||
c.Check(q.(*deb.AndQuery).R.(*deb.NotQuery).Q.(*deb.OrQuery).L, DeepEquals, &deb.FieldQuery{Field: "Name", Relation: deb.VersionDontCare})
|
||||
c.Check(q.(*deb.AndQuery).R.(*deb.NotQuery).Q.(*deb.OrQuery).R, DeepEquals, &deb.FieldQuery{Field: "$Source", Relation: deb.VersionRegexp, Value: "a.*"})
|
||||
c.Check(q.(*deb.AndQuery).R.(*deb.NotQuery).Q.(*deb.OrQuery).R, DeepEquals, &deb.FieldQuery{Field: "$Source", Relation: deb.VersionRegexp, Value: "a.*",
|
||||
Regexp: regexp.MustCompile("a.*")})
|
||||
|
||||
l, _ = lex("query", "package (> 5.3.7)")
|
||||
q, err = parse(l)
|
||||
@@ -40,6 +42,13 @@ func (s *SyntaxSuite) TestParsing(c *C) {
|
||||
c.Assert(err, IsNil)
|
||||
c.Check(q, DeepEquals, &deb.DependencyQuery{Dep: deb.Dependency{Pkg: "package", Relation: deb.VersionGreaterOrEqual, Version: "5.3.7"}})
|
||||
|
||||
l, _ = lex("query", "package (~ 5\\.3.*~dev)")
|
||||
q, err = parse(l)
|
||||
|
||||
c.Assert(err, IsNil)
|
||||
c.Check(q, DeepEquals, &deb.DependencyQuery{Dep: deb.Dependency{Pkg: "package", Relation: deb.VersionRegexp, Version: "5\\.3.*~dev",
|
||||
Regexp: regexp.MustCompile("5\\.3.*~dev")}})
|
||||
|
||||
l, _ = lex("query", "alien-data_1.3.4~dev_i386")
|
||||
q, err = parse(l)
|
||||
|
||||
@@ -78,4 +87,12 @@ func (s *SyntaxSuite) TestParsingErrors(c *C) {
|
||||
l, _ = lex("query", "'package )")
|
||||
_, err = parse(l)
|
||||
c.Check(err, ErrorMatches, "parsing failed: unexpected token error: unexpected eof in quoted string: expecting field or package name")
|
||||
|
||||
l, _ = lex("query", "package (~ 1.2[34)")
|
||||
_, err = parse(l)
|
||||
c.Check(err, ErrorMatches, "parsing failed: regexp compile failed: error parsing regexp: missing closing \\]: `\\[34`")
|
||||
|
||||
l, _ = lex("query", "$Name (~ 1.2[34)")
|
||||
_, err = parse(l)
|
||||
c.Check(err, ErrorMatches, "parsing failed: regexp compile failed: error parsing regexp: missing closing \\]: `\\[34`")
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user