#!/usr/bin/env ruby $version = '0.3' $aboutText = %Q{ This is rtkmerge version #{$version} Rtkmerge is a GUI to emerge. It helps you choose which packages you want to install. It makes the most sense together with world ('rtkmerge world -u'). Rtkmerge can also be used to set USE-flags individually to different packages. It does not yet handle dependencies so a package could be installed even if it is deselected if a selected packages depends on it. Use the pretend-button to get a detailed list of which packages will be installed with the current configuration. This program is licensed under GPL, Gnu Public License written by and copyright: Daniel Forchheimer (upiom), 2003 } require 'tk' commandToGetList = "emerge #{$*.join(" ")} -pv --columns" flagsWhenEmerge = "--oneshot" $flagsWhenPretend = "-pv" nUseFlaggorPerRad = 6; class Paket def initialize(fullStr) fullStr=fullStr[15..fullStr.length]; @paketArray = fullStr.split(' ') @toEmerge = "yes" @pTkWidgets = [] end def tkWidgets @pTkWidgets end def toEmerge=(b) @toEmerge = b; end def toEmerge @toEmerge end def namn @paketArray[0] end def nyVersion @paketArray[1] end def instaleradVersion if @paketArray[2][0]==?[ then @paketArray[2] else "" end end def useArray if instaleradVersion == "" then start=2 else start=3 end @paketArray[start..@paketArray.length] || [] end def toggleUse(useString) ind = useArray.index(useString); if(useArray[ind][0]==43) useArray[ind][0]=45 else useArray[ind][0]=43 end useArray[ind] end def setBackground(color) @pTkWidgets.each { |w| w.configure('background'=>color) } end def disableWidgets @pTkWidgets.each { |w| if (w.type == TkButton)||(w.type==TkCheckbutton) then w.configure('state'=>'disabled') end } end def emerge(argString) cmd = "USE=\"" useArray.each do |s| cmd<<" "<'top') text $aboutText } TkButton.new(atop) { pack('side'=>'top') text 'close' command proc { aroot.destroy } } end def pretendEmerge(mina_paket) # TkToplevel.new(root) allToPretend = "" puts "These are the packages that I would merge, in order:" mina_paket.each { |pk| if pk.toEmerge == 'yes' then pk.emergeCapture($flagsWhenPretend).each_line {|l| if(l["[ebuild"]) then if !(allToPretend[l[16..l.length].split[0]]) then allToPretend << l end end } end } allToPretend.each_line {|l| puts l } end def setButtonColor(u) if(u[0]==?+) background 'red' activebackground 'red4' else background 'blue' activebackground 'blue4' end end mina_paket = Array.new puts "Calculating #{$*[0]} dependencies" cmd = open("|"+commandToGetList) while (string=cmd.gets) if(string["[ebuild"]) mina_paket << Paket.new(string); end end cmd.close puts " ...done!" puts mina_paket.nitems.to_s+" packages to update." root = TkRoot.new { title "Ruby-Tk-Merge: #{$*[0]}" } top = TkFrame.new(root) top.pack('padx'=>5,'pady'=>5) lineFrame = TkFrame.new(top) { pack('side'=>'top','fill'=>'both','pady'=>5) # background 'pink' border 1 relief 'solid' } spareWidgetsToDisable = [] TkButton.new(lineFrame) { pack('side'=>'left','anchor'=>'w') text "Emerge!" command proc { mina_paket.each { |p| p.disableWidgets } spareWidgetsToDisable.each { |w| w.configure('state'=>'disabled') } state 'disabled' mergeThread =Thread.new { mina_paket.each { |p| #print p.toEmerge.type #puts " " + p.toEmerge if p.toEmerge=='yes' then p.setBackground('yellow') p.emerge(flagsWhenEmerge) p.setBackground('green') end } } } } spareWidgetsToDisable << TkButton.new(lineFrame) { pack('side'=>'left','anchor'=>'w') text "pretend" command proc {pretendEmerge(mina_paket) } } TkButton.new(lineFrame) { pack('side'=>'right','anchor'=>'e') text "quit" command proc { root.destroy} } TkButton.new(lineFrame) { pack('side'=>'right','anchor'=>'e') text "about" command proc {aboutWindow } } lineFrame = TkFrame.new(top) { pack('side'=>'top','fill'=>'both','anchor'=>'w') } checkButtons = [] spareWidgetsToDisable << TkButton.new(lineFrame) { pack('side'=>'left','anchor'=>'w') text 'all' command proc { checkButtons.each { |cb| cb.select } mina_paket.each { |p| p.toEmerge="yes" } } } spareWidgetsToDisable << TkButton.new(lineFrame) { pack('side'=>'left','anchor'=>'w') text 'none' command proc { checkButtons.each { |cb| cb.deselect } mina_paket.each { |p| p.toEmerge="no" } } } mina_paket.each { |p| lineFrame = TkFrame.new(top) { pack('side' => 'top','anchor'=>'w','fill'=>'x') } p.tkWidgets << lineFrame check = TkVariable.new p.tkWidgets << TkCheckbutton.new(lineFrame) { variable check check.value='yes' text p.namn+p.nyVersion onvalue 'yes' offvalue 'no' pack('side'=>'left','fill'=>'x','anchor'=>'nw') command proc { p.toEmerge=check.value; } } checkButtons << p.tkWidgets.last p.tkWidgets << TkLabel.new(lineFrame) { text p.instaleradVersion foreground 'blue' pack('side'=>'left','fill'=>'x','anchor'=>'nw') } 0.step(p.useArray.length,nUseFlaggorPerRad) { |i| useLineFrame = TkFrame.new(lineFrame) { pack('side'=>'top','anchor'=>'w') } p.useArray[i..i+nUseFlaggorPerRad-1].each { |u| p.tkWidgets << TkButton.new(useLineFrame) { text u # relief 'solid' setButtonColor(u) command proc { newU = p.toggleUse(u); text newU setButtonColor(newU); } pack('fill' => 'x','side'=>'left','anchor'=>'w') } } } } Tk.mainloop END { Thread.list.each { |t| t.kill } }