diff options
author | Max Magorsch <max@magorsch.de> | 2019-10-18 02:52:21 +0200 |
---|---|---|
committer | Max Magorsch <max@magorsch.de> | 2019-10-18 02:52:21 +0200 |
commit | 0909a7bad7533710973957c12a657f680b4d3b0c (patch) | |
tree | 8fd763f051bb7afadb5156cc89797ba8d87c2394 | |
parent | Add a query parser for advanced search queries (diff) | |
download | packages-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.rb | 14 | ||||
-rw-r--r-- | app/repositories/package_repository.rb | 4 | ||||
-rw-r--r-- | app/views/feeds/packages.atom.builder | 41 | ||||
-rw-r--r-- | app/views/packages/search.html.erb | 6 | ||||
-rw-r--r-- | config/locales/en.yml | 2 |
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}" |