X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=examples%2Frbsolv;h=87f0d16089afa4c05c523e127a05cdf27a620e7d;hb=refs%2Ftags%2Fupstream%2F0.6.28;hp=eb77395502aeff30b8556964d25e44bbd18db774;hpb=26f2f1fe6e2f6a27c45b01c2e53970ec25b32e93;p=platform%2Fupstream%2Flibsolv.git diff --git a/examples/rbsolv b/examples/rbsolv index eb77395..87f0d16 100755 --- a/examples/rbsolv +++ b/examples/rbsolv @@ -44,9 +44,7 @@ class Repo_generic chksum.add("1.1") chksum.add(cookie) chksum.add_fstat(f.fileno) - extcookie = chksum.raw() - extcookie[0] = 1 if extcookie[0] == 0 - return extcookie + return chksum.raw() end def cachepath(ext = nil) @@ -68,6 +66,7 @@ class Repo_generic end end @cookie = nil + @extcookie = nil if !dorefresh && usecachedrepo(nil) puts "repo: '#{@name}' cached" return true @@ -104,11 +103,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 + f.close + return rf end def usecachedrepo(ext, mark = false) @@ -126,14 +128,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 @@ -148,39 +151,41 @@ class Repo_generic return true end - def writecachedrepo(ext, info = nil) - return if @incomplete && !ext + def writecachedrepo(ext, repodata = 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) - if !info + sf = Solv::xfopen_fd('', f.fileno) + if !repodata @handle.write(sf) elsif ext - info.write(sf) + repodata.write(sf) else @handle.write_first_repodata(sf) end - Solv::xfclose(sf) + sf.close f.sysseek(0, IO::SEEK_END) if @type != 'system' && !ext @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 if !ext @handle.empty() - abort("internal error, cannot reload solv file") unless @handle.add_solv(sf, Solv::Repo::SOLV_ADD_NO_STUBS) + abort("internal error, cannot reload solv file") unless @handle.add_solv(sf, repodata ? 0 : Solv::Repo::SOLV_ADD_NO_STUBS) else - info.extend_to_repo() - info.add_solv(sf, Solv::Repo::REPO_EXTEND_SOLVABLES) + repodata.extend_to_repo() + flags = Solv::Repo::REPO_EXTEND_SOLVABLES + flags |= Solv::Repo::REPO_LOCALPOOL if ext != 'DL' + repodata.add_solv(sf, flags) end - Solv::xfclose(sf) + sf.close end end File.rename(f.path, cachepath(ext)) @@ -208,12 +213,39 @@ class Repo_generic def packagespath() return '' end + + @@langtags = { + Solv::SOLVABLE_SUMMARY => Solv::REPOKEY_TYPE_STR, + Solv::SOLVABLE_DESCRIPTION => Solv::REPOKEY_TYPE_STR, + Solv::SOLVABLE_EULA => Solv::REPOKEY_TYPE_STR, + Solv::SOLVABLE_MESSAGEINS => Solv::REPOKEY_TYPE_STR, + Solv::SOLVABLE_MESSAGEDEL => Solv::REPOKEY_TYPE_STR, + Solv::SOLVABLE_CATEGORY => Solv::REPOKEY_TYPE_ID, + } + + def add_ext_keys(ext, repodata, h) + if ext == 'DL' + repodata.add_idarray(h, Solv::REPOSITORY_KEYS, Solv::REPOSITORY_DELTAINFO) + repodata.add_idarray(h, Solv::REPOSITORY_KEYS, Solv::REPOKEY_TYPE_FLEXARRAY) + elsif ext == 'DU' + repodata.add_idarray(h, Solv::REPOSITORY_KEYS, Solv::SOLVABLE_DISKUSAGE) + repodata.add_idarray(h, Solv::REPOSITORY_KEYS, Solv::REPOKEY_TYPE_DIRNUMNUMARRAY) + elsif ext == 'FL' + repodata.add_idarray(h, Solv::REPOSITORY_KEYS, Solv::SOLVABLE_FILELIST) + repodata.add_idarray(h, Solv::REPOSITORY_KEYS, Solv::REPOKEY_TYPE_DIRSTRARRAY) + else + @@langtags.sort.each do |langid, langtype| + repodata.add_idarray(h, Solv::REPOSITORY_KEYS, @handle.pool.id2langid(langid, ext, true)) + repodata.add_idarray(h, Solv::REPOSITORY_KEYS, langtype) + end + end + 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() @@ -242,18 +274,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 @@ -262,7 +294,7 @@ 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() @@ -279,18 +311,13 @@ class Repo_rpmmd < Repo_generic repodata.set_poolstr(h, Solv::REPOSITORY_REPOMD_TYPE, what) repodata.set_str(h, Solv::REPOSITORY_REPOMD_LOCATION, filename) repodata.set_checksum(h, Solv::REPOSITORY_REPOMD_CHECKSUM, filechksum) - if ext == 'DL' - repodata.add_idarray(h, Solv::REPOSITORY_KEYS, Solv::REPOSITORY_DELTAINFO) - repodata.add_idarray(h, Solv::REPOSITORY_KEYS, Solv::REPOKEY_TYPE_FLEXARRAY) - elsif ext == 'FL' - repodata.add_idarray(h, Solv::REPOSITORY_KEYS, Solv::SOLVABLE_FILELIST) - repodata.add_idarray(h, Solv::REPOSITORY_KEYS, Solv::REPOKEY_TYPE_DIRSTRARRAY) - end + add_ext_keys(ext, repodata, h) repodata.add_flexarray(Solv::SOLVID_META, Solv::REPOSITORY_EXTERNAL, h) end def add_exts repodata = @handle.add_repodata(0) + repodata.extend_to_repo() add_ext(repodata, 'deltainfo', 'DL') add_ext(repodata, 'filelists', 'FL') repodata.internalize() @@ -317,11 +344,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 @@ -331,7 +358,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() @@ -354,14 +381,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 @@ -369,14 +396,14 @@ 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() @@ -388,41 +415,18 @@ class Repo_susetags < Repo_generic return true end - @@langtags = { - Solv::SOLVABLE_SUMMARY => Solv::REPOKEY_TYPE_STR, - Solv::SOLVABLE_DESCRIPTION => Solv::REPOKEY_TYPE_STR, - Solv::SOLVABLE_EULA => Solv::REPOKEY_TYPE_STR, - Solv::SOLVABLE_MESSAGEINS => Solv::REPOKEY_TYPE_STR, - Solv::SOLVABLE_MESSAGEDEL => Solv::REPOKEY_TYPE_STR, - Solv::SOLVABLE_CATEGORY => Solv::REPOKEY_TYPE_ID, - } - def add_ext(repodata, what, ext) (filename, filechksum) = find(what) h = repodata.new_handle() repodata.set_str(h, Solv::SUSETAGS_FILE_NAME, filename) repodata.set_checksum(h, Solv::SUSETAGS_FILE_CHECKSUM, filechksum) - if ext == 'DL' - repodata.add_idarray(h, Solv::REPOSITORY_KEYS, Solv::REPOSITORY_DELTAINFO) - repodata.add_idarray(h, Solv::REPOSITORY_KEYS, Solv::REPOKEY_TYPE_FLEXARRAY) - elsif ext == 'DU' - repodata.add_idarray(h, Solv::REPOSITORY_KEYS, Solv::SOLVABLE_DISKUSAGE) - repodata.add_idarray(h, Solv::REPOSITORY_KEYS, Solv::REPOKEY_TYPE_DIRNUMNUMARRAY) - elsif ext == 'FL' - repodata.add_idarray(h, Solv::REPOSITORY_KEYS, Solv::SOLVABLE_FILELIST) - repodata.add_idarray(h, Solv::REPOSITORY_KEYS, Solv::REPOKEY_TYPE_DIRSTRARRAY) - else - @@langtags.sort.each do |langid, langtype| - repodata.add_idarray(h, Solv::REPOSITORY_KEYS, @handle.pool.id2langid(langid, ext, true)) - repodata.add_idarray(h, Solv::REPOSITORY_KEYS, langtype) - end - end + add_ext_keys(ext, repodata, h) repodata.add_flexarray(Solv::SOLVID_META, Solv::REPOSITORY_EXTERNAL, h) end 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 @@ -443,20 +447,22 @@ 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 packagespath() - datadir = @handle.lookup_str(Solv::SOLVID_META, Solv::SUSETAGS_DATADIR) + datadir = @handle.meta.lookup_str(Solv::SUSETAGS_DATADIR) datadir = "suse" unless datadir return datadir + '/' end @@ -484,7 +490,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 if f writecachedrepo(nil) return true end @@ -492,11 +500,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 = [] @@ -508,7 +525,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]) @@ -539,17 +556,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) @@ -561,7 +580,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' @@ -573,182 +593,171 @@ 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 + puts " - #{p.str}" 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 - 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 - 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(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 / 1024} 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' + f.cloexec(0) + system('rpm', mode, '--force', '--nodeps', '--nodigest', '--nosignature', "/dev/fd/#{f.fileno().to_s}") || abort("rpm failed: #{$? >> 8}") + f.close end end