Skip to content

Instantly share code, notes, and snippets.

@Filirom1
Last active August 29, 2015 14:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Filirom1/cd77b28e900a1007572a to your computer and use it in GitHub Desktop.
Save Filirom1/cd77b28e900a1007572a to your computer and use it in GitHub Desktop.
Only list the latest SRPM files on an online repo

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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment