Exemple:
$ ruby latest-srpm.rb <REPO_URL> | xargs wget -N
It will only download the latest SRPM
source 'https://rubygems.org' | |
gem 'nokogiri' | |
gem 'colorize' |
#!/usr/bin/env ruby | |
require 'nokogiri' | |
require 'open-uri' | |
require 'colorize' | |
# Read packages | |
base_url = ARGV[0] | |
abort "Usage: latest-srpm.rb <URL>" unless base_url | |
page = Nokogiri::HTML(open(base_url)) | |
links = [] | |
page.css('a').each do |a| | |
url = a['href'] | |
# Only filters src.rpm files | |
is_srpm = a.content.match(/(?<name>[a-zA-Z0-9_\-\+]*)-(?<version>[0-9\.]*)-(?<rev>[-_a-zA-Z0-9\.]*)[^\-]*\.src\.rpm/) | |
next unless is_srpm | |
# parse name and version from filename | |
name, version, rev = is_srpm.captures | |
rev ||= 0 | |
rev = rev.gsub(/[el]/, '.').gsub(/_/, '-').gsub(/\.\.*/, '.') | |
link = { | |
url: base_url + url, | |
name: name, | |
# transform version into a semver object | |
version: Gem::Version.new("#{version}-#{rev}") | |
} | |
links << link | |
end | |
# Only keep the latest version | |
packages = {} | |
links.each do |link| | |
name=link[:name] | |
if packages[name] == nil | |
packages[name] = link | |
elsif packages[name][:version] < link[:version] | |
packages[name] = link | |
elsif packages[name][:version] == link[:version] | |
$stderr.puts "Same verion for #{packages[name]} and #{link}".red | |
end | |
end | |
# Print the latest SRPM | |
packages.each_value do |link| | |
puts "#{link[:url]}" | |
end |