#!/usr/bin/ruby def usage puts "Usage: #{$0} [options]" puts "Moves obsolete packages" puts puts "-h, --help show help" puts "-a, --archs ,,... list of architectures to clean" puts "-a, --auto do not ask confirmation" puts "-p, --base base path to the repository" puts "-m, --media which media to clean (default: core/release)" puts "-d, --destination path to the old packages storage" puts "-v, --version version to clean (default: cauldron)" end require 'fileutils' require 'getoptlong' require 'readline' def process opts = GetoptLong.new( [ '--help', '-h', GetoptLong::NO_ARGUMENT ], [ '--archs', '-a', GetoptLong::REQUIRED_ARGUMENT ], [ '--auto', '-A', GetoptLong::NO_ARGUMENT ], [ '--base', '-p', GetoptLong::REQUIRED_ARGUMENT ], [ '--media', '-m', GetoptLong::REQUIRED_ARGUMENT ], [ '--destination', '-d', GetoptLong::REQUIRED_ARGUMENT ], [ '--version', '-v', GetoptLong::REQUIRED_ARGUMENT ] ) base_path = "<%= scope.lookupvar('buildsystem::var::repository::bootstrap_root') %>/distrib" archs = [ "i586", "x86_64", "aarch64", "armv7hl" ] media = "core/release" old_path = "<%= scope.lookupvar('buildsystem::var::youri::packages_archivedir') %>" version = "cauldron" auto = false opts.each do |opt, arg| case opt when '--help' usage exit 0 when '--destination' old_path = arg when '--media' media = arg when '--archs' archs = arg.split(",") when '--auto' auto = true when '--base' base_path = arg when '--version' version = arg end end src_path = "#{base_path}/#{version}/SRPMS/#{media}" $used_srcs = {} $srcs = {} $srcages = {} # Get a list of all src.rpm and their build time `urpmf --synthesis "#{src_path}/media_info/synthesis.hdlist.cz" --qf '%filename:%buildtime' "."`.each_line{|l| l2 = l.split(':') filename = l2[0] buildtime = l2[1].to_i name = filename.sub(/-[^-]*-[^-]*$/, '') $srcages[name] = [ filename, buildtime ] unless $srcages[name] && buildtime < $srcages[name][1] $srcs[filename] = true } # TODO: Take an upload lock to avoid being confused by emi moving things archs.each{|arch| bin_path = "#{base_path}/#{version}/#{arch}/media/#{media}" debug_path = bin_path.sub("/media/", "/media/debug/") old_packages = check_binaries($srcs, $srcages, bin_path, $used_srcs) old_debug_packages = check_binaries($srcs, {}, debug_path, nil) move_packages(bin_path, old_path, old_packages, auto) move_packages(debug_path, old_path, old_debug_packages, auto) } $used_srcs.keys.each{|s| $srcs.delete(s)} move_packages(src_path, old_path, $srcs.keys, auto) end def move_packages(src, dst, list, auto) list.reject!{|f| !File.exist?(src + "/" + f)} return if list.empty? list.each{|b| puts b } puts "The #{list.length} listed packages will be moved from #{src} to #{dst}." line = Readline::readline('Are you sure [Yn]? ') unless auto if auto || line =~ /^y?$/i list.each{|s| oldfile = src + "/" + s newfile = dst + "/" + s next unless File.exist?(oldfile) if (File.exist?(newfile)) File.unlink(oldfile) else FileUtils.mv(oldfile, newfile) end } end end # For each binary media: # - Check if we have the src.rpm (else the binary package is obsolete) # * If we don't have the src.rpm, check if we have a newer version # - If there is a new version: # * check if this architecture has packages from it to avoid deleting armv7hl packages before the new one get rebuilt # * check if the new version is old enough to allow rebuilding everything (7d?) # - Mark used src.rpm (if one is never marked, the src.rpm is obsolete) def packages(path) `urpmf --synthesis "#{path}/media_info/synthesis.hdlist.cz" --qf '%sourcerpm:%filename' ":"`.each_line{|l| yield l } end def check_binaries(srcs, srcages, path, used_srcs) used_here_srcs = {} packages(path) {|l| l2 = l.split(':') src = l2[0] filename = l2[1].rstrip used_srcs[src] = true if used_srcs != nil used_here_srcs[src] = true unless filename =~ /noarch.rpm$/ } old_binaries = [] packages(path) {|l| l2 = l.split(':') src = l2[0] filename = l2[1].rstrip if ! srcs[src] then name = src.sub(/-[^-]*-[^-]*$/, '') if srcages[name] then # If the package was updated, only delete old binaries after 7d next unless srcages[name][1] < Time.now.to_i - 24*60*60*7 # Do not delete if the new version of the package hasn't been built for this arch yet next unless used_here_srcs[srcages[name][0]] end old_binaries << filename end } old_binaries end if __FILE__ == $0 then process end