X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=examples%2Frbsolv;h=470438d1c4f50e9ed70247823d38ef7f426e9eeb;hb=657a22165436c4f0791c869ca953c55b43d55aee;hp=333114babc820618a06766684f7d7c5bf23bc5c6;hpb=e4baafbc3b96a10cecd36571a865b9fe538db2b7;p=platform%2Fupstream%2Flibsolv.git diff --git a/examples/rbsolv b/examples/rbsolv index 333114b..470438d 100755 --- a/examples/rbsolv +++ b/examples/rbsolv @@ -27,6 +27,7 @@ class Repo_generic def calc_cookie_fp(f) chksum = Solv::Chksum.new(Solv::REPOKEY_TYPE_SHA256) + chksum.add("1.1") chksum.add_fp(f) return chksum.raw end @@ -38,6 +39,16 @@ class Repo_generic return chksum.raw end + def calc_cookie_ext(f, cookie) + chksum = Solv::Chksum.new(Solv::REPOKEY_TYPE_SHA256) + chksum.add("1.1") + chksum.add(cookie) + chksum.add_fstat(f.fileno) + extcookie = chksum.raw() + extcookie[0] = 1 if extcookie[0] == 0 + return extcookie + end + def cachepath(ext = nil) path = @name.sub(/^\./, '_') path += ext ? "_#{ext}.solvx" : '.solv' @@ -52,7 +63,7 @@ class Repo_generic if dorefresh begin s = File.stat(cachepath) - dorefresh = false if s && Time.now - s.mtime < @attribs['metadata_expire'].to_i + dorefresh = false if s && (@attribs['metadata_expire'].to_i == -1 || Time.now - s.mtime < @attribs['metadata_expire'].to_i) rescue SystemCallError end end @@ -61,14 +72,10 @@ class Repo_generic puts "repo: '#{@name}' cached" return true end - return load_if_changed() - end - - def load_ext(repodata) return false end - def load_if_changed + def load_ext(repodata) return false end @@ -97,17 +104,14 @@ class Repo_generic return nil end end + rf = nil if uncompress - return Solv::xfopen_dup(file, f.fileno) + rf = Solv::xfopen_fd(file, f.fileno) else - return Solv::xfopen_dup('', f.fileno) + rf = Solv::xfopen_fd('', f.fileno) end - end - - def download_location(location, chksum) - f = download(location, false, chksum) - abort("\n#{@name}: #{location} not found in repository\n") unless f - return f + f.close + return rf end def usecachedrepo(ext, mark = false) @@ -125,14 +129,15 @@ class Repo_generic return false if fextcookie.length != 32 end f.sysseek(0, IO::SEEK_SET) - f = Solv::xfopen_dup('', f.fileno) + nf = Solv::xfopen_fd('', f.fileno) + f.close flags = ext ? Solv::Repo::REPO_USE_LOADING|Solv::Repo::REPO_EXTEND_SOLVABLES : 0 flags |= Solv::Repo::REPO_LOCALPOOL if ext && ext != 'DL' - if ! @handle.add_solv(f, flags) - Solv::xfclose(f) + if ! @handle.add_solv(nf, flags) + nf.close return false end - Solv::xfclose(f) + nf.close() @cookie = fcookie unless ext @extcookie = fextcookie if !ext && @type != 'system' now = Time.now @@ -147,26 +152,13 @@ class Repo_generic return true end - def genextcookie(f) - chksum = Solv::Chksum.new(Solv::REPOKEY_TYPE_SHA256) - chksum.add(@cookie) - if f - s = f.stat() - chksum.add(s.dev.to_s) - chksum.add(s.ino.to_s) - chksum.add(s.size.to_s) - chksum.add(s.mtime.to_s) - end - @extcookie = chksum.raw() - @extcookie[0] = 1 if @extcookie[0] == 0 - end - def writecachedrepo(ext, info = nil) + return if @incomplete begin Dir::mkdir("/var/cache/solv", 0755) unless FileTest.directory?("/var/cache/solv") f = Tempfile.new('.newsolv-', '/var/cache/solv') f.chmod(0444) - sf = Solv::xfopen_dup('', f.fileno) + sf = Solv::xfopen_fd('', f.fileno) if !info @handle.write(sf) elsif ext @@ -174,14 +166,14 @@ class Repo_generic else @handle.write_first_repodata(sf) end - Solv::xfclose(sf) + sf.close f.sysseek(0, IO::SEEK_END) if @type != 'system' && !ext - genextcookie(f) unless @extcookie + @extcookie = calc_cookie_ext(f, @cookie) unless @extcookie f.syswrite(@extcookie) end f.syswrite(ext ? @extcookie : @cookie) - f.close(false) + f.close if @handle.iscontiguous? sf = Solv::xfopen(f.path) if sf @@ -190,9 +182,11 @@ class Repo_generic abort("internal error, cannot reload solv file") unless @handle.add_solv(sf, Solv::Repo::SOLV_ADD_NO_STUBS) else info.extend_to_repo() - info.add_solv(sf, Solv::Repo::REPO_EXTEND_SOLVABLES) + flags = Solv::Repo::REPO_EXTEND_SOLVABLES + flags |= Solv::Repo::REPO_LOCALPOOL if ext != 'DL' + info.add_solv(sf, flags) end - Solv::xfclose(sf) + sf.close end end File.rename(f.path, cachepath(ext)) @@ -216,12 +210,16 @@ class Repo_generic repodata.internalize() writecachedrepo(nil, repodata) end + + def packagespath() + return '' + end end class Repo_rpmmd < Repo_generic def find(what) - di = @handle.Dataiterator(Solv::SOLVID_META, Solv::REPOSITORY_REPOMD_TYPE, what, Solv::Dataiterator::SEARCH_STRING) + di = @handle.Dataiterator_meta(Solv::REPOSITORY_REPOMD_TYPE, what, Solv::Dataiterator::SEARCH_STRING) di.prepend_keyname(Solv::REPOSITORY_REPOMD) for d in di dp = d.parentpos() @@ -237,7 +235,8 @@ class Repo_rpmmd < Repo_generic return nil, nil end - def load_if_changed + def load(pool) + return true if super(pool) print "rpmmd repo '#{@name}: " f = download("repodata/repomd.xml", false, nil, nil) if !f @@ -249,18 +248,18 @@ class Repo_rpmmd < Repo_generic @cookie = calc_cookie_fp(f) if usecachedrepo(nil, true) puts "cached" - Solv.xfclose(f) + f.close return true end @handle.add_repomdxml(f, 0) - Solv::xfclose(f) + f.close puts "fetching" filename, filechksum = find('primary') if filename f = download(filename, true, filechksum, true) if f @handle.add_rpmmd(f, nil, 0) - Solv::xfclose(f) + f.close end return false if @incomplete end @@ -269,11 +268,11 @@ class Repo_rpmmd < Repo_generic f = download(filename, true, filechksum, true) if f @handle.add_updateinfoxml(f, 0) - Solv::xfclose(f) + f.close end end add_exts() - writecachedrepo(nil) unless @incomplete + writecachedrepo(nil) @handle.create_stubs() return true end @@ -324,11 +323,11 @@ class Repo_rpmmd < Repo_generic f = download(filename, true, filechksum) return false unless f if ext == 'FL' - @handle.add_rpmmd(f, 'FL', Solv::Repo::REPO_USE_LOADING|Solv::Repo::REPO_EXTEND_SOLVABLES) + @handle.add_rpmmd(f, 'FL', Solv::Repo::REPO_USE_LOADING|Solv::Repo::REPO_EXTEND_SOLVABLES|Solv::Repo::REPO_LOCALPOOL) elsif ext == 'DL' @handle.add_deltainfoxml(f, Solv::Repo::REPO_USE_LOADING) end - Solv::xfclose(f) + f.close writecachedrepo(ext, repodata) return true end @@ -338,7 +337,7 @@ end class Repo_susetags < Repo_generic def find(what) - di = @handle.Dataiterator(Solv::SOLVID_META, Solv::SUSETAGS_FILE_NAME, what, Solv::Dataiterator::SEARCH_STRING) + di = @handle.Dataiterator_meta(Solv::SUSETAGS_FILE_NAME, what, Solv::Dataiterator::SEARCH_STRING) di.prepend_keyname(Solv::SUSETAGS_FILE) for d in di dp = d.parentpos() @@ -348,7 +347,8 @@ class Repo_susetags < Repo_generic return nil, nil end - def load_if_changed + def load(pool) + return true if super(pool) print "susetags repo '#{@name}: " f = download("content", false, nil, nil) if !f @@ -360,14 +360,14 @@ class Repo_susetags < Repo_generic @cookie = calc_cookie_fp(f) if usecachedrepo(nil, true) puts "cached" - Solv.xfclose(f) + f.close return true end @handle.add_content(f, 0) - Solv::xfclose(f) + f.close puts "fetching" - defvendorid = @handle.lookup_id(Solv::SOLVID_META, Solv::SUSETAGS_DEFAULTVENDOR) - descrdir = @handle.lookup_str(Solv::SOLVID_META, Solv::SUSETAGS_DESCRDIR) + defvendorid = @handle.meta.lookup_id(Solv::SUSETAGS_DEFAULTVENDOR) + descrdir = @handle.meta.lookup_str(Solv::SUSETAGS_DESCRDIR) descrdir = "suse/setup/descr" unless descrdir (filename, filechksum) = find('packages.gz') (filename, filechksum) = find('packages') unless filename @@ -375,21 +375,21 @@ class Repo_susetags < Repo_generic f = download("#{descrdir}/#{filename}", true, filechksum, true) if f @handle.add_susetags(f, defvendorid, nil, Solv::Repo::REPO_NO_INTERNALIZE|Solv::Repo::SUSETAGS_RECORD_SHARES) - Solv::xfclose(f) + f.close (filename, filechksum) = find('packages.en.gz') (filename, filechksum) = find('packages.en') unless filename if filename f = download("#{descrdir}/#{filename}", true, filechksum, true) if f @handle.add_susetags(f, defvendorid, nil, Solv::Repo::REPO_NO_INTERNALIZE|Solv::Repo::REPO_REUSE_REPODATA|Solv::Repo::REPO_EXTEND_SOLVABLES) - Solv::xfclose(f) + f.close end end @handle.internalize() end end add_exts() - writecachedrepo(nil) unless @incomplete + writecachedrepo(nil) @handle.create_stubs() return true end @@ -428,7 +428,7 @@ class Repo_susetags < Repo_generic def add_exts repodata = @handle.add_repodata(0) - di = @handle.Dataiterator(Solv::SOLVID_META, Solv::SUSETAGS_FILE_NAME, nil, 0) + di = @handle.Dataiterator_meta(Solv::SUSETAGS_FILE_NAME, nil, 0) di.prepend_keyname(Solv::SUSETAGS_FILE) for d in di filename = d.str @@ -449,24 +449,25 @@ class Repo_susetags < Repo_generic return true end puts "fetching]\n" - defvendorid = @handle.lookup_id(Solv::SOLVID_META, Solv::SUSETAGS_DEFAULTVENDOR) - descrdir = @handle.lookup_str(Solv::SOLVID_META, Solv::SUSETAGS_DESCRDIR) + defvendorid = @handle.meta.lookup_id(Solv::SUSETAGS_DEFAULTVENDOR) + descrdir = @handle.meta.lookup_str(Solv::SUSETAGS_DESCRDIR) descrdir = "suse/setup/descr" unless descrdir filechksum = repodata.lookup_checksum(Solv::SOLVID_META, Solv::SUSETAGS_FILE_CHECKSUM) f = download("#{descrdir}/#{filename}", true, filechksum) return false unless f - @handle.add_susetags(f, defvendorid, ext, Solv::Repo::REPO_USE_LOADING|Solv::Repo::REPO_EXTEND_SOLVABLES) - Solv::xfclose(f) + flags = Solv::Repo::REPO_USE_LOADING|Solv::Repo::REPO_EXTEND_SOLVABLES + flags |= Solv::Repo::REPO_LOCALPOOL if ext != 'DL' + @handle.add_susetags(f, defvendorid, ext, flags) + f.close writecachedrepo(ext, repodata) return true end - def download_location(location, chksum) - datadir = @handle.lookup_str(Solv::SOLVID_META, Solv::SUSETAGS_DATADIR) + def packagespath() + datadir = @handle.meta.lookup_str(Solv::SUSETAGS_DATADIR) datadir = "suse" unless datadir - super("#{datadir}/#{location}", chksum) + return datadir + '/' end - end class Repo_unknown < Repo_generic @@ -491,7 +492,9 @@ class Repo_system < Repo_generic if @handle.respond_to? :add_products @handle.add_products("/etc/products.d", Solv::Repo::REPO_NO_INTERNALIZE) end - @handle.add_rpmdb(nil, Solv::Repo::REPO_REUSE_REPODATA) + f = Solv::xfopen(cachepath()) + @handle.add_rpmdb_reffp(f, Solv::Repo::REPO_REUSE_REPODATA) + f.close writecachedrepo(nil) return true end @@ -499,11 +502,20 @@ end args = ARGV cmd = args.shift -cmd = 'list' if cmd == 'li' -cmd = 'install' if cmd == 'in' -cmd = 'erase' if cmd == 'rm' -cmd = 'verify' if cmd == 've' -cmd = 'search' if cmd == 'se' + +cmdabbrev = { 'ls' => 'list', 'in' => 'install', 'rm' => 'erase', + 've' => 'verify', 'se' => 'search' } +cmd = cmdabbrev[cmd] if cmdabbrev.has_key?(cmd) + +cmdactionmap = { + 'install' => Solv::Job::SOLVER_INSTALL, + 'erase' => Solv::Job::SOLVER_ERASE, + 'up' => Solv::Job::SOLVER_UPDATE, + 'dup' => Solv::Job::SOLVER_DISTUPGRADE, + 'verify' => Solv::Job::SOLVER_VERIFY, + 'list' => 0, + 'info' => 0, +} repos = [] reposdirs = [] @@ -515,7 +527,7 @@ end for reposdir in reposdirs do next unless FileTest.directory?(reposdir) for reponame in Dir["#{reposdir}/*.repo"].sort do - cfg = IniFile.new(reponame) + cfg = IniFile.load(reponame) cfg.each_section do |ali| repoattr = { 'alias' => ali, 'enabled' => 0, 'priority' => 99, 'autorefresh' => 1, 'type' => 'rpm-md', 'metadata_expire' => 900} repoattr.update(cfg[ali]) @@ -532,9 +544,7 @@ for reposdir in reposdirs do end pool = Solv::Pool.new() -# require 'sys/uname' ; sysarch = Sys::Uname.machine -sysarch = `uname -p`.strip -pool.setarch(sysarch) +pool.setarch() pool.set_loadcallback { |repodata| repo = repodata.repo.appdata @@ -548,17 +558,19 @@ for repo in repos end if cmd == 'search' - matches = {} - for di in pool.Dataiterator(0, Solv::SOLVABLE_NAME, args[0], Solv::Dataiterator::SEARCH_SUBSTRING | Solv::Dataiterator::SEARCH_NOCASE) - matches[di.solvid] = true + pool.createwhatprovides() + sel = pool.Selection + for di in pool.Dataiterator(Solv::SOLVABLE_NAME, args[0], Solv::Dataiterator::SEARCH_SUBSTRING | Solv::Dataiterator::SEARCH_NOCASE) + sel.add_raw(Solv::Job::SOLVER_SOLVABLE, di.solvid) end - for solvid in matches.keys.sort - s = pool.solvables[solvid] - puts "- #{s.str} [#{s.repo.name}]" + for s in sel.solvables + puts "- #{s.str} [#{s.repo.name}]: #{s.lookup_str(Solv::SOLVABLE_SUMMARY)}" end exit end +abort("unknown command '#{cmd}'\n") unless cmdactionmap.has_key?(cmd) + addedprovides = pool.addfileprovides_queue() if !addedprovides.empty? sysrepo.updateaddedprovides(addedprovides) @@ -570,7 +582,8 @@ pool.createwhatprovides() jobs = [] for arg in args - flags = Solv::Selection::SELECTION_NAME | Solv::Selection::SELECTION_PROVIDES|Solv::Selection::SELECTION_GLOB + flags = Solv::Selection::SELECTION_NAME | Solv::Selection::SELECTION_PROVIDES | Solv::Selection::SELECTION_GLOB + flags |= Solv::Selection::SELECTION_CANON | Solv::Selection::SELECTION_DOTARCH | Solv::Selection::SELECTION_REL if arg =~ /^\// flags |= Solv::Selection::SELECTION_FILELIST flags |= Solv::Selection::SELECTION_INSTALLED_ONLY if cmd == 'erase' @@ -582,180 +595,170 @@ for arg in args end puts "[using file list match for '#{arg}']" if sel.flags & Solv::Selection::SELECTION_FILELIST != 0 puts "[using capability match for '#{arg}']" if sel.flags & Solv::Selection::SELECTION_PROVIDES != 0 - jobs += sel.jobs(0) + jobs += sel.jobs(cmdactionmap[cmd]) end if jobs.empty? && (cmd == 'up' || cmd == 'dup' || cmd == 'verify') - sel = pool.Selection() - sel.addsimple(Solv::Job::SOLVER_SOLVABLE_ALL, 0) - jobs += sel.jobs(0) + sel = pool.Selection_all() + jobs += sel.jobs(cmdactionmap[cmd]) end +abort("no package matched.") if jobs.empty? + if cmd == 'list' || cmd == 'info' - abort("no package matched.") if jobs.empty? - for job in jobs - for s in job.solvables() - if cmd == 'info' - puts "Name: #{s.str}" - puts "Repo: #{s.repo.name}" - puts "Summary: #{s.lookup_str(Solv::SOLVABLE_SUMMARY)}" - str = s.lookup_str(Solv::SOLVABLE_URL) - puts "Url: #{str}" if str - str = s.lookup_str(Solv::SOLVABLE_LICENSE) - puts "License: #{str}" if str - puts "Description:\n#{s.lookup_str(Solv::SOLVABLE_DESCRIPTION)}" - puts - else - puts " - #{s.str} [#{s.repo.name}]" - puts " #{s.lookup_str(Solv::SOLVABLE_SUMMARY)}" - end + for job in jobs + for s in job.solvables() + if cmd == 'info' + puts "Name: #{s.str}" + puts "Repo: #{s.repo.name}" + puts "Summary: #{s.lookup_str(Solv::SOLVABLE_SUMMARY)}" + str = s.lookup_str(Solv::SOLVABLE_URL) + puts "Url: #{str}" if str + str = s.lookup_str(Solv::SOLVABLE_LICENSE) + puts "License: #{str}" if str + puts "Description:\n#{s.lookup_str(Solv::SOLVABLE_DESCRIPTION)}" + puts + else + puts " - #{s.str} [#{s.repo.name}]" + puts " #{s.lookup_str(Solv::SOLVABLE_SUMMARY)}" end end + end exit end -if cmd == 'install' || cmd == 'erase' || cmd == 'up' || cmd == 'dup' || cmd == 'verify' - abort("no package matched.") if jobs.empty? - for job in jobs - if cmd == 'up' - if job.how == Solv::Job::SOLVER_SOLVABLE_ALL || job.solvables.any? {|s| s.isinstalled?} - job.how |= Solv::Job::SOLVER_UPDATE - else - job.how |= Solv::Job::SOLVER_INSTALL - end - elsif cmd == 'install' - job.how |= Solv::Job::SOLVER_INSTALL - elsif cmd == 'erase' - job.how |= Solv::Job::SOLVER_ERASE - elsif cmd == 'dup' - job.how |= Solv::Job::SOLVER_DISTUPGRADE - elsif cmd == 'verify' - job.how |= Solv::Job::SOLVER_VERIFY - end - end - - solver = nil - #pool.set_debuglevel(1) - while true - solver = pool.Solver - solver.set_flag(Solv::Solver::SOLVER_FLAG_SPLITPROVIDES, 1) - solver.set_flag(Solv::Solver::SOLVER_FLAG_ALLOW_UNINSTALL, 1) if cmd == 'erase' - problems = solver.solve(jobs) - break if problems.empty? - for problem in problems - puts "Problem #{problem.id}:" - puts problem.findproblemrule.info.problemstr - solutions = problem.solutions - for solution in solutions - puts " Solution #{solution.id}:" - elements = solution.elements(true) - for element in elements - puts " - #{element.str}" - end - puts - end - sol = nil - while true - print "Please choose a solution: " - STDOUT.flush - sol = STDIN.gets.strip - break if sol == 's' || sol == 'q' - break if sol =~ /^\d+$/ && sol.to_i >= 1 && sol.to_i <= solutions.length +for job in jobs + job.how ^= Solv::Job::SOLVER_UPDATE ^ Solv::Job::SOLVER_INSTALL if cmd == 'up' and job.isemptyupdate? +end + +solver = pool.Solver +solver.set_flag(Solv::Solver::SOLVER_FLAG_SPLITPROVIDES, 1) +solver.set_flag(Solv::Solver::SOLVER_FLAG_ALLOW_UNINSTALL, 1) if cmd == 'erase' +#pool.set_debuglevel(1) + +while true + problems = solver.solve(jobs) + break if problems.empty? + for problem in problems + puts "Problem #{problem.id}/#{problems.count}:" + puts problem + solutions = problem.solutions + for solution in solutions + puts " Solution #{solution.id}:" + elements = solution.elements(true) + for element in elements + puts " - #{element.str}" end - next if sol == 's' - abort if sol == 'q' - solution = solutions[sol.to_i - 1] - for element in solution.elements - newjob = element.Job() - if element.type == Solv::Solver::SOLVER_SOLUTION_JOB - jobs[element.jobidx] = newjob - else - jobs.push(newjob) if newjob && !jobs.include?(newjob) - end + puts + end + sol = nil + while true + print "Please choose a solution: " + STDOUT.flush + sol = STDIN.gets.strip + break if sol == 's' || sol == 'q' + break if sol =~ /^\d+$/ && sol.to_i >= 1 && sol.to_i <= solutions.length + end + next if sol == 's' + abort if sol == 'q' + solution = solutions[sol.to_i - 1] + for element in solution.elements + newjob = element.Job() + if element.type == Solv::Solver::SOLVER_SOLUTION_JOB + jobs[element.jobidx] = newjob + else + jobs.push(newjob) if newjob && !jobs.include?(newjob) end end end - trans = solver.transaction - solver = nil - if trans.isempty? - puts "Nothing to do." - exit - end - puts "\nTransaction summary:\n" - for cl in trans.classify() - if cl.type == Solv::Transaction::SOLVER_TRANSACTION_ERASE - puts "#{cl.count} erased packages:" - elsif cl.type == Solv::Transaction::SOLVER_TRANSACTION_INSTALL - puts "#{cl.count} installed packages:" - elsif cl.type == Solv::Transaction::SOLVER_TRANSACTION_REINSTALLED - puts "#{cl.count} reinstalled packages:" - elsif cl.type == Solv::Transaction::SOLVER_TRANSACTION_DOWNGRADED - puts "#{cl.count} downgraded packages:" - elsif cl.type == Solv::Transaction::SOLVER_TRANSACTION_CHANGED - puts "#{cl.count} changed packages:" - elsif cl.type == Solv::Transaction::SOLVER_TRANSACTION_UPGRADED - puts "#{cl.count} upgraded packages:" - elsif cl.type == Solv::Transaction::SOLVER_TRANSACTION_VENDORCHANGE - puts "#{cl.count} vendor changes from '#{pool.id2str(cl.fromid)}' to '#{pool.id2str(cl.toid)}':" - elsif cl.type == Solv::Transaction::SOLVER_TRANSACTION_ARCHCHANGE - puts "#{cl.count} arch changes from '#{pool.id2str(cl.fromid)}' to '#{pool.id2str(cl.toid)}':" +end + +trans = solver.transaction +solver = nil +if trans.isempty? + puts "Nothing to do." + exit +end + +puts "\nTransaction summary:\n" +for cl in trans.classify(Solv::Transaction::SOLVER_TRANSACTION_SHOW_OBSOLETES | Solv::Transaction::SOLVER_TRANSACTION_OBSOLETE_IS_UPGRADE) + if cl.type == Solv::Transaction::SOLVER_TRANSACTION_ERASE + puts "#{cl.count} erased packages:" + elsif cl.type == Solv::Transaction::SOLVER_TRANSACTION_INSTALL + puts "#{cl.count} installed packages:" + elsif cl.type == Solv::Transaction::SOLVER_TRANSACTION_REINSTALLED + puts "#{cl.count} reinstalled packages:" + elsif cl.type == Solv::Transaction::SOLVER_TRANSACTION_DOWNGRADED + puts "#{cl.count} downgraded packages:" + elsif cl.type == Solv::Transaction::SOLVER_TRANSACTION_CHANGED + puts "#{cl.count} changed packages:" + elsif cl.type == Solv::Transaction::SOLVER_TRANSACTION_UPGRADED + puts "#{cl.count} upgraded packages:" + elsif cl.type == Solv::Transaction::SOLVER_TRANSACTION_VENDORCHANGE + puts "#{cl.count} vendor changes from '#{cl.fromstr}' to '#{cl.tostr}':" + elsif cl.type == Solv::Transaction::SOLVER_TRANSACTION_ARCHCHANGE + puts "#{cl.count} arch changes from '#{cl.fromstr}' to '#{cl.tostr}':" + else + next + end + for p in cl.solvables + if cl.type == Solv::Transaction::SOLVER_TRANSACTION_UPGRADED || cl.type == Solv::Transaction::SOLVER_TRANSACTION_DOWNGRADED + puts " - #{p.str} -> #{trans.othersolvable(p).str}" else - next - end - for p in cl.solvables - if cl.type == Solv::Transaction::SOLVER_TRANSACTION_UPGRADED || cl.type == Solv::Transaction::SOLVER_TRANSACTION_DOWNGRADED - puts " - #{p.str} -> #{trans.othersolvable(p).str}" - else - puts " - #{p.str}" - end + puts " - #{p.str}" end - puts end - puts "install size change: #{trans.calc_installsizechange()} K\n\n" - while true: - print("OK to continue (y/n)? ") - STDOUT.flush - yn = STDIN.gets.strip - break if yn == 'y' - abort if yn == 'n' - end - newpkgs = trans.newpackages() - newpkgsfp = {} - if !newpkgs.empty? - downloadsize = 0 - for p in newpkgs - downloadsize += p.lookup_num(Solv::SOLVABLE_DOWNLOADSIZE) - end - puts "Downloading #{newpkgs.length} packages, #{downloadsize} K" - for p in newpkgs - repo = p.repo.appdata - location, medianr = p.lookup_location() - next unless location - chksum = p.lookup_checksum(Solv::SOLVABLE_CHECKSUM) - f = repo.download_location(location, chksum) - newpkgsfp[p.id] = f - print "." - STDOUT.flush() - end - puts - end - puts "Committing transaction:" puts - trans.order(0) - for p in trans.steps - steptype = trans.steptype(p, Solv::Transaction::SOLVER_TRANSACTION_RPM_ONLY) - if steptype == Solv::Transaction::SOLVER_TRANSACTION_ERASE - puts "erase #{p.str}" - next unless p.lookup_num(Solv::RPM_RPMDBID) - evr = p.evr.sub(/^[0-9]+:/, '') - system('rpm', '-e', '--nodeps', '--nodigest', '--nosignature', "#{p.name}-#{evr}.#{p.arch}") || abort("rpm failed: #{$? >> 8}") - elsif (steptype == Solv::Transaction::SOLVER_TRANSACTION_INSTALL || steptype == Solv::Transaction::SOLVER_TRANSACTION_MULTIINSTALL) - puts "install #{p.str}" - f = newpkgsfp.delete(p.id) - next unless f - mode = steptype == Solv::Transaction::SOLVER_TRANSACTION_INSTALL ? '-U' : '-i' - system('rpm', mode, '--force', '--nodeps', '--nodigest', '--nosignature', "/dev/fd/#{Solv::xfileno(f).to_s}") || abort("rpm failed: #{$? >> 8}") - solv::xfclose(f) - end +end +puts "install size change: #{trans.calc_installsizechange()} K\n\n" + +while true + print("OK to continue (y/n)? ") + STDOUT.flush + yn = STDIN.gets.strip + break if yn == 'y' + abort if yn == 'n' || yn == 'q' +end + +newpkgs = trans.newsolvables() +newpkgsfp = {} +if !newpkgs.empty? + downloadsize = 0 + for p in newpkgs + downloadsize += p.lookup_num(Solv::SOLVABLE_DOWNLOADSIZE) + end + puts "Downloading #{newpkgs.length} packages, #{downloadsize} K" + for p in newpkgs + repo = p.repo.appdata + location, medianr = p.lookup_location() + next unless location + location = repo.packagespath + location + chksum = p.lookup_checksum(Solv::SOLVABLE_CHECKSUM) + f = repo.download(location, false, chksum) + abort("\n#{@name}: #{location} not found in repository\n") unless f + newpkgsfp[p.id] = f + print "." + STDOUT.flush() + end + puts +end + +puts "Committing transaction:" +puts +trans.order() +for p in trans.steps + steptype = trans.steptype(p, Solv::Transaction::SOLVER_TRANSACTION_RPM_ONLY) + if steptype == Solv::Transaction::SOLVER_TRANSACTION_ERASE + puts "erase #{p.str}" + next unless p.lookup_num(Solv::RPM_RPMDBID) + evr = p.evr.sub(/^[0-9]+:/, '') + system('rpm', '-e', '--nodeps', '--nodigest', '--nosignature', "#{p.name}-#{evr}.#{p.arch}") || abort("rpm failed: #{$? >> 8}") + elsif (steptype == Solv::Transaction::SOLVER_TRANSACTION_INSTALL || steptype == Solv::Transaction::SOLVER_TRANSACTION_MULTIINSTALL) + puts "install #{p.str}" + f = newpkgsfp.delete(p.id) + next unless f + mode = steptype == Solv::Transaction::SOLVER_TRANSACTION_INSTALL ? '-U' : '-i' + system('rpm', mode, '--force', '--nodeps', '--nodigest', '--nosignature', "/dev/fd/#{f.fileno().to_s}") || abort("rpm failed: #{$? >> 8}") + f.close end end