aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libbrep/package.cxx35
-rw-r--r--libbrep/package.hxx22
-rw-r--r--libbrep/package.xml90
-rw-r--r--load/load.cxx3
-rw-r--r--migrate/migrate.cxx33
-rw-r--r--mod/mod-package-details.cxx2
-rw-r--r--mod/mod-package-version-details.cxx2
-rw-r--r--mod/page.cxx58
-rw-r--r--mod/page.hxx22
-rw-r--r--tests/load/1/math/libfoo-1.2.4+1.tar.gzbin964 -> 990 bytes
-rw-r--r--tests/load/1/math/packages.manifest11
-rw-r--r--tests/load/1/misc/packages.manifest2
-rw-r--r--tests/load/1/stable/packages.manifest8
-rw-r--r--tests/load/1/stable/signature.manifest20
-rw-r--r--tests/load/driver.cxx45
-rw-r--r--www/package-details-body.css8
-rw-r--r--www/package-version-details-body.css8
17 files changed, 250 insertions, 119 deletions
diff --git a/libbrep/package.cxx b/libbrep/package.cxx
index 763cec9..6c6a565 100644
--- a/libbrep/package.cxx
+++ b/libbrep/package.cxx
@@ -57,7 +57,8 @@ namespace brep
priority_type pr,
string sm,
license_alternatives_type la,
- strings tg,
+ strings tp,
+ strings kw,
optional<string> ds,
optional<text_type> dt,
string ch,
@@ -87,7 +88,8 @@ namespace brep
priority (move (pr)),
summary (move (sm)),
license_alternatives (move (la)),
- tags (move (tg)),
+ topics (move (tp)),
+ keywords (move (kw)),
description (move (ds)),
description_type (move (dt)),
changes (move (ch)),
@@ -133,8 +135,8 @@ namespace brep
if (!internal ())
return weighted_text ();
- // Derive keywords from the basic package information: name,
- // version.
+ // Derive search keywords from the basic package information: project,
+ // name, and version.
//
//@@ What about 'stable' from cppget.org/stable? Add path of
// the repository to keywords? Or is it too "polluting" and
@@ -149,12 +151,7 @@ namespace brep
if (upstream_version)
k += " " + *upstream_version;
- // Add tags to keywords.
- //
- for (const auto& t: tags)
- k += " " + t;
-
- // Add licenses to keywords.
+ // Add licenses to search keywords.
//
for (const auto& la: license_alternatives)
{
@@ -162,7 +159,7 @@ namespace brep
{
k += " " + l;
- // If license is say LGPLv2 then LGPL is also a keyword.
+ // If license is say LGPLv2 then LGPL is also a search keyword.
//
size_t n (l.size ());
if (n > 2 && l[n - 2] == 'v' && l[n - 1] >= '0' && l[n - 1] <= '9')
@@ -170,7 +167,21 @@ namespace brep
}
}
- return {move (k), summary, description ? *description : "", changes};
+ // Derive second-strongest search keywords from the package summary.
+ //
+ string k2 (summary);
+
+ // Add topics to the second-strongest search keywords.
+ //
+ for (const auto& t: topics)
+ k2 += " " + t;
+
+ // Add keywords to the second-strongest search keywords.
+ //
+ for (const auto& k: keywords)
+ k2 += " " + k;
+
+ return {move (k), move (k2), description ? *description : "", changes};
}
// repository
diff --git a/libbrep/package.hxx b/libbrep/package.hxx
index c4304f6..18cd629 100644
--- a/libbrep/package.hxx
+++ b/libbrep/package.hxx
@@ -21,16 +21,16 @@
//
#define LIBBREP_PACKAGE_SCHEMA_VERSION_BASE 11
-#pragma db model version(LIBBREP_PACKAGE_SCHEMA_VERSION_BASE, 13, closed)
+#pragma db model version(LIBBREP_PACKAGE_SCHEMA_VERSION_BASE, 14, closed)
namespace brep
{
// @@ Might make sense to put some heavy members (e.g., description,
// containers) into a separate section.
//
- // @@ Not sure there is a benefit in making tags a full-blown container
- // (i.e., a separate table). Maybe provide a mapping of vector<string>
- // to TEXT as a comma-separated list.
+ // @@ Not sure there is a benefit in making topics/keywords full-blown
+ // containers (i.e., a separate table). Maybe provide a mapping of
+ // vector<string> to TEXT as a comma/space-separated list.
//
// Forward declarations.
@@ -366,7 +366,8 @@ namespace brep
priority_type,
string summary,
license_alternatives_type,
- strings tags,
+ strings topics,
+ strings keywords,
optional<string> description,
optional<text_type> description_type,
string changes,
@@ -418,7 +419,8 @@ namespace brep
priority_type priority;
string summary;
license_alternatives_type license_alternatives;
- strings tags;
+ strings topics;
+ strings keywords;
optional<string> description; // Absent if type is unknown.
optional<text_type> description_type; // Present if description is present.
string changes;
@@ -481,9 +483,13 @@ namespace brep
set(odb::nested_set (this.license_alternatives, std::move (?))) \
id_column("") key_column("") value_column("license")
- // tags
+ // topics
//
- #pragma db member(tags) id_column("") value_column("tag")
+ #pragma db member(topics) id_column("") value_column("topic")
+
+ // keywords
+ //
+ #pragma db member(keywords) id_column("") value_column("keyword")
// dependencies
//
diff --git a/libbrep/package.xml b/libbrep/package.xml
index a1e7602..1a4a5b2 100644
--- a/libbrep/package.xml
+++ b/libbrep/package.xml
@@ -1,4 +1,94 @@
<changelog xmlns="http://www.codesynthesis.com/xmlns/odb/changelog" database="pgsql" schema-name="package" version="1">
+ <changeset version="14">
+ <add-table name="package_topics" kind="container">
+ <column name="tenant" type="TEXT" null="false"/>
+ <column name="name" type="CITEXT" null="false"/>
+ <column name="version_epoch" type="INTEGER" null="false"/>
+ <column name="version_canonical_upstream" type="TEXT" null="false"/>
+ <column name="version_canonical_release" type="TEXT" null="false" options="COLLATE &quot;C&quot;"/>
+ <column name="version_revision" type="INTEGER" null="false"/>
+ <column name="index" type="BIGINT" null="false"/>
+ <column name="topic" type="TEXT" null="false"/>
+ <foreign-key name="tenant_fk" deferrable="DEFERRED">
+ <column name="tenant"/>
+ <references table="tenant">
+ <column name="id"/>
+ </references>
+ </foreign-key>
+ <foreign-key name="object_id_fk" on-delete="CASCADE">
+ <column name="tenant"/>
+ <column name="name"/>
+ <column name="version_epoch"/>
+ <column name="version_canonical_upstream"/>
+ <column name="version_canonical_release"/>
+ <column name="version_revision"/>
+ <references table="package">
+ <column name="tenant"/>
+ <column name="name"/>
+ <column name="version_epoch"/>
+ <column name="version_canonical_upstream"/>
+ <column name="version_canonical_release"/>
+ <column name="version_revision"/>
+ </references>
+ </foreign-key>
+ <index name="package_topics_object_id_i">
+ <column name="tenant"/>
+ <column name="name"/>
+ <column name="version_epoch"/>
+ <column name="version_canonical_upstream"/>
+ <column name="version_canonical_release"/>
+ <column name="version_revision"/>
+ </index>
+ <index name="package_topics_index_i">
+ <column name="index"/>
+ </index>
+ </add-table>
+ <add-table name="package_keywords" kind="container">
+ <column name="tenant" type="TEXT" null="false"/>
+ <column name="name" type="CITEXT" null="false"/>
+ <column name="version_epoch" type="INTEGER" null="false"/>
+ <column name="version_canonical_upstream" type="TEXT" null="false"/>
+ <column name="version_canonical_release" type="TEXT" null="false" options="COLLATE &quot;C&quot;"/>
+ <column name="version_revision" type="INTEGER" null="false"/>
+ <column name="index" type="BIGINT" null="false"/>
+ <column name="keyword" type="TEXT" null="false"/>
+ <foreign-key name="tenant_fk" deferrable="DEFERRED">
+ <column name="tenant"/>
+ <references table="tenant">
+ <column name="id"/>
+ </references>
+ </foreign-key>
+ <foreign-key name="object_id_fk" on-delete="CASCADE">
+ <column name="tenant"/>
+ <column name="name"/>
+ <column name="version_epoch"/>
+ <column name="version_canonical_upstream"/>
+ <column name="version_canonical_release"/>
+ <column name="version_revision"/>
+ <references table="package">
+ <column name="tenant"/>
+ <column name="name"/>
+ <column name="version_epoch"/>
+ <column name="version_canonical_upstream"/>
+ <column name="version_canonical_release"/>
+ <column name="version_revision"/>
+ </references>
+ </foreign-key>
+ <index name="package_keywords_object_id_i">
+ <column name="tenant"/>
+ <column name="name"/>
+ <column name="version_epoch"/>
+ <column name="version_canonical_upstream"/>
+ <column name="version_canonical_release"/>
+ <column name="version_revision"/>
+ </index>
+ <index name="package_keywords_index_i">
+ <column name="index"/>
+ </index>
+ </add-table>
+ <drop-table name="package_tags"/>
+ </changeset>
+
<changeset version="13">
<alter-table name="package">
<add-column name="upstream_version" type="TEXT" null="true"/>
diff --git a/load/load.cxx b/load/load.cxx
index 9b414d5..9c1c31f 100644
--- a/load/load.cxx
+++ b/load/load.cxx
@@ -507,7 +507,8 @@ load_packages (const shared_ptr<repository>& rp,
pm.priority ? move (*pm.priority) : priority (),
move (pm.summary),
move (pm.license_alternatives),
- move (pm.tags),
+ move (pm.topics),
+ move (pm.keywords),
move (dsc),
move (dst),
move (chn),
diff --git a/migrate/migrate.cxx b/migrate/migrate.cxx
index 6bb0d48..6cae116 100644
--- a/migrate/migrate.cxx
+++ b/migrate/migrate.cxx
@@ -227,6 +227,39 @@ package_migrate_v12 ([] (database& db)
"WHERE description IS NOT NULL");
});
+static const package_migration_entry<14>
+package_migrate_v14 ([] (database& db)
+{
+ // Save the package tags as the package keywords.
+ //
+ db.execute ("INSERT INTO package_keywords ("
+ "tenant, "
+ "name, "
+ "version_epoch, "
+ "version_canonical_upstream, "
+ "version_canonical_release, "
+ "version_revision, "
+ "index, "
+ "keyword) "
+ "SELECT "
+ "tenant, "
+ "name, "
+ "version_epoch, "
+ "version_canonical_upstream, "
+ "version_canonical_release, "
+ "version_revision, "
+ "index, "
+ "tag "
+ "FROM package_tags");
+
+ // Note that the package keywords are the second-strongest search keywords
+ // and the package tags where the first-strongest search keywords. So,
+ // strictly speaking, we should update the package table search_index column
+ // to reflect the new ordering rules for the package search. But it feels
+ // like it isn't really worth the trouble.
+ //
+});
+
// main() function
//
int
diff --git a/mod/mod-package-details.cxx b/mod/mod-package-details.cxx
index 74b3840..fc2e6be 100644
--- a/mod/mod-package-details.cxx
+++ b/mod/mod-package-details.cxx
@@ -222,7 +222,7 @@ handle (request& rq, response& rs)
if (pkg->email)
s << TR_EMAIL (*pkg->email);
- s << TR_TAGS (pkg->tags, root, tenant)
+ s << TR_TOPICS (pkg->topics, root, tenant)
<< ~TBODY
<< ~TABLE;
}
diff --git a/mod/mod-package-version-details.cxx b/mod/mod-package-version-details.cxx
index d147449..81f18b1 100644
--- a/mod/mod-package-version-details.cxx
+++ b/mod/mod-package-version-details.cxx
@@ -263,7 +263,7 @@ handle (request& rq, response& rs)
if (pe && pe != em)
s << TR_EMAIL (*pe, "package-email");
- s << TR_TAGS (pkg->tags, root, tenant)
+ s << TR_TOPICS (pkg->topics, root, tenant)
<< ~TBODY
<< ~TABLE;
diff --git a/mod/page.cxx b/mod/page.cxx
index 706d052..1061788 100644
--- a/mod/page.cxx
+++ b/mod/page.cxx
@@ -373,47 +373,35 @@ namespace brep
}
}
- // TR_TAGS
+ // TR_TOPICS
//
- void TR_TAGS::
+ void TR_TOPICS::
operator() (serializer& s) const
{
- if (!tags_.empty () || project_)
- {
- s << TR(CLASS="tags")
- << TH << "tags" << ~TH
- << TD
- << SPAN(CLASS="value");
-
- auto print = [&s, this] (const string& t)
- {
- s << A
- << HREF
- << tenant_dir (root_, tenant_) << "?packages="
- << mime_url_encode (t)
- << ~HREF
- << t
- << ~A;
- };
-
- bool pt (project_ != nullptr &&
- find (tags_.begin (), tags_.end (), *project_) == tags_.end ());
-
- if (pt)
- print (project_->string ());
-
- for (const string& t: tags_)
- {
- if (&t != &tags_[0] || pt)
- s << " ";
+ // Omit the element if there are no topics.
+ //
+ if (topics_.empty ())
+ return;
- print (t);
- }
+ s << TR(CLASS="topics")
+ << TH << "topics" << ~TH
+ << TD
+ << SPAN(CLASS="value");
- s << ~SPAN
- << ~TD
- << ~TR;
+ for (const string& t: topics_)
+ {
+ s << A
+ << HREF
+ << tenant_dir (root_, tenant_) << "?packages="
+ << mime_url_encode (t)
+ << ~HREF
+ << t
+ << ~A;
}
+
+ s << ~SPAN
+ << ~TD
+ << ~TR;
}
// TR_DEPENDS
diff --git a/mod/page.hxx b/mod/page.hxx
index cd2048e..2fc3a0b 100644
--- a/mod/page.hxx
+++ b/mod/page.hxx
@@ -324,31 +324,19 @@ namespace brep
const license_alternatives& licenses_;
};
- // Generate package tags element.
+ // Generate package topics element.
//
- class TR_TAGS
+ class TR_TOPICS
{
public:
- // Display the tag link list.
- //
- TR_TAGS (const strings& ts, const dir_path& r, const string& t)
- : project_ (nullptr), tags_ (ts), root_ (r), tenant_ (t) {}
-
- // As above but prepend the list with a tag link produced from the project
- // name, if it differs from other tags.
- //
- TR_TAGS (const package_name& pr,
- const strings& ts,
- const dir_path& r,
- const string& t)
- : project_ (&pr), tags_ (ts), root_ (r), tenant_ (t) {}
+ TR_TOPICS (const strings& ts, const dir_path& r, const string& t)
+ : topics_ (ts), root_ (r), tenant_ (t) {}
void
operator() (xml::serializer&) const;
private:
- const package_name* project_;
- const strings& tags_;
+ const strings& topics_;
const dir_path& root_;
const string& tenant_;
};
diff --git a/tests/load/1/math/libfoo-1.2.4+1.tar.gz b/tests/load/1/math/libfoo-1.2.4+1.tar.gz
index 29b0c55..94deae1 100644
--- a/tests/load/1/math/libfoo-1.2.4+1.tar.gz
+++ b/tests/load/1/math/libfoo-1.2.4+1.tar.gz
Binary files differ
diff --git a/tests/load/1/math/packages.manifest b/tests/load/1/math/packages.manifest
index 49caea6..74984e9 100644
--- a/tests/load/1/math/packages.manifest
+++ b/tests/load/1/math/packages.manifest
@@ -7,7 +7,7 @@ upstream-version: 1.2.abc.15-x
project: mathLab
summary: The exponent
license: MIT
-tags: mathlab, c++, exponent
+keywords: mathlab c++ exponent
description: The exponent math function.
description-type: text/plain
url: http://exp.example.com
@@ -46,7 +46,8 @@ priority: high; Critical bug fixes, performance improvement.
summary: The Foo Math Library
license: LGPLv2, MIT; If using with GNU TLS.
license: BSD; If using with OpenSSL.
-tags: c++, foo, math
+topics: math library, math API, libbaz fork
+keywords: c++ foo math best
description: \
A modern C++ library with easy to use linear algebra and lot of optimization
tools.
@@ -79,13 +80,13 @@ requires: c++11
requires: ? ; libc++ standard library if using Clang on Mac OS X.
requires: ? vc++ >= 12.0; Only if using VC++ on Windows.
location: libfoo-1.2.4+1.tar.gz
-sha256sum: 92eb89770be390cbac9e0113763e0c10c43a4530667f5572571895617368369a
+sha256sum: 0a206d2b5e575549914ed43b87470b33512e975fffa4fc8f3eb92b3dea66979e
:
name: libpq
version: 0
summary: PostgreSQL C API client library
license: PostgreSQL License; Permissive free software license.
-tags: postgresql, database, client, library, c, api, interface
+keywords: postgresql database client library c
description: \
PostgreSQL is an object-relational SQL database management system with libpq
being its C client library. Applications can use this library to pass queries
@@ -121,7 +122,7 @@ name: libstudxml
version: 1.0.0+1
summary: Modern C++ XML API
license: MIT
-tags: c++, xml, parser, serializer, pull, streaming, modern
+keywords: c++ xml parser serializer pull
url: http://www.codesynthesis.com/projects/libstudxml/
email: studxml-users@example.com; Public mailing list, posts by non-members\
are allowed but moderated.
diff --git a/tests/load/1/misc/packages.manifest b/tests/load/1/misc/packages.manifest
index 1f1571b..f02ce01 100644
--- a/tests/load/1/misc/packages.manifest
+++ b/tests/load/1/misc/packages.manifest
@@ -8,7 +8,7 @@ summary: The Bar library
description: very very good library.
description-type: text/plain
license: GPLv2
-tags: c++, bar
+keywords: c++, bar
url: http://www.example.com/bar/
email: bar-users@example.com
depends: libfoo
diff --git a/tests/load/1/stable/packages.manifest b/tests/load/1/stable/packages.manifest
index c1d4f1a..85109f6 100644
--- a/tests/load/1/stable/packages.manifest
+++ b/tests/load/1/stable/packages.manifest
@@ -17,7 +17,7 @@ version: 1.2.2-alpha.1
priority: security
summary: The Foo library
license: MIT
-tags: c++, foo
+keywords: c++ foo
url: ftp://www.example.com/foo/
email: foo-users@example.com
depends: libmisc [0.1 2.0-) | libmisc [2.0 5.0]
@@ -30,7 +30,7 @@ name: libfoo
version: 1.2.2
summary: The Foo library
license: MIT
-tags: c++, foo
+keywords: c++ foo
url: http://www.example.com/foo/
email: foo-users@example.com
depends: libbar <= 2.4.0
@@ -43,7 +43,7 @@ version: 1.2.3+4
priority: medium
summary: The Foo library
license: MIT
-tags: c++, foo
+keywords: c++ foo
url: http://www.example.com/foo/
email: foo-users@example.com
depends: libmisc >= 2.0.0
@@ -54,7 +54,7 @@ name: libfoo
version: 1.2.4
summary: The Foo Library
license: MIT; Permissive free software license.
-tags: c++, foo
+keywords: c++ foo
description: Very good foo library.
description-type: text/plain
changes: some changes 1
diff --git a/tests/load/1/stable/signature.manifest b/tests/load/1/stable/signature.manifest
index 931ecd4..45d160e 100644
--- a/tests/load/1/stable/signature.manifest
+++ b/tests/load/1/stable/signature.manifest
@@ -1,13 +1,13 @@
: 1
-sha256sum: 880d24ea372048c9d250410d747b330503bdf216df70e3ea11ad6aef7a58b7b9
+sha256sum: f4fadfdc3586c8b94dce871328625f43636e43b4a073c4ee577af41780eeb8f3
signature: \
-rYCyTiDI3qJ7XD1IfzLiJcnUO6hEToJYHH/WwCYXuwWULHZL/utADNVh2dB0zN/Rzm5ONy9qK9Ik
-560sE00tZ1XusU9C4o8B/WGvP2yEDIstF4E1ExwhIO8Y9sDgXpqCZfG/iw7hZYsZNJuzTnArUnSu
-TK/Eubg8tbKolqVlx9GJ2/LXgbZsi0ZiKmEuY7T1IWboU5xMjfBuGEmh2pe838X4VfyhHanmV3S9
-jvthQJ3BR4vZW66UM20/ZWgKw32baYLKbq9br0lXsfnoEPDXDjtb0lOYjy9osa0dKLRF5++Owg2y
-Mtd9RcmI0b8bGdfU8Z176sVXIp53RXlyMgjyewd4ycwWrz+VbIbR0c9AL8ZPHAwBpj8EHh/0IPPI
-CqoEnYChJqWZaUQPzIdS7a+6rXbCllGXyyT3RZjgIiY+PCIp7ZMvcOArfOFzqOTMPOptF0JKUIoC
-v+dzrrzHTA7duu9g+CT5Ag0WKLR0g+Izq3zyQa6YvOAdTFgUaPzd3W7NWP6N+YNeCc8jzGpCdFHY
-1vvDHdNuKVNjSlUtXU5jjJglH2qgnct5SCav76lCKmQBF5PNznwp8R/mb5amIGBOzfRlB9ZN/fSL
-XBM66Z5ObCDViMAliO4RBzoVnSv0y2SwpW+phqrSOzFTm+tDZE63oNh802yf+9/PHcIe48nMuhk=
+J40HIcLQQI+1rzXzRo0OOJRk1NTmLNNFk+RUi/NM7M6vUFjjq4nIABR+bg8RdenpybVASTyJYNTL
+/pLStEF+hg5SnufsYvpJJmstBMY4JXAcOfngUz4UVe8QS9zu3YGL5y/MBnYU+SKBbHnjRsTbRgak
+LjoVbTKH6kkPkZ8MZMXzo/0un2L4w4uZLNDeqjJBg2OFztPIV3RYzBdCcxJ+k20UJjVfmNQWaBki
+eaXVIsOxQ1bqWfg5uvACYvSgAIB+6ZIQFf8VYAJvnSieTswyWTxBXvj0D6aNnksQisaSbsRUuVb/
+zKYNWDrZFOjlNLEt+3bv3WQ5r0RqeRu7x9tdlXMfX/z9qu3SRe/mmaEpArkO67OKuVW1EDIo4Pwd
+6zOQZUBvy3wd5RJWCfEbcuIBNBWL3jWOhWK36V9NzCWzeDzh22D0P9WEYNGd9Xn0+GeXpuiD/1w1
+IkVy9FA/2DYBb/UgNvWLaGWeTFqmv+ZcLKs8uuNHoM33EpI2jQetDS24QeOmqImmRsLROjyCxVye
+yU3Dew5HRLK3KxNtC5XewK24eEdAQID7UEesn7X/MYfuyS1hq415YUibZswG7UIChj082xKHHcME
+zrEgdJ29+I3ZQkpTBaY/77Pu6UFvcpPbak0SCc6FHPvWKwXHPv2ATsInKs0J/WLdsL8sgaM2f3I=
\
diff --git a/tests/load/driver.cxx b/tests/load/driver.cxx
index 4f075aa..db4ed8c 100644
--- a/tests/load/driver.cxx
+++ b/tests/load/driver.cxx
@@ -43,11 +43,22 @@ check_location (shared_ptr<package>& p)
static bool
check_external (const package& p)
{
- return p.summary.empty () && p.tags.empty () && !p.description && !p.url &&
- !p.package_url && !p.email && !p.package_email && !p.internal () &&
- p.other_repositories.size () > 0 && p.priority == priority () &&
- p.changes.empty () && p.license_alternatives.empty () &&
- p.dependencies.empty () && p.requirements.empty () && !p.sha256sum;
+ return p.summary.empty () &&
+ p.topics.empty () &&
+ p.keywords.empty () &&
+ !p.description &&
+ !p.url &&
+ !p.package_url &&
+ !p.email &&
+ !p.package_email &&
+ !p.internal () &&
+ p.other_repositories.size () > 0 &&
+ p.priority == priority () &&
+ p.changes.empty () &&
+ p.license_alternatives.empty () &&
+ p.dependencies.empty () &&
+ p.requirements.empty () &&
+ !p.sha256sum;
}
namespace bpkg
@@ -348,7 +359,7 @@ test_pkg_repos (const cstrings& loader_args,
assert (fpvxy->project == package_name ("libfoo"));
assert (fpvxy->summary == "The Foo Library");
- assert (fpvxy->tags.empty ());
+ assert (fpvxy->keywords.empty ());
assert (!fpvxy->description);
assert (!fpvxy->url);
assert (!fpvxy->package_url);
@@ -380,7 +391,7 @@ test_pkg_repos (const cstrings& loader_args,
package_id (tenant, package_name ("libfoo"), version ("1.0"))));
assert (fpv1->summary == "The Foo Library");
- assert (fpv1->tags.empty ());
+ assert (fpv1->keywords.empty ());
assert (!fpv1->description);
assert (!fpv1->url);
assert (!fpv1->package_url);
@@ -414,7 +425,7 @@ test_pkg_repos (const cstrings& loader_args,
package_id (tenant, package_name ("libfoo"), version ("1.2.2"))));
assert (fpv2->summary == "The Foo library");
- assert (fpv2->tags == strings ({"c++", "foo"}));
+ assert (fpv2->keywords == strings ({"c++", "foo"}));
assert (!fpv2->description);
assert (fpv2->url && fpv2->url->string () == "http://www.example.com/foo/");
assert (!fpv2->package_url);
@@ -458,7 +469,7 @@ test_pkg_repos (const cstrings& loader_args,
version ("1.2.2-alpha.1"))));
assert (fpv2a->summary == "The Foo library");
- assert (fpv2a->tags == strings ({"c++", "foo"}));
+ assert (fpv2a->keywords == strings ({"c++", "foo"}));
assert (!fpv2a->description);
assert (fpv2a->url && fpv2a->url->string () == "ftp://www.example.com/foo/");
assert (!fpv2a->package_url);
@@ -518,7 +529,7 @@ test_pkg_repos (const cstrings& loader_args,
package_id (tenant, package_name ("libfoo"), version ("1.2.3+4"))));
assert (fpv3->summary == "The Foo library");
- assert (fpv3->tags == strings ({"c++", "foo"}));
+ assert (fpv3->keywords == strings ({"c++", "foo"}));
assert (!fpv3->description);
assert (fpv3->url && fpv3->url->string () == "http://www.example.com/foo/");
assert (!fpv3->package_url);
@@ -554,7 +565,7 @@ test_pkg_repos (const cstrings& loader_args,
package_id (tenant, package_name ("libfoo"), version ("1.2.4"))));
assert (fpv4->summary == "The Foo Library");
- assert (fpv4->tags == strings ({"c++", "foo"}));
+ assert (fpv4->keywords == strings ({"c++", "foo"}));
assert (*fpv4->description == "Very good foo library.");
assert (fpv4->url && fpv4->url->string () == "http://www.example.com/foo/");
assert (!fpv4->package_url);
@@ -622,8 +633,8 @@ test_pkg_repos (const cstrings& loader_args,
version ("1.0.0+1"))));
assert (xpv->summary == "Modern C++ XML API");
- assert (xpv->tags == strings ({"c++", "xml", "parser", "serializer",
- "pull", "streaming", "modern"}));
+ assert (xpv->keywords ==
+ strings ({"c++", "xml", "parser", "serializer", "pull"}));
assert (!xpv->description);
assert (xpv->url &&
xpv->url->string () == "http://www.codesynthesis.com/projects/libstudxml/");
@@ -678,7 +689,9 @@ test_pkg_repos (const cstrings& loader_args,
package_id (tenant, package_name ("libfoo"), version ("1.2.4+1"))));
assert (fpv5->summary == "The Foo Math Library");
- assert (fpv5->tags == strings ({"c++", "foo", "math"}));
+ assert (fpv5->topics ==
+ strings ({"math library", "math API", "libbaz fork"}));
+ assert (fpv5->keywords == strings ({"c++", "foo", "math", "best"}));
assert (*fpv5->description ==
"A modern C++ library with easy to use linear algebra and lot "
"of optimization\ntools.\n\nThere are over 100 functions in "
@@ -782,7 +795,7 @@ test_pkg_repos (const cstrings& loader_args,
assert (check_location (fpv5));
assert (fpv5->sha256sum && *fpv5->sha256sum ==
- "92eb89770be390cbac9e0113763e0c10c43a4530667f5572571895617368369a");
+ "0a206d2b5e575549914ed43b87470b33512e975fffa4fc8f3eb92b3dea66979e");
// Verify libexp package version.
//
@@ -795,7 +808,7 @@ test_pkg_repos (const cstrings& loader_args,
assert (epv->upstream_version && *epv->upstream_version == "1.2.abc.15-x");
assert (epv->project == "mathLab");
assert (epv->summary == "The exponent");
- assert (epv->tags == strings ({"mathlab", "c++", "exponent"}));
+ assert (epv->keywords == strings ({"mathlab", "c++", "exponent"}));
assert (epv->description && *epv->description ==
"The exponent math function.");
assert (epv->url && epv->url->string () == "http://exp.example.com");
diff --git a/www/package-details-body.css b/www/package-details-body.css
index ee612bb..e3aaa00 100644
--- a/www/package-details-body.css
+++ b/www/package-details-body.css
@@ -118,7 +118,7 @@ h1, h2
}
#package th {width: 7.6em;}
-#package tr.tags td a,
+#package tr.topics td a,
#package tr.project td a
{
display: inline-block;
@@ -126,17 +126,17 @@ h1, h2
background-color: #f1f8ff;
border-radius: 0.2em;
padding: 0 .5em .06em .5em;
- margin: 0 0.06em 0.1em 0;
+ margin: 0 0.35em 0.1em 0;
}
-#package tr.tags td a:hover,
+#package tr.topics td a:hover,
#package tr.project td a:hover
{
text-decoration: none;
background-color: #def;
}
-#package tr.tags td,
+#package tr.topics td,
#package tr.project td
{
padding: 0;
diff --git a/www/package-version-details-body.css b/www/package-version-details-body.css
index 79fcfe5..25e2dc2 100644
--- a/www/package-version-details-body.css
+++ b/www/package-version-details-body.css
@@ -172,7 +172,7 @@ h1, h2, h3
}
#package th {width: 9.5em;}
-#package tr.tags td a,
+#package tr.topics td a,
#package tr.project td a
{
display: inline-block;
@@ -180,17 +180,17 @@ h1, h2, h3
background-color: #f1f8ff;
border-radius: 0.2em;
padding: 0 .5em .06em .5em;
- margin: 0 0.06em 0.1em 0;
+ margin: 0 0.35em 0.1em 0;
}
-#package tr.tags td a:hover,
+#package tr.topics td a:hover,
#package tr.project td a:hover
{
text-decoration: none;
background-color: #def;
}
-#package tr.tags td,
+#package tr.topics td,
#package tr.project td
{
padding: 0;