aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMax Magorsch <max@magorsch.de>2019-10-18 02:52:21 +0200
committerMax Magorsch <max@magorsch.de>2019-10-18 02:52:21 +0200
commit0909a7bad7533710973957c12a657f680b4d3b0c (patch)
tree8fd763f051bb7afadb5156cc89797ba8d87c2394
parentAdd a query parser for advanced search queries (diff)
downloadpackages-5-0909a7bad7533710973957c12a657f680b4d3b0c.tar.gz
packages-5-0909a7bad7533710973957c12a657f680b4d3b0c.tar.bz2
packages-5-0909a7bad7533710973957c12a657f680b4d3b0c.zip
Add atom feeds for package search results
Add atom feeds for the results of search queries. For instance you can subscribe to the atom feed for the result of the query > +maintainers.email:haskell@gentoo.org now. This way you are able to keep track of packages that belong to a certain herd/maintainer. The atom feed contains the latest commit for each package so far. Bug: https://bugs.gentoo.org/408661 Signed-off-by: Max Magorsch <max@magorsch.de>
-rw-r--r--app/controllers/packages_controller.rb14
-rw-r--r--app/repositories/package_repository.rb4
-rw-r--r--app/views/feeds/packages.atom.builder41
-rw-r--r--app/views/packages/search.html.erb6
-rw-r--r--config/locales/en.yml2
5 files changed, 64 insertions, 3 deletions
diff --git a/app/controllers/packages_controller.rb b/app/controllers/packages_controller.rb
index 80a9448..e735d6c 100644
--- a/app/controllers/packages_controller.rb
+++ b/app/controllers/packages_controller.rb
@@ -9,6 +9,9 @@ class PackagesController < ApplicationController
def search
@offset = params[:o].to_i || 0
@packages = PackageRepository.default_search(params[:q], @offset)
+ @query = params[:q]
+
+ render_packages_feed :packageinfo, t(:feed_search_results, query: params[:q] )
redirect_to package_path(@packages.first).gsub('%2F', '/') if @packages.size == 1
end
@@ -82,6 +85,17 @@ class PackagesController < ApplicationController
end
end
+ def render_packages_feed(type, title)
+ respond_to do |wants|
+ wants.html {}
+ wants.atom do
+ @feed_type = type
+ @feed_title = title
+ render template: 'feeds/packages'
+ end
+ end
+ end
+
def set_nav
@nav = :packages
end
diff --git a/app/repositories/package_repository.rb b/app/repositories/package_repository.rb
index 2a2e891..5caaf01 100644
--- a/app/repositories/package_repository.rb
+++ b/app/repositories/package_repository.rb
@@ -103,10 +103,10 @@ class PackageRepository < BaseRepository
25
end
- def default_search(q, offset)
+ def default_search(q, offset, search_size=default_search_size)
return [] if q.nil? || q.empty?
- search(build_query(q, default_search_size, offset))
+ search(build_query(q, search_size , offset))
end
diff --git a/app/views/feeds/packages.atom.builder b/app/views/feeds/packages.atom.builder
new file mode 100644
index 0000000..bac7686
--- /dev/null
+++ b/app/views/feeds/packages.atom.builder
@@ -0,0 +1,41 @@
+@feed_id ||= nil
+
+atom_feed(id: atom_id(@feed_type, @feed_id, 'feed')) do |feed|
+
+ all_packages = PackageRepository.default_search(@query, 0, 10_000)
+
+ feed.title @feed_title
+ feed.updated !all_packages.empty? ? all_packages.first.created_at : Time.now
+
+ feed.author do |author|
+ author.name 'Gentoo Packages Database'
+ end
+
+ all_packages.each do |package|
+ atom = package.atom
+
+ commit = CommitRepository.find_sorted_by :packages, atom, :date, "desc", 1
+ commit = commit.first
+
+ if package.nil?
+ logger.warn "Package nil!"
+ next
+ end
+
+ id = atom
+
+ feed.entry(
+ package,
+ id: atom_id(@feed_type, @feed_id, id),
+ url: absolute_link_to_package(atom)) do |entry|
+ entry.updated commit ? commit.date.to_datetime.rfc3339 : Time.now.to_datetime.rfc3339
+
+ entry.title(t :feed_keyworded_title,
+ atom: atom,
+ description: package.description)
+ entry.content(t :feed_commit_content,
+ hash: commit ? commit.id[0..6] : "",
+ message: commit ? commit.message : "No commit available")
+ end
+ end
+end
diff --git a/app/views/packages/search.html.erb b/app/views/packages/search.html.erb
index c4b5a75..80f6bf3 100644
--- a/app/views/packages/search.html.erb
+++ b/app/views/packages/search.html.erb
@@ -1,4 +1,5 @@
-<h1 class="first-header">Search Results <small>for <%= params[:q] %></small></h1>
+<h1 class="first-header">Search Results <small>for <%= params[:q] %></small>
+ <%= feed_icon search_packages_url(format: :atom, params: request.query_parameters) %></h1>
<% if @packages.size > 0 %>
<div class="panel panel-default">
@@ -15,6 +16,9 @@
</div>
</div>
</div>
+<% content_for :head do %>
+ <%= alternate_feed_link(search_packages_url(format: :atom, params: request.query_parameters), t(:atom_feed)) %>
+<% end %>
<% else %>
<div class="jumbotron">
<h2 class="site-welcome stick-top">Nothing found. :( Try again?</h2>
diff --git a/config/locales/en.yml b/config/locales/en.yml
index 9358da7..c00801b 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -96,6 +96,7 @@ en:
feed_added_arch: "Gentoo Packages: Added packages on %{arch}"
feed_added_title: "%{atom} (%{description})"
feed_added_content: "%{atom} is now available in Gentoo on these architectures: %{arches}"
+ feed_search_results: "Gentoo Packages for search query: %{query}"
feed_updated: "Gentoo Packages: Updated packages"
feed_updated_arch: "Gentoo Packages: Updated packages on %{arch}"
feed_updated_title: "%{atom} (%{description})"
@@ -108,5 +109,6 @@ en:
feed_keyworded_arch: "Gentoo Packages: Newly keyworded packages on %{arch}"
feed_keyworded_title: "%{atom} (%{description})"
feed_keyworded_content: "%{atom} is now keyworded on these architectures: %{arches}"
+ feed_commit_content: "#%{hash}: %{message}"
# <meta> descriptions
desc_categories_show: "Gentoo package category %{category}: %{description}"