#!/usr/bin/env ruby $version = '0.4' $aboutText = %Q{ This is rtkmerge version #{$version} usage: rtkmerge world -u rtkmerge ruby Always press the pretend-button to see which packages the current configuration will merge. It might be more then you expect. 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 = "" $flagsWhenPretend = "-pv" nUseFlaggorPerRad = 6; $useProgressBar = false 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 kortNamn namn.split("/",2)[1] end def nyVersion @paketArray[1] end def instaleradVersion if @paketArray[2]!=nil then if @paketArray[2][0]==?[ then @paketArray[2] else "" end 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.class == TkButton)||(w.class==TkCheckbutton) then w.configure('state'=>'disabled') end } end def emerge(argString) cmd = "USE=\"" useArray.each do |s| cmd<<" "<'x') orient 'horizontal' from 0 to 100 } end def portageDistfiles "/usr/portage/distfiles" end def abortPackage if(@tThread.alive?) then @tThread.kill end end def numberOfFiles(package) cmd = "ls "+ portageDistfiles+"/"+package.kortNamn+'-'+package.nyVersion[1..package.nyVersion.length-2].split("-")[0]+".tar.*" fileName = `#{cmd}` fileName = fileName.strip # puts fileName.split(".").last if (fileName.split(".").last.=="gz") then antal= `tar ztf #{fileName} | grep [.][c]| wc --lines` else antal= `tar jtf #{fileName} | grep [.][c]| wc --lines` end antal = antal.strip puts "Number of source-files: " + antal antal.to_i end def timePerFile 3 end def newPackage(package) waitTime = numberOfFiles(package) * timePerFile waitTime = waitTime.to_f/100 puts "waitTime är: " + waitTime.to_s if waitTime != 0.0 then @tThread = Thread.new { 101.times { |i| @scale.set i sleep waitTime } } else # we have to initialize tThread or abortPackage will be mad @tThread = Thread.new {} @scale.set 50 end end end def aboutWindow aroot = TkToplevel.new(root) {title 'About'} atop = TkFrame.new(aroot) atop.pack TkLabel.new(atop) { pack('side'=>'top') text $aboutText } TkButton.new(atop) { pack('side'=>'top') text 'close' command proc { aroot.destroy } } end def pretendEmerge(mina_paket) puts "Calculating dependencies" allToPretend = "These are the packages that I would merge, in order:\n" 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 } pwin = TkToplevel.new(root) { title 'pretend' } TkLabel.new(pwin) { justify 'left' text allToPretend pack } 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) if $useProgressBar then pb = ProgressBar.new(top) end 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.class #puts " " + p.toEmerge if p.toEmerge=='yes' then p.setBackground('yellow') if $useProgressBar then p.emerge("--fetchonly") pb.newPackage(p) end if (p == mina_paket.last) then # the last package could be a new package p.emerge(flagsWhenEmerge) else # some of these might be dep's and should not be added to world # the rest are allready in world p.emerge(flagsWhenEmerge+" --oneshot") end if $useProgressBar then pb.abortPackage end 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 { |pk| pk.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') } } } } if $useProgressBar then pb.pack('side'=>'top','fill'=>'x') end Tk.mainloop END { trap("SIGINT") {} Process.kill("SIGINT",0) }