aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mod/build-config-module.cxx3
-rw-r--r--mod/mod-builds.cxx78
2 files changed, 23 insertions, 58 deletions
diff --git a/mod/build-config-module.cxx b/mod/build-config-module.cxx
index 35d9c0e..d21849e 100644
--- a/mod/build-config-module.cxx
+++ b/mod/build-config-module.cxx
@@ -361,9 +361,6 @@ namespace brep
return false;
}
- // @@ Here we don't suppose the wildcard pattern to contain the bracket
- // expressions, while we probably should.
- //
path build_config_module::
dash_components_to_path (const string& s)
{
diff --git a/mod/mod-builds.cxx b/mod/mod-builds.cxx
index d446133..71e7f7b 100644
--- a/mod/mod-builds.cxx
+++ b/mod/mod-builds.cxx
@@ -13,8 +13,7 @@
#include <odb/transaction.hxx>
#include <libbutl/timestamp.mxx> // to_string()
-#include <libbutl/filesystem.mxx> // path_match(), path_pattern(), literal(),
- // path_pattern_iterator
+#include <libbutl/filesystem.mxx> // path_match()
#include <libbbot/manifest.hxx> // to_result_status(), to_string(result_status)
@@ -67,66 +66,32 @@ init (scanner& s)
options_->root (dir_path ("/"));
}
-// Transform the wildcard to the SIMILAR TO-pattern.
+// Transform the wildcard to the LIKE-pattern.
//
static string
-transform (const string& pattern)
+transform (const string& s)
{
- if (pattern.empty ())
+ if (s.empty ())
return "%";
string r;
- for (const path_pattern_char& pc: path_pattern_iterator (pattern))
+ for (char c: s)
{
- switch (pc.type)
+ switch (c)
{
- case path_pattern_char_type::question_mark: r += '_'; break;
- case path_pattern_char_type::star: r += '%'; break;
- case path_pattern_char_type::bracket_expr:
- {
- size_t n (r.size ());
- r.append (pc.begin, pc.end);
-
- // Translate the inverse character, if present.
- //
- if (r[n + 1] == '!')
- r[n + 1] = '^';
-
- break;
- }
- case path_pattern_char_type::literal:
- {
- char c (literal (pc));
-
- // Note that '.' is not a special character for SIMILAR TO.
- //
- switch (c)
- {
- case '\\':
- case '%':
- case '_':
- case '|':
- case '+':
- case '{':
- case '(': r += '\\'; break;
- }
-
- r += c;
- break;
- }
+ case '*': c = '%'; break;
+ case '?': c = '_'; break;
+ case '\\':
+ case '%':
+ case '_': r += '\\'; break;
}
+
+ r += c;
}
return r;
}
-template <typename T, typename C>
-static inline query<T>
-match (const C qc, const string& pattern)
-{
- return qc + "SIMILAR TO" + query<T>::_val (transform (pattern));
-}
-
template <typename T>
static inline query<T>
build_query (const brep::cstrings* configs,
@@ -159,7 +124,8 @@ build_query (const brep::cstrings* configs,
// Package name.
//
if (!params.name ().empty ())
- q = q && match<T> (pid.name, params.name ());
+ q = q && pid.name.like (package_name (transform (params.name ()),
+ package_name::raw_string));
// Package version.
//
@@ -201,17 +167,17 @@ build_query (const brep::cstrings* configs,
// Build configuration name.
//
if (!params.configuration ().empty ())
- q = q && match<T> (qb::id.configuration, params.configuration ());
+ q = q && qb::id.configuration.like (transform (params.configuration ()));
// Build machine name.
//
if (!params.machine ().empty ())
- q = q && match<T> (qb::machine, params.machine ());
+ q = q && qb::machine.like (transform (params.machine ()));
// Build target.
//
if (!params.target ().empty ())
- q = q && match<T> (qb::target, params.target ());
+ q = q && qb::target.like (transform (params.target ()));
// Build result.
//
@@ -284,7 +250,8 @@ package_query (const brep::params::builds& params,
// Package name.
//
if (!params.name ().empty ())
- q = q && match<T> (qp::id.name, params.name ());
+ q = q && qp::id.name.like (
+ package_name (transform (params.name ()), package_name::raw_string));
// Package version.
//
@@ -499,8 +466,9 @@ handle (request& rq, response& rs)
// We will not display hidden configurations, unless the configuration is
// specified explicitly.
//
- bool exclude_hidden (params.configuration ().empty () ||
- path_pattern (params.configuration ()));
+ bool exclude_hidden (
+ params.configuration ().empty () ||
+ params.configuration ().find_first_of ("*?") != string::npos);
cstrings conf_names;