mvc Tux's lil' helper
Joined: 27 Nov 2002 Posts: 98 Location: Portugal
|
Posted: Sun Jul 06, 2003 1:55 am Post subject: script python para afinar "update world" |
|
|
Vou colocar aqui um script que fiz para tornar os "update world" mais versateis
(vêr https://forums.gentoo.org/viewtopic.php?t=65435) :
Code: |
#!/usr/bin/env python2.2
# Copyright 2003 Marco Correia - mvc@netcabo.pt
# Distributed under the terms of the GNU General Public License v2
# Version 0.0000000001
# Some code was borrowed from the etcat script, by Alastair Tse
import portage,string,pprint,re,readline
from stat import *
from output import *
ASK='ask'
ALWAYS='always'
NEVER='never'
MAJOR='major'
MINOR='minor'
RELEASE='release'
USE_FILE='use-file'
NONE='not found'
UP_FILE=os.environ['HOME']+'/.upolicy'
OUT_FILE=os.environ['HOME']+'/.upkgs_tmp'
# Search for packages newer thant a given package |
def get_newer_packages(pkg):
matches = []
pkg_catsplit = portage.catpkgsplit(pkg)
pkg_matches = portage.portdb.cp_list(pkg_catsplit[0]+\
"/"+pkg_catsplit[1])
pkg_split = portage.pkgsplit(pkg)
for package in pkg_matches:
package_split = portage.pkgsplit(package)
if portage.pkgcmp(package_split,pkg_split) == 1 :
matches.append(package)
return matches
# output the description for a package
def output_description(pkg_file):
ebuild_file = pkg_file
lines = open(ebuild_file).readlines()
descre = re.compile("^DESCRIPTION")
for ln in lines:
if descre.match(ln):
dtext = ln.split("\"")
print "description: " + green(dtext[1])
return
# output the latest entry in changelog
# (taken from the etcat script)
def output_log(lines, package_ver=""):
# using simple rules that all changelog entries have a "*"
# as the first char
is_log = 0
is_printed = 0
for line in lines:
if package_ver:
start_entry = re.search("^[\s]*\*[\s]*(" + \
package_ver + ")[\s]+.*(\(.*\))",line)
else:
start_entry = re.search("^[\s]*\*[\s]*(.*)[\s]+.*(\(.*\))",line)
if not is_log and start_entry:
is_printed = 1
is_log = 1
print green("*") + " " + white(start_entry.group(1)) +\
" " + turquoise(start_entry.group(2)) + " :"
elif is_log and re.search("^[\s]*\*[\s]*(.*)[\s]+.*(\(.*\))",line):
break
elif is_log:
print line.rstrip()
else:
pass
return is_printed
# print out the ChangeLog entries for package |
# (based on the function with the same name in the etcat script)
def changes(pkg):
matches = []
printed = 0
matches = get_newer_packages(pkg)
tup = portage.catpkgsplit(pkg)
if tup[3] != "r0":
print "[ Changes after version " + green(tup[2]+"-"+tup[3]) + " ]"
else:
print "[ Changes after version " + green(tup[2]) + " ]"
print
changelog_file = portage.settings["PORTDIR"] + '/' + \
tup[0] + "/" + tup[1] + '/ChangeLog'
if os.path.exists(changelog_file):
for match in matches:
output_log(open(changelog_file).readlines(),match.split('/')[1])
else:
print "Error: No Changelog for " + pkg
return
# returns 1 if package pkgnew is to be updated assuming police updatewhen
# assumes that pkgnew is the same or newer version of pkginstalled
def to_update(pkginstalled,pkgnew,updatewhen):
if pkginstalled == pkgnew or updatewhen == NEVER :
return 0
if updatewhen == ALWAYS:
return 1
pi = portage.pkgsplit(pkginstalled)
pn = portage.pkgsplit(pkgnew)
if updatewhen == ASK:
print "installed: "+green(pi[1]+"-"+pi[2])
print "latest: "+green(pn[1]+"-"+pn[2])
asw=""
while asw!="u" and asw!="U" and asw!="s" and asw!="S":
asw = raw_input("[ "+red("U")+"pdate ] [ "+\
red("S")+"kip ] [ see "+\
red("C")+"hanges ] : ").lower()
if asw == "c":
changes(pkginstalled)
print
if asw == "s":
return 0
else:
return 1
vi = string.split(pi[1],".")
vn = string.split(pn[1],".")
if vn[0] > vi[0]:
return 1
elif updatewhen == MAJOR:
return 0
if len(vn)==1 and len(vi)==1:
return 0
if len(vn)==1 or len(vi)==1:
return 1
if vn[1] > vi[1]:
return 1
elif updatewhen == MINOR:
return 0
if len(vn)==2 and len(vi)==2:
return 0
if len(vn)==2 or len(vi)==2:
return 1
if vn[2] > vi[2]:
return 1
return 0
# get updating policy for package pkgname
# pkgname is without the version
def get_upolicy(pkgname,lines):
for ln in lines:
lnlist = ln.split()
if lnlist[0]==pkgname:
return lnlist[1]
return NONE
# set updating policy for package pkgname
# pkgname is without the version
def set_policy(pkgname,upfile):
# print "Package updating policy not found in "+green(UP_FILE)+". Please enter policy :"
print "please choose updating policy for this package :"
asw=""
while asw!="m" and asw!="i" and asw!="r" and asw!="a" \
and asw!="n" and asw!="k" and asw!="p" :
print "[ "+red("M")+"ajor ] [ m"+red("I")+"nor ] [ "+red("R")+"elease ]"
asw = raw_input("[ "+red("A")+"lways ] [ "+red("N")+\
"ever ] [ as"+red("K")+" ] [ no "+\
red("P")+"olicy ] : ").lower()
print
if (asw == "m"):
policy = MAJOR
elif (asw == "i"):
policy = MINOR
elif (asw == "r"):
policy = RELEASE
elif (asw == "a"):
policy = ALWAYS
elif (asw == "n"):
policy = NEVER
elif (asw == "k"):
policy = ASK
upfile.seek(0,2)
upfile.write(pkgname+" "+policy+"\n")
return policy
# gets the path to the pkg ebuild
# note that pkg is a list
def find_ebuild(pkg):
if pkg[3]!="r0":
ebuild_name='/'+pkg[0]+"/"+pkg[1]+"/"+pkg[1]+"-"+pkg[2]+"-"+pkg[3]+'.ebuild'
else:
ebuild_name='/'+pkg[0]+"/"+pkg[1]+"/"+pkg[1]+"-"+pkg[2]+'.ebuild'
if os.path.exists(portage.settings["PORTDIR"]+ebuild_name):
file=portage.settings["PORTDIR"]+ebuild_name
elif os.path.exists(portage.settings["PORTDIR_OVERLAY"]+ebuild_name):
file=portage.settings["PORTDIR_OVERLAY"]+ebuild_name
else:
file=""
return file
# get list of packages to update
def get_update_list(lns,policy):
up_file = file(UP_FILE,"a+")
uplns = up_file.readlines()
ebuildre = re.compile("^\[ebuild ")
ulist=[]
for ln in lns:
if ebuildre.match(ln):
lnlist = ln.split()
if lnlist[1] == "U":
newpkg = portage.catpkgsplit(lnlist[3])
pkginstalled = newpkg[0]+"/"+newpkg[1]+"-"+lnlist[4][1:-1]
if policy == USE_FILE:
pkg_policy = get_upolicy(newpkg[0]+"/"+newpkg[1],uplns)
else:
pkg_policy = policy
print "* updating policy for package ["+\
white(newpkg[0]+"/"+newpkg[1])+"] : "+blue(pkg_policy)
if pkg_policy == NONE:
output_description(find_ebuild(newpkg))
print "installed: "+green(lnlist[4][1:-1])
print "latest: "+green(newpkg[2]+"-"+newpkg[3])
pkg_policy = set_policy(newpkg[0]+"/"+newpkg[1],up_file)
if to_update(pkginstalled,lnlist[3],pkg_policy):
ulist.append(newpkg[0]+"/"+newpkg[1])
return ulist
# Main
print "Generating list of all updates ..."
pp = os.popen("emerge --pretend --update --nodeps world","r")
policy=USE_FILE
extra_args=['/usr/bin/emerge','--update']
i=1
while i < len(sys.argv):
if sys.argv[i]=="--policy":
policy = sys.argv[i+1]
i=i+1
elif sys.argv[i]=="--help" or sys.argv[i]=="-h":
print "Usage: "+sys.argv[0]+" options"
print "options can be a combination of:"
print "--policy (use-file | major | minor | release | always | ask) :default = use_file: "
print "-h --help"
print "and any other options to insert after \"emerge --update\". (--pretend is a good one)"
sys.exit(0)
else:
extra_args.append(sys.argv[i])
i=i+1
if policy!=USE_FILE and policy!=MAJOR and policy!=MINOR and \
policy!=RELEASE and policy!=ALWAYS and policy!=ASK:
print "Unkown updating policy. Try --help"
sys.exit(0)
lns = pp.readlines()
pp.close()
ulist = get_update_list(lns,policy)
out_file=open(OUT_FILE,"w")
if len(ulist) > 0:
pkg_args = extra_args
for pkg in ulist:
pkg_args.append(pkg)
# print "Updating "+white(pkg)+" :"
# Don't know why none of these work ...
# status = portage.spawn(string.join(pkg_args),0,1)
# status = os.spawnv(os.P_WAIT,'/usr/bin/emerge', pkg_args)
# if status != 0:
# print "An error occurred when updating "+white(pkg)+". "+ \
# sys.argv[0]+" will exit."
# sys.exit(0)
# Workaround -> write the strings to an executable text file
out_file.write(string.join(pkg_args)+" && \\\n")
pkg_args.pop()
out_file.write("true")
out_file.close()
|
Deve ser copiado para um ficheiro (por exemplo c-update-world.py) e tornado executável. Depois para executar faz-se
Code: |
c-update-world.py && sh ~/.upkgs_tmp
|
|
|