summaryrefslogtreecommitdiffstats
path: root/bin/emerge.orig
diff options
context:
space:
mode:
authorBrian Harring <ferringb@gentoo.org>2005-08-30 05:24:38 +0000
committerBrian Harring <ferringb@gentoo.org>2005-08-30 05:24:38 +0000
commit6285ba88dd65e9a662c826ee19d0f00ce96840a9 (patch)
treed44ff8cc68880bcee53b88270b1b3c0c0b11e1f7 /bin/emerge.orig
parent1df71a7fa071e0fac40b305dcc36912df166c073 (diff)
downloadportage-6285ba88dd65e9a662c826ee19d0f00ce96840a9.tar.gz
portage-6285ba88dd65e9a662c826ee19d0f00ce96840a9.tar.bz2
portage-6285ba88dd65e9a662c826ee19d0f00ce96840a9.zip
this file should've been killed long ago.
svn path=/main/branches/2.0/; revision=1952
Diffstat (limited to 'bin/emerge.orig')
-rwxr-xr-xbin/emerge.orig3227
1 files changed, 0 insertions, 3227 deletions
diff --git a/bin/emerge.orig b/bin/emerge.orig
deleted file mode 100755
index 90e559e64..000000000
--- a/bin/emerge.orig
+++ /dev/null
@@ -1,3227 +0,0 @@
-#!/usr/bin/python -O
-# Copyright 1999-2004 Gentoo Foundation
-# Distributed under the terms of the GNU General Public License v2
-# $Id: /var/cvsroot/gentoo-src/portage/bin/emerge,v 1.345.2.33 2005/06/02 00:57:52 vapier Exp $
-
-import os,sys
-os.environ["PORTAGE_CALLER"]="emerge"
-sys.path = ["/usr/lib/portage/pym"]+sys.path
-
-import portage
-
-import emergehelp,xpak,string,re,commands,time,shutil,traceback,atexit,signal,socket,types
-from stat import *
-from output import *
-
-import portage_util
-import portage_locks
-import portage_exception
-
-
-spinner_msgs = ["Gentoo Rocks ("+os.uname()[0]+")",
- "Thank you for using Gentoo. :)",
- "Are you actually trying to read this?",
- "How many times have you stared at this?",
- "We are generating the cache right now",
- "You are paying too much attention.",
- "A theory is better than its explanation.",
- "Phasers locked on target, Captain.",
- "Thrashing is just virtual crashing.",
- "To be is to program.",
- "Real Users hate Real Programmers.",
- "When all else fails, read the instructions.",
- "Functionality breeds Contempt.",
- "The future lies ahead.",
- "3.1415926535897932384626433832795028841971694",
- "Sometimes insanity is the only alternative.",
- "Inaccuracy saves a world of explanation.",
- ]
-
-
-def update_basic_spinner():
- global spinner, spinpos
- spinpos = (spinpos+1) % 500
- if (spinpos % 100) == 0:
- if spinpos == 0:
- sys.stdout.write(". ")
- else:
- sys.stdout.write(".")
- sys.stdout.flush()
-
-def update_scroll_spinner():
- global spinner, spinpos
- if(spinpos >= len(spinner)):
- sys.stdout.write(darkgreen(" \b\b\b"+spinner[len(spinner)-1-(spinpos%len(spinner))]))
- else:
- sys.stdout.write(green("\b "+spinner[spinpos]))
- sys.stdout.flush()
- spinpos = (spinpos+1) % (2*len(spinner))
-
-def update_twirl_spinner():
- global spinner, spinpos
- spinpos = (spinpos+1) % len(spinner)
- sys.stdout.write("\b\b "+spinner[spinpos])
- sys.stdout.flush()
-
-spinpos = 0
-spinner = "/-\\|/-\\|/-\\|/-\\|\\-/|\\-/|\\-/|\\-/|"
-update_spinner = update_twirl_spinner
-if "candy" in portage.settings.features:
- spinner = spinner_msgs[int(time.time()*100)%len(spinner_msgs)]
- update_spinner = update_scroll_spinner
-if not sys.stdout.isatty() or ("--nospinner" in sys.argv):
- update_spinner = update_basic_spinner
-
-
-if (not sys.stdout.isatty()) or (portage.settings["NOCOLOR"] in ["yes","true"]):
- nocolor()
-
-def normpath(mystr):
- if mystr and (mystr[0]=='/'):
- return os.path.normpath("///"+mystr)
- else:
- return os.path.normpath(mystr)
-
-def userquery(prompt, responses=None, colours=None):
- """Displays a prompt and a set of responses, then waits for a response
- which is checked against the responses and the first to match is
- returned.
-
- prompt: a String.
- responses: a List of Strings.
- colours: a List of Functions taking and returning a String, used to
- process the responses for display. Typically these will be functions
- like red() but could be e.g. lambda x: "DisplayString".
- If responses is omitted, defaults to ["Yes, "No"], [green, red].
- If only colours is omitted, defaults to [bold, ...].
-
- Returns a member of the List responses. (If called without optional
- arguments, returns "Yes" or "No".)
- KeyboardInterrupt is converted to SystemExit to avoid tracebacks being
- printed."""
- if responses is None:
- responses, colours = ["Yes", "No"], [green, red]
- elif colours is None:
- colours=[bold]
- colours=(colours*len(responses))[:len(responses)]
- print bold(prompt),
- try:
- while True:
- response=raw_input("["+string.join([colours[i](responses[i]) for i in range(len(responses))],"/")+"] ")
- for key in responses:
- if response.upper()==key[:len(response)].upper():
- return key
- print "Sorry, response '%s' not understood." % response,
- except (EOFError, KeyboardInterrupt):
- print "Interrupted."
- sys.exit(1)
-
-def sorted_versions(verlist):
- ret = []
- for ver in verlist:
- verparts = ver.split("-")
- if len(verparts) == 2:
- verrev = int(verparts[1][1:])
- else:
- verrev = 0
- x = 0
- while x < len(ret):
- retparts = ret[x].split("-")
- verdiff = portage.vercmp(retparts[0], verparts[0])
- if verdiff > 0:
- break
- elif verdiff == 0:
- if len(retparts) == 2:
- retrev = int(retparts[1][1:])
- else:
- retrev = 0
- if retrev >= verrev:
- break
- x += 1
- ret.insert(x, ver)
- return ret
-
-if portage.settings.has_key("PORTAGE_NICENESS"):
- try:
- os.nice(int(portage.settings["PORTAGE_NICENESS"]))
- except SystemExit, e:
- raise # Needed else can't exit
- except Exception,e:
- print "!!! Failed to change nice value to '"+str(portage.settings["PORTAGE_NICENESS"])+"'"
- print "!!!",e
-
-#Freeze the portdbapi for enhanced performance:
-portage.portdb.freeze()
-
-# Kill noauto as it will break merges otherwise.
-while 'noauto' in portage.features:
- del portage.features[portage.features.index('noauto')]
-
-#number of ebuilds merged
-merged=0
-params=["selective", "deep", "self", "recurse", "empty"]
-actions=[
-"clean", "config", "depclean",
-"info", "inject", "metadata",
-"prune", "regen", "rsync", "search",
-"sync", "system", "unmerge", "world",
-]
-options=[
-"--ask",
-"--buildpkg", "--buildpkgonly",
-"--changelog", "--columns",
-"--debug", "--deep",
-"--digest",
-"--emptytree",
-"--fetchonly", "--fetch-all-uri",
-"--getbinpkg", "--getbinpkgonly",
-"--help", "--noconfmem",
-"--newuse", "--nocolor",
-"--nodeps", "--noreplace",
-"--nospinner", "--oneshot",
-"--onlydeps", "--pretend",
-"--quiet", "--resume",
-"--searchdesc", "--selective",
-"--skipfirst",
-"--tree",
-"--update", "--upgradeonly",
-"--usepkg", "--usepkgonly",
-"--verbose", "--version"
-]
-
-shortmapping={
-"1":"--oneshot",
-"a":"--ask",
-"b":"--buildpkg", "B":"--buildpkgonly",
-"c":"--clean", "C":"--unmerge",
-"d":"--debug", "D":"--deep",
-"e":"--emptytree",
-"f":"--fetchonly", "F":"--fetch-all-uri",
-"g":"--getbinpkg", "G":"--getbinpkgonly",
-"h":"--help",
-"i":"--inject",
-"k":"--usepkg", "K":"--usepkgonly",
-"l":"--changelog",
-"n":"--noreplace", "N":"--newuse",
-"o":"--onlydeps", "O":"--nodeps",
-"p":"--pretend", "P":"--prune",
-"q":"--quiet",
-"s":"--search", "S":"--searchdesc",
-'t':"--tree",
-"u":"--update", "U":"--upgradeonly",
-"v":"--verbose", "V":"--version"
-}
-
-myaction=None
-myopts=[]
-myfiles=[]
-edebug=0
-
-# process short actions
-tmpcmdline=sys.argv[1:]
-#tmpcmdline.extend(portage.settings["EMERGE_OPTS"].split())
-cmdline=[]
-for x in tmpcmdline:
- if x[0:1]=="-"and x[1:2]!="-":
- for y in x[1:]:
- if shortmapping.has_key(y):
- if shortmapping[y] in cmdline:
- print
- print "*** Warning: Redundant use of",shortmapping[y]
- else:
- cmdline.append(shortmapping[y])
- else:
- print "!!! Error: -"+y+" is an invalid short action or option."
- sys.exit(1)
- else:
- cmdline.append(x)
-
-# process the options and command arguments
-for x in cmdline:
- if not x:
- continue
- if len(x)>=2 and x[0:2]=="--":
- if x in options:
- myopts.append(x)
- elif x[2:] in actions:
- if x[2:]=="rsync" or x=="rsync":
- # "emerge --rsync"
- print
- print red("*** '--rsync' has been deprecated.")
- print red("*** Please use '--sync' instead.")
- print
- x="--sync"
- if myaction:
- if myaction not in ["system", "world"]:
- myaction="--"+myaction
- print
- print red("!!!")+green(" Multiple actions requested... Please choose one only.")
- print red("!!!")+" '"+darkgreen(myaction)+"' "+red("or")+" '"+darkgreen(x)+"'"
- print
- sys.exit(1)
- myaction=x[2:]
- else:
- print "!!! Error:",x,"is an invalid option."
- sys.exit(1)
- elif (not myaction) and (x in actions):
- if x not in ["system", "world"]:
- #print red("*** Deprecated use of action '"+x+"'")
- if x=="rsync":
- # "emerge rsync"
- print
- print red("*** 'rsync' will now install the package rsync.")
- print red("*** To sync the tree, please use '--sync' instead.")
- print
- myfiles.append(x)
- continue
- if myaction:
- print
- print red("!!!")+green(" Multiple actions requested... Please choose one only.")
- print red("!!! '")+darkgreen(myaction)+"' "+red("or")+" '"+darkgreen(x)+"'"
- print
- sys.exit(1)
- myaction=x
- elif x[-1]=="/":
- # this little conditional helps tab completion
- myfiles.append(x[:-1])
- else:
- myfiles.append(x)
-
-
-if "moo" in myfiles:
- print """
-
- Gentoo (""" + os.uname()[0] + """)
-
- _______________________
-< Have you mooed today? >
- -----------------------
- \ ^__^
- \ (oo)\_______
- (__)\ )\/\
- ||----w |
- || ||
-
-"""
-
-if (myaction in ["world", "system"]) and myfiles:
- print "emerge: please specify a package class (\"world\" or \"system\") or individual packages, but not both."
- sys.exit(1)
-
-for x in myfiles:
- if (x[-7:] == ".ebuild" or x[-5:] == ".tbz2") and os.path.exists(os.path.abspath(x)):
- print "emerging by path implies --oneshot... adding --oneshot to options."
- print red("\n*** emerging by path is broken and may not always work!!!\n")
- break
-
-if ("--tree" in myopts) and ("--columns" in myopts):
- print "emerge: can't specify both of \"--tree\" and \"--columns\"."
- sys.exit(1)
-
-# Always create packages if FEATURES=buildpkg
-# Imply --buildpkg if --buildpkgonly
-if ("buildpkg" in portage.features) or ("--buildpkgonly" in myopts):
- if "--buildpkg" not in myopts:
- myopts.append("--buildpkg")
-
-# --tree only makes sense with --pretend
-if "--tree" in myopts and not (("--pretend" in myopts) or ("--ask" in myopts)):
- print ">>> --tree implies --pretend... adding --pretend to options."
- myopts.append("--pretend")
-
-# Also allow -S to invoke search action (-sS)
-if ("--searchdesc" in myopts):
- if myaction and myaction != "search":
- myfiles.append(myaction)
- if "--search" not in myopts:
- myopts.append("--search")
- myaction = "search"
-
-# Always try and fetch binary packages if FEATURES=getbinpkg
-if ("getbinpkg" in portage.features):
- myopts.append("--getbinpkg")
-
-if ("--getbinpkgonly" in myopts) and not ("--usepkgonly" in myopts):
- myopts.append("--usepkgonly")
-
-if ("--getbinpkgonly" in myopts) and not ("--getbinpkg" in myopts):
- myopts.append("--getbinpkg")
-
-if ("--getbinpkg" in myopts) and not ("--usepkg" in myopts):
- myopts.append("--usepkg")
-
-# Also allow -K to apply --usepkg/-k
-if ("--usepkgonly" in myopts) and not ("--usepkg" in myopts):
- myopts.append("--usepkg")
-
-# Print deprecation warning for -U
-if ("--upgradeonly" in myopts):
- print
- print red("*** Warning: --upgradeonly is a deprecated option in portage-"+portage.VERSION)
- print red("*** and will likely be removed in a future version.")
- print
- # Also allow -U to apply --update/-u
- if not ("--update" in myopts):
- print ">>> --upgradeonly implies --update... adding --update to options."
- myopts.append("--update")
-
-# Also allow -l to apply --pretend/-p, but if already in --ask mode
-if ("--changelog" in myopts) and not (("--pretend" in myopts) or ("--ask" in myopts)):
- print ">>> --changelog implies --pretend... adding --pretend to options."
- myopts.append("--pretend")
-
-# Allow -p to remove --ask
-if ("--pretend" in myopts) and ("--ask" in myopts):
- print ">>> --pretend disables --ask... removing --ask from options."
- myopts.remove("--ask")
-
-# forbid --ask when not in a terminal
-# note: this breaks `emerge --ask | tee logfile`, but that doesn't work anyway.
-if ("--ask" in myopts) and (not sys.stdin.isatty()):
- portage.writemsg("!!! \"--ask\" should only be used in a terminal. Exiting.\n")
- sys.exit(1)
-
-# Set so that configs will be merged regardless of remembered status
-if ("--noconfmem" in myopts):
- portage.settings.unlock()
- portage.settings["NOCONFMEM"]="1"
- portage.settings.backup_changes("NOCONFMEM")
- portage.settings.lock()
-
-# Set various debug markers... They should be merged somehow.
-if ("--debug" in myopts):
- portage.settings.unlock()
- portage.settings["PORTAGE_DEBUG"]="1"
- portage.settings.backup_changes("PORTAGE_DEBUG")
- portage.debug=1
- portage.settings.lock()
-
-if ("--resume" in myopts):
- if "--verbose" in myopts:
- print "* --verbose is currently broken with --resume. Disabling..."
- myopts.remove("--verbose")
- if "--tree" in myopts:
- print "* --tree is currently broken with --resume. Disabling..."
- myopts.remove("--tree")
-
-# Set color output
-if ("--nocolor" in myopts) and (sys.stdout.isatty()):
- nocolor()
-
-CLEAN_DELAY = 5
-EMERGE_WARNING_DELAY = 10
-if portage.settings["CLEAN_DELAY"]:
- CLEAN_DELAY = string.atoi("0"+portage.settings["CLEAN_DELAY"])
-if portage.settings["EMERGE_WARNING_DELAY"]:
- EMERGE_WARNING_DELAY = string.atoi("0"+portage.settings["EMERGE_WARNING_DELAY"])
-
-if "inject" == myaction:
- print
- print red("*** --inject has been deprecated.")
- print red("*** If you manage a piece of software yourself, add it's name and")
- print red("*** version (eg foo/bar-1.0) to /etc/portage/profile/package.provided.")
- print red("*** If you want to prevent portage from upgrading a package, add it to")
- print red("*** /etc/portage/package.mask prepending it with '>' (eg >foo/bar-1.0)")
- print red("*** For more information on fine-grained portage control, please see")
- print red("*** the portage man page.")
- print
-
-def emergelog(mystr,short_msg=None):
- if "notitles" not in portage.features:
- if short_msg:
- xtermTitle(short_msg)
- else:
- xtermTitle(mystr)
- try:
- #seems odd opening a file each write...
- if not os.path.exists("/var/log/emerge.log"):
- mylogfile=open("/var/log/emerge.log", "w")
- os.chmod("/var/log/emerge.log", S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP)
- os.chown("/var/log/emerge.log", portage.portage_uid, portage.portage_gid)
- else:
- mylogfile=open("/var/log/emerge.log", "a")
-
- l=portage_locks.lockfile(mylogfile)
- # seek because we may have gotten held up by the lock.
- # if so, we may not be positioned at the end of the file.
- mylogfile.seek(0,2)
- mylogfile.write(str(time.time())[:10]+": "+mystr+"\n")
- mylogfile.flush()
- portage_locks.unlockfile(l)
- mylogfile.close()
- except SystemExit, e:
- raise # Needed else can't exit
- except Exception, e:
- if edebug:
- print "emergelog():",e
- pass
-
-def emergeexit():
- """This gets out final log message in before we quit."""
- if "--pretend" not in myopts:
- emergelog(" *** terminating.")
- if "notitles" not in portage.features:
- xtermTitleReset()
-atexit.register(emergeexit)
-
-def emergeexitsig(signum, frame):
- signal.signal(signal.SIGINT, signal.SIG_IGN)
- portage.portageexit()
- portage_util.writemsg("\n\nExiting on signal %(signal)s\n" % {"signal":signum})
- sys.exit(100+signum)
-signal.signal(signal.SIGINT, emergeexitsig)
-
-def countdown(secs=5, doing="Starting"):
- if secs:
- print ">>> Waiting",secs,"seconds before starting..."
- print ">>> (Control-C to abort)...\n"+doing+" in: ",
- ticks=range(secs)
- ticks.reverse()
- for sec in ticks:
- sys.stdout.write(red(str(sec+1)+" "))
- sys.stdout.flush()
- time.sleep(1)
- print
-
-# formats a size given in bytes nicely
-def format_size(mysize):
- if type(mysize) not in [types.IntType,types.LongType]:
- return str(mysize)
- mystr=str(mysize/1024)
- mycount=len(mystr)
- while (mycount > 3):
- mycount-=3
- mystr=mystr[:mycount]+","+mystr[mycount:]
- return mystr+" kB"
-
-
-def getgccversion():
- """
- rtype: C{str}
- return: the current in-use gcc version
- """
-
- gcc_env_dir = os.path.join('/', 'etc', 'env.d', 'gcc')
- gcc_config_config = os.path.join(gcc_env_dir, 'config')
- gcc_ver_command = 'gcc -dumpversion'
- gcc_ver_prefix = 'gcc-'
-
- gcc_not_found_error = red(
- "!!! No gcc found. You probably need to 'source /etc/profile'\n" +
- "!!! to update the environment of this terminal and possibly\n" +
- "!!! other terminals also."
- )
-
- gcc_distcc_broken_error = green(
- '!!! Relying on the shell to locate gcc, this may break\n' +
- '!!! DISTCC, installing gcc-config and setting your current gcc\n' +
- '!!! profile will fix this'
- )
-
- def fallback():
-
- print >>sys.stderr, gcc_distcc_broken_error
-
- gccout = commands.getstatusoutput(gcc_ver_command)
-
- if gccout[0] != 0:
- print >>sys.stderr, gcc_not_found_error
- gccver = "[unavailable]"
- else:
- gccver = gcc_ver_prefix + gccout[1]
-
- return gccver
-
- if os.path.isfile(gcc_config_config):
- try:
- gccver_str = open(gcc_config_config).read().strip()
- gccver = gcc_ver_prefix + string.join(gccver_str.split('-')[4:], '-')
- except IndexError:
- gccver = fallback()
-
- else:
- import glob
- dir_l = glob.glob(os.path.join(gcc_env_dir, '*-*'))
-
- if len(dir_l) == 1:
- try:
- gccver = gcc_ver_prefix + dir_l[0].split('-')[-1]
- except IndexError:
- gccver = fallback()
-
- else:
- # There was no "config" file in /etc/env.d/gcc and there was more
- # than one profile in /etc/env.d/gcc so we can't actively
- # determine what version of gcc we are using so we fall back on the
- # old way that breaks distcc
-
- gccver = fallback()
-
- return gccver
-
-def getportageversion():
- try:
- import re
- profilever = os.path.normpath("///"+os.readlink("/etc/make.profile"))
- basepath = os.path.normpath("///"+portage.settings["PORTDIR"]+"/profiles")
- if re.match(basepath,profilever):
- profilever = profilever[len(basepath)+1:]
- else:
- profilever = "!"+profilever
- del basepath
- except SystemExit, e:
- raise # Needed else can't exit
- except:
- profilever="unavailable"
- libcver=[]
- libclist = portage.vardbapi(portage.root).match("virtual/libc")
- libclist += portage.vardbapi(portage.root).match("virtual/glibc")
- libclist = portage_util.unique_array(libclist)
- for x in libclist:
- xs=portage.catpkgsplit(x)
- if libcver:
- libcver+=","+string.join(xs[1:], "-")
- else:
- libcver=string.join(xs[1:], "-")
- if libcver==[]:
- libcver="unavailable"
-
- gccver = getgccversion()
- unameout=os.uname()[2]+" "+os.uname()[4]
-
- return "Portage " + portage.VERSION +" ("+profilever+", "+gccver+", "+libcver+", "+unameout+")"
-
-def help():
- # Move all the help stuff out of this file.
- emergehelp.help(myaction,myopts,havecolor)
-
-# check if root user is the current user for the actions where emerge needs this
-if ("--pretend" in myopts) or ("--fetchonly" in myopts or "--fetch-all-uri" in myopts) or (myaction=="search"):
- if not portage.secpass:
- if portage.wheelgid==portage.portage_gid:
- print "emerge: wheel group membership required for \"--pretend\" and search."
- print "emerge: wheel group use is being deprecated. Please update group and passwd to"
- print " include the portage user as noted above, and then use group portage."
- else:
- print "emerge: portage group membership required for \"--pretend\" and search."
- sys.exit(1)
-elif "--version" in myopts:
- print getportageversion()
- sys.exit(0)
-elif "--help" in myopts:
- help()
- sys.exit(0)
-elif portage.secpass!=2:
- if myaction in ["search", "info", "regen"]:
- pass
- elif (not myaction) and (not myfiles):
- pass
- elif ("--pretend" in myopts) and (myaction in ["world","system","clean","prune","unmerge"]):
- pass
- else:
- if "--debug" in myopts:
- print "myaction",myaction
- print "myopts",myopts
- print "emerge: root access required."
- sys.exit(1)
-
-if not "--pretend" in myopts:
- emergelog("Started emerge on: "+time.strftime("%b %d, %Y %H:%M:%S", time.localtime()))
- myelogstr=""
- if myopts:
- myelogstr=string.join(myopts, " ")
- if myaction:
- myelogstr+=" "+myaction
- if myfiles:
- myelogstr+=" "+string.join(myfiles, " ")
- emergelog(" *** emerge "+myelogstr)
-
-#configure emerge engine parameters
-#
-# self: include _this_ package regardless of if it is merged.
-# selective: exclude the package if it is merged
-# recurse: go into the dependencies
-# empty: pretend nothing is merged
-myparams=["self","recurse"]
-add=[]
-sub=[]
-if "--update" in myopts:
- add.extend(["selective","empty"])
-if "--emptytree" in myopts:
- add.extend(["empty"])
- sub.extend(["selective"])
-if "--nodeps" in myopts:
- sub.extend(["recurse"])
-if "--noreplace" in myopts:
- add.extend(["selective"])
-if "--deep" in myopts:
- add.extend(["deep"])
-if "--selective" in myopts:
- add.extend(["selective"])
-if myaction in ["world","system"]:
- add.extend(["selective"])
-elif myaction in ["depclean"]:
- add.extend(["empty"])
- sub.extend(["selective"])
-for x in add:
- if (x not in myparams) and (x not in sub):
- myparams.append(x)
-for x in sub:
- if x in myparams:
- myparams.remove(x)
-
-# search functionality
-class search:
-
- #
- # class constants
- #
- VERSION_SHORT=1
- VERSION_RELEASE=2
-
- #
- # public interface
- #
- def __init__(self):
- """Searches the available and installed packages for the supplied search key.
- The list of available and installed packages is created at object instantiation.
- This makes successive searches faster."""
- self.installcache = portage.db["/"]["vartree"]
-
- def execute(self,searchkey):
- """Performs the search for the supplied search key"""
- global myopts
- match_category = 0
- self.searchkey=searchkey
- self.packagematches = []
- if "--searchdesc" in myopts:
- self.searchdesc=1
- self.matches = {"pkg":[], "desc":[]}
- else:
- self.searchdesc=0
- self.matches = {"pkg":[]}
- print "Searching... ",
-
- if self.searchkey[0] == '@':
- match_category = 1
- self.searchkey = self.searchkey[1:]
- if self.searchkey=="*":
- #hack for people who aren't regular expression gurus
- self.searchkey==".*"
- if re.search("\+\+", self.searchkey):
- #hack for people who aren't regular expression gurus
- self.searchkey=re.sub("\+\+","\+\+",self.searchkey)
- self.searchre=re.compile(self.searchkey.lower(),re.I)
- for package in portage.portdb.cp_all():
- update_spinner()
-
- if match_category:
- match_string = package[:]
- else:
- match_string = package.split("/")[-1]
-
- masked=0
- if self.searchre.search(match_string):
- if not portage.portdb.xmatch("match-visible",package):
- masked=1
- self.matches["pkg"].append([package,masked])
- elif self.searchdesc: # DESCRIPTION searching
- full_package = portage.portdb.xmatch("bestmatch-visible",package)
- if not full_package:
- #no match found; we don't want to query description
- full_package=portage.best(portage.portdb.xmatch("match-all",package))
- if not full_package:
- continue
- else:
- masked=1
- try:
- full_desc = portage.portdb.aux_get(full_package,["DESCRIPTION"])[0]
- except KeyError:
- print "emerge: search: aux_get() failed, skipping"
- continue
- if self.searchre.search(full_desc):
- self.matches["desc"].append([full_package,masked])
- self.mlen=0
- for mtype in self.matches.keys():
- self.matches[mtype].sort()
- self.mlen += len(self.matches[mtype])
-
- def output(self):
- """Outputs the results of the search."""
- print "\b\b \n[ Results for search key : "+white(self.searchkey)+" ]"
- print "[ Applications found : "+white(str(self.mlen))+" ]"
- print " "
- for mtype in self.matches.keys():
- for match,masked in self.matches[mtype]:
- if mtype=="pkg":
- catpack=match
- full_package = portage.portdb.xmatch("bestmatch-visible",match)
- if not full_package:
- #no match found; we don't want to query description
- masked=1
- full_package=portage.best(portage.portdb.xmatch("match-all",match))
- else:
- full_package = match
- match = portage.pkgsplit(match)[0]
-
- if full_package:
- try:
- desc, homepage, license = portage.portdb.aux_get(full_package,["DESCRIPTION","HOMEPAGE","LICENSE"])
- except KeyError:
- print "emerge: search: aux_get() failed, skipping"
- continue
- if masked:
- print green("*")+" "+white(match)+" "+red("[ Masked ]")
- else:
- print green("*")+" "+white(match)
- myversion = self.getVersion(full_package, search.VERSION_RELEASE)
-
- mysum = [0,0]
- mycat = match.split("/")[0]
- mypkg = match.split("/")[1]
-
- mydigest = portage.db["/"]["porttree"].dbapi.finddigest(mycat+"/"+mypkg + "-" + myversion)
-
- try:
- myfile = open(mydigest,"r")
- for line in myfile.readlines():
- mysum[0] += int(line.split(" ")[3])
- myfile.close()
- mystr = str(mysum[0]/1024)
- mycount=len(mystr)
- while (mycount > 3):
- mycount-=3
- mystr=mystr[:mycount]+","+mystr[mycount:]
- mysum[0]=mystr+" kB"
- except SystemExit, e:
- raise # Needed else can't exit
- except Exception, e:
- if edebug:
- print "!!! Exception:",e
- mysum[0]=" [no/bad digest]"
-
- if "--quiet" not in myopts:
- print " ", darkgreen("Latest version available:"),myversion
- print " ", self.getInstallationStatus(mycat+'/'+mypkg)
- print " ", darkgreen("Size of downloaded files:"),mysum[0]
- print " ", darkgreen("Homepage:")+" ",homepage
- print " ", darkgreen("Description:"),desc
- print " ", darkgreen("License:")+" ",license
- print
- print
- #
- # private interface
- #
- def getInstallationStatus(self,package):
- installed_package = self.installcache.dep_bestmatch(package)
- result = ""
- version = self.getVersion(installed_package,search.VERSION_RELEASE)
- if len(version) > 0:
- result = darkgreen("Latest version installed:")+" "+version
- else:
- result = darkgreen("Latest version installed:")+" [ Not Installed ]"
- return result
-
- def getVersion(self,full_package,detail):
- if len(full_package) > 1:
- package_parts = portage.catpkgsplit(full_package)
- if detail == search.VERSION_RELEASE and package_parts[3] != 'r0':
- result = package_parts[2]+ "-" + package_parts[3]
- else:
- result = package_parts[2]
- else:
- result = ""
- return result
-
-
-#build our package digraph
-def getlist(mode):
- if mode=="system":
- mylines=portage.settings.packages
- elif mode=="world":
- try:
- myfile=open(portage.root+portage.WORLD_FILE,"r")
- mylines=myfile.readlines()
- myfile.close()
- except OSError:
- print "!!! Couldn't open "+pfile+"; exiting."
- sys.exit(1)
- except IOError:
- #world file doesn't exist
- mylines=[]
- mynewlines=[]
- for x in mylines:
- myline=string.join(string.split(x))
- if not len(myline):
- continue
- elif myline[0]=="#":
- continue
- elif mode=="system":
- if myline[0]!="*":
- continue
- myline=myline[1:]
- mynewlines.append(myline.strip())
-
- # Remove everything that is package.provided from our list
- for myatom in mynewlines[:]:
- mykey = portage.dep_getkey(myatom)
- if portage.settings.pprovideddict.has_key(mykey) and \
- portage.match_from_list(myatom, portage.settings.pprovideddict[mykey]):
- mynewlines.remove(myatom)
-
- return mynewlines
-
-def genericdict(mylist):
- mynewdict={}
- for x in mylist:
- mynewdict[portage.dep_getkey(x)]=x
- return mynewdict
-
-olddbapi=None
-class depgraph:
-
- def __init__(self,myaction,myopts):
- global olddbapi
- self.pkgsettings = portage.config(clone=portage.settings)
- if not self.pkgsettings["ARCH"]:
- portage.writemsg(red("\a!!! ARCH is not set... Are you missing the /etc/make.profile symlink?\n"))
- portage.writemsg(red("\a!!! Is the symlink correct? Is your portage tree complete?\n\n"))
- sys.exit(9)
- self.applied_useflags = {}
-
- self.missingbins=[]
- self.myaction=myaction
- self.digraph=portage.digraph()
- self.orderedkeys=[]
- self.outdatedpackages=[]
- self.mydbapi={}
- self.mydbapi["/"] = portage.fakedbapi()
- if "empty" not in myparams:
- for pkg in portage.db["/"]["vartree"].getallcpv():
- self.mydbapi["/"].cpv_inject(pkg)
- if portage.root != "/":
- self.mydbapi[portage.root] = portage.fakedbapi()
- if "empty" not in myparams:
- for pkg in portage.db[portage.root]["vartree"].getallcpv():
- self.mydbapi[portage.root].cpv_inject(pkg)
-
- if "--usepkg" in myopts:
- portage.db["/"]["bintree"].populate(("--getbinpkg" in myopts), ("--getbinpkgonly" in myopts))
-
- def create(self,mybigkey,myparent=None,addme=1,myuse=None):
- """creates the actual digraph of packages to merge. return 1 on success, 0 on failure
- mybigkey = specification of package to merge; myparent = parent package (one depending on me);
- addme = should I be added to the tree? (for the --onlydeps mode)"""
- #stuff to add:
- #SLOT-aware emerge
- #IUSE-aware emerge
- #"no downgrade" emerge
- #print "mybigkey:",mybigkey
-
- jbigkey=string.join(mybigkey)
- if self.digraph.hasnode(jbigkey+" merge") or self.digraph.hasnode(jbigkey+" nomerge"):
- #this conditional is needed to prevent infinite recursion on already-processed deps
- return 1
-
- update_spinner()
-
- mytype,myroot,mykey=mybigkey
- # select the correct /var database that we'll be checking against
- vardbapi=portage.db[myroot]["vartree"].dbapi
-
- if addme:
- # if the package is already on the system, we add a "nomerge"
- # directive, otherwise we add a "merge" directive.
- if mytype=="blocks":
- # we've encountered a "blocks" node. We will totally ignore this
- # node and not add it to our digraph if it doesn't apply to us.
- if "--buildpkgonly" not in myopts and myparent and (self.mydbapi[myroot].match(mykey) or vardbapi.match(mykey)):
- mybigkey.append(myparent.split()[2])
- self.digraph.addnode(string.join(mybigkey),myparent)
- return 1
-
- if myuse == None:
- self.pkgsettings.setcpv(mykey)
- myuse=string.split(self.pkgsettings["USE"], " ")
-
- self.applied_useflags[mykey] = myuse
-
- merging=1
- if addme:
- # this is where we add the node to the list of packages to merge
- if not myparent:
- # command-line specified or part of a world list...
- if ("self" not in myparams) or (("selective" in myparams) and vardbapi.cpv_exists(mykey)):
- # the package is on the system, so don't merge it.
- merging=0
- elif ("selective" in myparams) and vardbapi.cpv_exists(mykey):
- merging=0
-
- if (merging==0 and mytype=="ebuild" and "--newuse" in myopts and vardbapi.cpv_exists(mykey)):
- iuses=string.split(portage.portdb.aux_get(mykey, ["IUSE"])[0])
- old_use=string.split(vardbapi.aux_get(mykey, ["USE"])[0])
- now_use=string.split(self.pkgsettings["USE"])
- for x in iuses:
- if (old_use.count(x) and not now_use.count(x)) or (not old_use.count(x) and now_use.count(x)):
- merging=1
- break
- else:
- #onlydeps mode; don't merge
- merging=2
- if merging==1:
- mybigkey.append("merge")
- else:
- mybigkey.append("nomerge")
-
- # whatever the case, we need to add the node to our digraph so
- # that children can depend upon it.
- self.digraph.addnode(string.join(mybigkey),myparent)
- if ("deep" not in myparams) and (not merging):
- return 1
- elif "recurse" not in myparams:
- return 1
-
- edepend={}
- if mytype=="binary":
- mypkgparts=portage.catpkgsplit(mykey)
- tbz2name = string.split(mykey, "/")[1]+".tbz2"
- if tbz2name in portage.db[portage.root]["bintree"].invalids:
- sys.stderr.write("\nINVALID PACKAGE (is required to continue): "+str(mykey)+"\n")
- sys.exit(1)
- if portage.db[portage.root]["bintree"].isremote(mykey):
- edepend = portage.db[portage.root]["bintree"].remotepkgs[tbz2name]
- edepend["DEPEND"] =""
- edepend["RDEPEND"]=string.join(string.split(edepend["RDEPEND"])," ")
- edepend["PDEPEND"]=string.join(string.split(edepend["PDEPEND"])," ")
- edepend["SLOT"] =string.strip(edepend["SLOT"])
- #portage.db[portage.root]["bintree"].gettbz2(mykey)
- else: # It's local.
- mytbz2=xpak.tbz2(portage.db[portage.root]["bintree"].getname(mykey))
- edepend["DEPEND"] =""
- edepend["RDEPEND"]=string.join(mytbz2.getelements("RDEPEND")," ")
- edepend["PDEPEND"]=string.join(mytbz2.getelements("PDEPEND")," ")
- edepend["SLOT"] =mytbz2.getfile("SLOT",mypkgparts[2])
- elif mytype=="ebuild":
- try:
- mymeta = ["DEPEND","RDEPEND","PDEPEND"]
- myfoo = portage.portdb.aux_get(mykey, mymeta)
- for index in range(0,len(mymeta)):
- edepend[mymeta[index]] = myfoo[index]
- if "--buildpkgonly" in myopts:
- edepend["RDEPEND"] = ""
- except (KeyError,IOError):
- print "emerge: create(): aux_get() error on",mykey+"; aborting..."
- sys.exit(1)
- mydep={}
- mp=string.join(mybigkey)
-
- if myroot=="/":
- mydep["/"]=edepend["DEPEND"]+" "+edepend["RDEPEND"]
- if not self.select_dep("/",mydep["/"],myparent=mp,myuse=myuse):
- return 0
- else:
- mydep["/"]=edepend["DEPEND"]
- mydep[myroot]=edepend["RDEPEND"]
- if not self.select_dep("/",mydep["/"],myparent=mp,myuse=myuse):
- return 0
- if not self.select_dep(myroot,mydep[myroot],myparent=mp,myuse=myuse):
- return 0
-
- if edepend.has_key("PDEPEND") and edepend["PDEPEND"]:
- # Post Depend -- Add to the list without a parent, as it depends
- # on a package being present AND must be built after that package.
- if not self.select_dep(myroot,edepend["PDEPEND"],myuse=myuse):
- return 0
-
- return 1
-
- def select_files(self,myfiles):
- "given a list of .tbz2s, .ebuilds and deps, create the appropriate depgraph and return a favorite list"
- myfavorites=[]
- for x in myfiles:
- if x[-5:]==".tbz2":
- if not os.path.exists(x):
- if os.path.exists(self.pkgsettings["PKGDIR"]+"/All/"+x):
- x=self.pkgsettings["PKGDIR"]+"/All/"+x
- elif os.path.exists(self.pkgsettings["PKGDIR"]+"/"+x):
- x=self.pkgsettings["PKGDIR"]+"/"+x
- else:
- print "\n\n!!! Binary package '"+str(x)+"' does not exist."
- print "!!! Please ensure the tbz2 exists as specified.\n"
- sys.exit(1)
- mytbz2=xpak.tbz2(x)
- mykey=mytbz2.getelements("CATEGORY")[0]+"/"+os.path.basename(x)[:-5]
- if os.path.realpath(portage.db["/"]["bintree"].getname(mykey)) != os.path.realpath(x):
- print red("\n*** You need to adjust PKGDIR to emerge this package.\n")
- sys.exit(1)
- if not self.create(["binary",portage.root,mykey],None,"--onlydeps" not in myopts):
- return (0,myfavorites)
- elif not "--oneshot" in myopts:
- myfavorites.append(mykey)
- elif x[-7:]==".ebuild":
- x = os.path.realpath(x)
- mykey=os.path.basename(os.path.normpath(x+"/../.."))+"/"+os.path.basename(x)[:-7]
- ebuild_path = portage.db["/"]["porttree"].dbapi.findname(mykey)
- if ebuild_path:
- if os.path.realpath(ebuild_path) != x:
- print red("\n*** You need to adjust PORTDIR or PORTDIR_OVERLAY to emerge this package.\n")
- sys.exit(1)
- if mykey not in portage.db["/"]["porttree"].dbapi.xmatch("match-visible", portage.dep_getkey(mykey)):
- print red("\n*** You are emerging a masked package. It is MUCH better to use")
- print red("*** /etc/portage/package.* to accomplish this. See portage(5) man")
- print red("*** page for details.")
- countdown(EMERGE_WARNING_DELAY, "Continuing...")
- else:
- print red("\n*** "+x+" does not exist")
- sys.exit(1)
- if not self.create(["ebuild",portage.root,mykey],None,"--onlydeps" not in myopts):
- return (0,myfavorites)
- elif not "--oneshot" in myopts:
- myfavorites.append(mykey)
- else:
- try:
- mykey=portage.dep_expand(x,mydb=portage.portdb)
- except ValueError, errpkgs:
- print "\n\n!!! The short ebuild name \"" + x + "\" is ambiguous. Please specify"
- print "!!! one of the following fully-qualified ebuild names instead:\n"
- for i in errpkgs[0]:
- print " " + green(i)
- print
- sys.exit(1)
-
- # select needs to return 0 on dep_check failure
-
- sys.stdout.flush()
- sys.stderr.flush()
-
- try:
- self.mysd = self.select_dep(portage.root,mykey,arg=x)
- except portage_exception.MissingSignature, e:
- portage.writemsg("\n\n!!! A missing gpg signature is preventing portage from calculating the\n")
- portage.writemsg("!!! required dependencies. This is a security feature enabled by the admin\n")
- portage.writemsg("!!! to aid in the detection of malicious intent.\n\n")
- portage.writemsg("!!! THIS IS A POSSIBLE INDICATION OF A TAMPERED FILES -- CHECK CAREFULLY.\n")
- portage.writemsg("!!! Affected file: %s\n" % (e))
- sys.exit(1)
- except portage_exception.InvalidSignature, e:
- portage.writemsg("\n\n!!! An invalid gpg signature is preventing portage from calculating the\n")
- portage.writemsg("!!! required dependencies. This is a security feature enabled by the admin\n")
- portage.writemsg("!!! to aid in the detection of malicious intent.\n\n")
- portage.writemsg("!!! THIS IS A POSSIBLE INDICATION OF A TAMPERED FILES -- CHECK CAREFULLY.\n")
- portage.writemsg("!!! Affected file: %s\n" % (e))
- sys.exit(1)
- except SystemExit, e:
- raise # Needed else can't exit
- except Exception, e:
- if "--debug" in myopts:
- raise
- print "\n\n!!! Problem in",mykey,"dependencies."
- print "!!!",str(e),e.__module__
- sys.exit(1)
-
- if not self.mysd:
- return (0,myfavorites)
- elif not "--oneshot" in myopts:
- myfavorites.append(mykey)
-
- missing=0
- if "--usepkgonly" in myopts:
- for x in self.digraph.dict.keys():
- xs=string.split(x," ")
- if (xs[0] != "binary") and (xs[3]=="merge"):
- if missing == 0:
- print
- missing += 1
- print "Missing binary for:",xs[2]
-
- # We're true here unless we are missing binaries.
- return (not missing,myfavorites)
-
- def is_newer_ver_installed(self,myroot,pkg,pkgver):
- "if there is a version of pkg installed newer than pkgver, return it"
- vardbapi=portage.db[myroot]["vartree"].dbapi
-
- matches=portage.db[myroot]["vartree"].dbapi.match(pkg)
- if matches:
- myslot=portage.db["/"]["porttree"].getslot(pkgver)
- for match in matches:
- if portage.pkgcmp(portage.catpkgsplit(pkgver)[1:], portage.catpkgsplit(match)[1:]) < 0:
- curslot=portage.db[myroot]["vartree"].getslot(match)
- if curslot == myslot:
- return match
-
- def select_dep(self,myroot,depstring,myparent=None,arg=None,myuse=None):
- "given a dependency string, create the appropriate depgraph and return 1 on success and 0 on failure"
- if "--debug" in myopts:
- print
- print "Parent: ",myparent
- print "Depstring:",depstring
- if not arg:
- #processing dependencies
- mycheck=portage.dep_check(depstring,self.mydbapi[myroot],self.pkgsettings,myuse=myuse,use_binaries=("--usepkg" in myopts))
- #mycheck=portage.dep_check(depstring,self.mydbapi[myroot],self.pkgsettings,myuse=myuse)
-
- if not mycheck[0]:
- mymerge=[]
- else:
- mymerge=mycheck[1]
-
- else:
- #we're processing a command-line argument; unconditionally merge it even if it's already merged
- mymerge=[depstring]
-
- # dep_check has been run so we can now add our parent to our
- # build state to update virtuals and other settings. This
- # happens after the package is added to the tree so that a
- # package can depend on a virtual which it satisfies.
- if myparent:
- myp = myparent.split()
- if myp[3]=="merge":
- self.mydbapi[myroot].cpv_inject(myp[2])
- if myp[0]=="binary":
- self.pkgsettings.setinst(myp[2],portage.db["/"]["bintree"].dbapi)
- else:
- self.pkgsettings.setinst(myp[2],portage.db[myroot]["porttree"].dbapi)
-
- if not mymerge:
- return 1
-
- if "--debug" in myopts:
- print "Candidates:",mymerge
- for x in mymerge:
- myk=None
- binpkguseflags=None
- if x[0]=="!":
- # if this package is myself, don't append it to block list.
- if "--debug" in myopts:
- print "Myparent",myparent
- if (myparent):
- if myparent.split()[2] in portage.portdb.xmatch("match-all", x[1:]):
- # myself, so exit.
- continue
- # adding block
- myk=["blocks",myroot,x[1:]]
- else:
- #We are not processing a blocker but a normal dependency
- myeb=None
- myeb_matches = portage.portdb.xmatch("match-visible",x)
- if ("--usepkgonly" not in myopts):
- myeb=portage.best(myeb_matches)
-
- myeb_pkg=None
- if ("--usepkg" in myopts):
- # The next line assumes the binarytree has been populated.
- # XXX: Need to work out how we use the binary tree with roots.
- myeb_pkg_matches=portage.db["/"]["bintree"].dbapi.match(x)
- if ("--usepkgonly" not in myopts):
- # Remove any binary package entries that are masked in the portage tree (#55871)
- for idx in range(len(myeb_pkg_matches)-1,-1,-1):
- if myeb_pkg_matches[idx] not in myeb_matches:
- del myeb_pkg_matches[idx]
- myeb_pkg = portage.best(myeb_pkg_matches)
-
- if not myeb_pkg:
- myeb_pkg = None
- elif ("--newuse" in myopts):
- iuses=string.split(portage.db["/"]["bintree"].dbapi.aux_get(myeb_pkg, ["IUSE"])[0])
- old_use=string.split(portage.db["/"]["bintree"].dbapi.aux_get(myeb_pkg, ["USE"])[0])
- self.pkgsettings.setcpv(myeb_pkg)
- now_use=string.split(self.pkgsettings["USE"])
- self.pkgsettings.reset()
- for x in iuses:
- if (old_use.count(x) and not now_use.count(x)) or (not old_use.count(x) and now_use.count(x)):
- myeb_pkg = None
- break
-
- if (not myeb) and (not myeb_pkg):
- if not arg:
- xinfo='"'+x+'"'
- else:
- xinfo='"'+arg+'"'
- if myparent:
- xfrom = '(dependency required by '+green('"'+myparent.split()[2]+'"')+red(' ['+myparent.split()[0]+"])")
- alleb=portage.portdb.xmatch("match-all",x)
- if alleb:
- if "--usepkgonly" not in myopts:
- print "\n!!! "+red("All ebuilds that could satisfy ")+green(xinfo)+red(" have been masked.")
- print "!!! One of the following masked packages is required to complete your request:"
- oldcomment = ""
- for p in alleb:
- mreasons = portage.getmaskingstatus(p)
- print "- "+p+" (masked by: "+string.join(mreasons, ", ")+")"
- comment = portage.getmaskingreason(p)
- if comment and comment != oldcomment:
- print comment
- oldcomment = comment
- print
- print "For more information, see MASKED PACKAGES section in the emerge man page or "
- print "section 2.2 \"Software Availability\" in the Gentoo Handbook."
- if myparent:
- print "!!! "+red(xfrom)
- print
- else:
- print "\n!!! "+red("There are no packages available to satisfy: ")+green(xinfo)
- print "!!! Either add a suitable binary package or compile from an ebuild."
- else:
- print "\nemerge: there are no ebuilds to satisfy "+xinfo+"."
- if myparent:
- print xfrom
- print
- return 0
-
- if "--debug" in myopts:
- print "ebuild:",myeb
- print "binpkg:",myeb_pkg
-
- if myeb and myeb_pkg:
- myeb_s = portage.catpkgsplit(myeb)
- myeb_s = [myeb_s[0]+"/"+myeb_s[1], myeb_s[2], myeb_s[3]]
- myeb_pkg_s = portage.catpkgsplit(myeb_pkg)
- myeb_pkg_s = [myeb_pkg_s[0]+"/"+myeb_pkg_s[1], myeb_pkg_s[2], myeb_pkg_s[3]]
-
- if portage.pkgcmp(myeb_s, myeb_pkg_s) == 0: # pkg is same version as ebuild
- myeb = None
- else:
- myeb_pkg = None
-
- if "--upgradeonly" in myopts:
- # Check that there isn't a newer version of this package already installed
- cand = None
- try:
- # XXX: This can throw an exception if the ebuild doesn't exist
- if myeb:
- cand=self.is_newer_ver_installed(myroot,x,myeb)
- elif myeb_pkg:
- cand=self.is_newer_ver_installed(myroot,x,myeb_pkg)
- except SystemExit, e:
- raise # Needed else can't exit
- except Exception, e:
- print "Warning: "+str(e)
- if cand:
- myeb=cand
-
- if myeb:
- myk=["ebuild",myroot,myeb]
- elif myeb_pkg:
- binpkguseflags=portage.db[portage.root]["bintree"].get_use(myeb_pkg)
- myk=["binary",myroot,myeb_pkg]
- else:
- sys.stderr.write("!!! Confused... Don't know what I'm using for dependency info. :(\n")
- sys.exit(1)
-
- #if "--usepkg" in myopts:
- # #If we want to use packages, see if we have a pre-built one...
- # mypk=portage.db["/"]["bintree"].dbapi.match(x)
- # if myeb in mypk:
- # #Use it only if it's exactly the version we want.
- # myk=["binary",myroot,myeb]
- # else:
- # myk=["ebuild",myroot,myeb]
- #else:
- # myk=["ebuild",myroot,myeb]
- if myparent:
- #we are a dependency, so we want to be unconditionally added
- if not self.create(myk,myparent,myuse=binpkguseflags):
- return 0
- else:
- #if mysource is not set, then we are a command-line dependency and should not be added
- #if --onlydeps is specified.
- if not self.create(myk,myparent,"--onlydeps" not in myopts,myuse=binpkguseflags):
- return 0
-
- if "--debug" in myopts:
- print "Exiting...",myparent
- return 1
-
-
- def altlist(self):
- mygraph=self.digraph.copy()
- dolist=["/"]
- retlist=[]
- for x in portage.db.keys():
- portage.db[x]["merge"]=[]
- if x not in dolist:
- dolist.append(x)
- while (not mygraph.empty()):
- mycurkey=mygraph.firstzero()
- if not mycurkey:
- print "!!! Error: circular dependencies:"
- print
- for x in mygraph.dict.keys():
- for y in mygraph.dict[x][1]:
- print y,"depends on",x
- print
- sys.exit(1)
- splitski=string.split(mycurkey)
- #I'm not sure of the significance of the following lines (vestigal?) so I'm commenting 'em out.
- #These lines remove already-merged things from our alt-list
- #if "--update" in myopts:
- # if not portage.db["/"]["vartree"].exists_specific(splitski[2]):
- # portage.db["/"]["merge"].append(splitski)
- #else:
- portage.db[splitski[1]]["merge"].append(splitski)
- mygraph.delnode(mycurkey)
- for x in dolist:
- for y in portage.db[x]["merge"]:
- retlist.append(y)
- return retlist
-
- def xcreate(self,mode="system"):
- global syslist
- if mode=="system":
- mylist=syslist
- else:
- #world mode
- worldlist=getlist("world")
- sysdict=genericdict(syslist)
- worlddict=genericdict(worldlist)
- #we're effectively upgrading sysdict to contain all new deps from worlddict
- for x in worlddict.keys():
- #only add the world node if the package is:
- #actually installed -- this prevents the remerging of already unmerged packages when we do a world --update;
- #actually available -- this prevents emerge from bombing out due to no match being found (we want a silent ignore)
- if "empty" in myparams:
- if portage.db["/"]["vartree"].dbapi.match(x):
- sysdict[x]=worlddict[x]
- elif portage.db[portage.root]["vartree"].dbapi.match(x):
- #package is installed
- sysdict[x]=worlddict[x]
- else:
- print "\n*** Package in world file is not installed: "+x
- mylist = sysdict.keys()
-
- for mydep in mylist:
- myeb=portage.portdb.xmatch("bestmatch-visible",mydep)
- if not myeb:
- #this is an unavailable world entry; just continue
- continue
-
- if "--upgradeonly" in myopts:
- cand=self.is_newer_ver_installed(portage.root,mydep,myeb)
- if cand:
- myeb=cand
-
- #THIS NEXT BUNCH OF CODE NEEDS TO BE REPLACED TO SUPPORT WORLD ANTI-DEPS
- #if mydep2[0]=="!":, etc.
- binpkguseflags = None
- if "--usepkg" in myopts:
- mypk=portage.db[portage.root]["bintree"].dep_bestmatch(mydep)
- if myeb==mypk:
- myk=["binary",portage.root,mypk]
- binpkguseflags=portage.db[portage.root]["bintree"].get_use(mypk)
- if ("--newuse" in myopts):
- iuses=string.split(portage.db["/"]["bintree"].dbapi.aux_get(mypk, ["IUSE"])[0])
- old_use=string.split(portage.db["/"]["bintree"].dbapi.aux_get(mypk, ["USE"])[0])
- self.pkgsettings.setcpv(mypk)
- now_use=string.split(self.pkgsettings["USE"])
- self.pkgsettings.reset()
- for x in iuses:
- if (old_use.count(x) and not now_use.count(x)) or (not old_use.count(x) and now_use.count(x)):
- myk=["ebuild",portage.root,myeb]
- binpkguseflags=None
- break
- elif "--usepkgonly" in myopts:
- if not mypk:
- self.missingbins += [myeb]
- myk=["binary",portage.root,myeb]
- else:
- myk=["binary",portage.root,mypk]
- else:
- myk=["ebuild",portage.root,myeb]
- else:
- myk=["ebuild",portage.root,myeb]
-
- if not self.create(myk,myuse=binpkguseflags):
- print
- print "!!! Problem with dependencies under ",myk[0],myk[2]
- print "!!! Possibly a DEPEND/*DEPEND problem."
- print
- return 0
- return 1
-
- def match(self,mydep,myroot=portage.root,mykey=None):
- # support mutual exclusive deps
- mydep2=mydep
- if mydep2[0]=="!":
- mydep2=mydep[1:]
-
- if mydep[0]=="!":
- #add our blocker; it will be ignored later if necessary (if we are remerging the same pkg, for example)
- myk="blocks "+myroot+" "+mydep2
- else:
- myeb=portage.db[portage.root]["porttree"].dep_bestmatch(mydep2)
- if not myeb:
- if not mykey:
- print "\n!!! Error: couldn't find match for",mydep
- else:
- print "\n!!! Error: couldn't find match for",mydep,"in",mykey
- print
- sys.exit(1)
-
- if "--usepkg" in myopts:
- mypk=portage.db[portage.root]["bintree"].dep_bestmatch(mydep)
- if myeb==mypk:
- myk="binary "+portage.root+" "+mypk
- else:
- myk="ebuild "+myroot+" "+myeb
- else:
- myk="ebuild "+myroot+" "+myeb
-
- return myk
-
- def display(self,mylist):
- changelogs=[]
- p=[]
- totalsize=0
-
- if "--verbose" in myopts:
- overlays = string.split(portage.settings['PORTDIR_OVERLAY'])
-
- if "--tree" in myopts:
- mylist.reverse()
- mygraph=self.digraph.copy()
-
- i = 0
- while i < len(mylist):
- if mylist[i][-1]=="nomerge":
- if not ("--tree" in myopts):
- # we don't care about this elements
- mylist.pop(i)
- continue
- if (i == (len(mylist) - 1)) \
- or (mygraph.depth(string.join(mylist[i])) \
- >= mygraph.depth(string.join(mylist[i+1]))):
- # end of a useless branch (may be the last one)
- # -> delete the element and test the previous one
- mylist.pop(i)
- if i > 0:
- i -= 1
- continue
- # the branch continues, or we've found a good element.
- # -> let's see what's next, if anything
- i += 1
-
- display_overlays=False
- # files to fetch list - avoids counting a same file twice
- # in size display (verbose mode)
- myfetchlist=[]
- for x in mylist:
- fetch=" "
-
- if x[0]=="blocks":
- addl=""+red("B")+" "+fetch+" "
- resolved=portage.db[x[1]]["vartree"].resolve_key(x[2])
- print "["+x[0]+" "+addl+"]",red(resolved),
- if resolved!=x[2]:
- if x[3]:
- print red("(\""+x[2]+"\" is blocking "+x[3]+")")
- else:
- print red("(\""+x[2]+"\")")
- else:
- if x[3]:
- print red("(is blocking "+x[3]+")")
- else:
- print
- else:
- if (x[0]!="binary") and ("fetch" in string.split(portage.portdb.aux_get(x[2],["RESTRICT"])[0])):
- fetch = red("F")
- if portage.portdb.fetch_check(x[2], portage.settings):
- fetch = green("f")
-
- #we need to use "--emptrytree" testing here rather than "empty" param testing because "empty"
- #param is used for -u, where you still *do* want to see when something is being upgraded.
- myoldbest=""
- if (not "--emptytree" in myopts) and portage.db[x[1]]["vartree"].exists_specific(x[2]):
- addl=" "+yellow("R")+fetch+" "
- elif (not "--emptytree" in myopts) and portage.db[x[1]]["vartree"].exists_specific_cat(x[2]):
- if x[0] == "binary":
- mynewslot=portage.db["/"]["bintree"].getslot(x[2])
- elif x[0] == "ebuild":
- mynewslot=portage.db["/"]["porttree"].getslot(x[2])
- myoldlist=portage.db[x[1]]["vartree"].dbapi.match(portage.pkgsplit(x[2])[0])
- myinslotlist=filter((lambda p: portage.db[portage.root]["vartree"].getslot(p)==mynewslot),myoldlist)
- if myinslotlist:
- myoldbest=portage.best(myinslotlist)
- addl=" "+fetch
- if portage.pkgcmp(portage.pkgsplit(x[2]), portage.pkgsplit(myoldbest)) < 0:
- # Downgrade in slot
- addl+=turquoise("U")+blue("D")
- else:
- # Update in slot
- addl+=turquoise("U")+" "
- else:
- # New slot, mark it new.
- addl=" "+green("NS")+fetch+" "
-
- if "--changelog" in myopts:
- changelogs.extend(self.calc_changelog(
- portage.portdb.findname(x[2]),
- portage.db["/"]["vartree"].dep_bestmatch('/'.join(portage.catpkgsplit(x[2])[:2])),
- x[2]
- ))
- else:
- addl=" "+green("N")+" "+fetch+" "
-
- verboseadd=""
- if "--verbose" in myopts:
- # iuse verbose
- try:
- if x[0] == "binary":
- iuse_split = string.split(portage.db["/"]["bintree"].dbapi.aux_get(x[2],["IUSE"])[0])
- elif x[0] == "ebuild":
- iuse_split = string.split(portage.portdb.aux_get(x[2],["IUSE"])[0])
- else:
- iuse_split = []
- except SystemExit, e:
- raise # Needed else can't exit
- except:
- portage.writemsg("!!! Error getting IUSE (report this to bugs.gentoo.org)\n")
- portage.writemsg("!!! %s\n" % x)
- iuse_split = []
- iuse_split.sort()
- old_use=None
- if myoldbest:
- pkg=myoldbest
- else:
- pkg=x[2]
- if portage.db["/"]["vartree"].dbapi.cpv_exists(pkg):
- try:
- old_use=string.split(portage.db["/"]["vartree"].dbapi.aux_get(pkg, ["USE"])[0])
- except SystemExit, e:
- raise # Needed else can't exit
- except:
- pass
- iuse=""
- now_use=self.applied_useflags[x[2]]
- for ebuild_iuse in portage_util.unique_array(iuse_split):
- usechange=""
- if old_use:
- if (old_use.count(ebuild_iuse) and not now_use.count(ebuild_iuse)) or (not old_use.count(ebuild_iuse) and now_use.count(ebuild_iuse)):
- usechange="*"
-
- if ebuild_iuse in self.applied_useflags[x[2]]:
- if usechange == "*":
- iuse=green("+"+ebuild_iuse)
- else:
- iuse=red("+"+ebuild_iuse)
- elif ebuild_iuse in portage.settings.usemask:
- iuse=blue("(-"+ebuild_iuse+")")
- else:
- iuse=blue("-"+ebuild_iuse)
- verboseadd+=iuse+usechange+" "
-
- # size verbose
- mysize=0
- if x[0] == "ebuild" and x[-1]!="nomerge":
- myfilesdict=portage.portdb.getfetchsizes(x[2], useflags=self.applied_useflags[x[2]], debug=edebug)
- if myfilesdict==None:
- myfilesdict="[empty/missing/bad digest]"
- else:
- for myfetchfile in myfilesdict.keys():
- if myfetchfile not in myfetchlist:
- mysize+=myfilesdict[myfetchfile]
- myfetchlist.append(myfetchfile)
- totalsize+=mysize
- verboseadd+=format_size(mysize)+" "
-
- # overlay verbose
- # XXX: Invalid binaries have caused tracebacks here. 'if file_name'
- # x = ['binary', '/', 'sys-apps/pcmcia-cs-3.2.7.2.6', 'merge']
- file_name=portage.portdb.findname(x[2])
- if file_name: # It might not exist in the tree
- dir_name=os.path.abspath(os.path.dirname(file_name)+"/../..")
- if (overlays.count(dir_name)>0):
- verboseadd+=teal("["+str(overlays.index(os.path.normpath(dir_name))+1)+"]")+" "
- display_overlays=True
- else:
- verboseadd += "[No ebuild?]"
-
- xs=portage.pkgsplit(x[2])
- if xs[2]=="r0":
- xs[2]=""
- else:
- xs[2]="-"+xs[2]
-
- if self.pkgsettings.has_key("COLUMNWIDTH"):
- mywidth=int(self.pkgsettings.settings["COLUMNWIDTH"])
- else:
- mywidth=130
- oldlp=mywidth-30
- newlp=oldlp-30
-
- indent=""
- if ("--tree" in myopts):
- indent=" "*mygraph.depth(string.join(x))
-
- if myoldbest:
- myoldbest=portage.pkgsplit(myoldbest)[1]+"-"+portage.pkgsplit(myoldbest)[2]
- if myoldbest[-3:]=="-r0":
- myoldbest=myoldbest[:-3]
- myoldbest=blue("["+myoldbest+"]")
-
- if x[1]!="/":
- if "--columns" in myopts:
- myprint="["+x[0]+" "+addl+"] "+indent+darkgreen(xs[0])
- if (newlp-nc_len(myprint)) > 0:
- myprint=myprint+(" "*(newlp-nc_len(myprint)))
- myprint=myprint+"["+darkblue(xs[1]+xs[2])+"] "
- if (oldlp-nc_len(myprint)) > 0:
- myprint=myprint+" "*(oldlp-nc_len(myprint))
- myprint=myprint+myoldbest
- myprint=myprint+darkgreen(" to "+x[1])+" "+verboseadd
- else:
- myprint="["+x[0]+" "+addl+"] "+darkgreen(x[2])+" "+myoldbest+" "+darkgreen("to "+x[1])+" "+verboseadd
- else:
- if "--columns" in myopts:
- myprint="["+x[0]+" "+addl+"] "+indent+darkgreen(xs[0])
- if (newlp-nc_len(myprint)) > 0:
- myprint=myprint+(" "*(newlp-nc_len(myprint)))
- myprint=myprint+green(" ["+xs[1]+xs[2]+"] ")
- if (oldlp-nc_len(myprint)) > 0:
- myprint=myprint+(" "*(oldlp-nc_len(myprint)))
- myprint=myprint+myoldbest+" "+verboseadd
- else:
- if x[3]=="nomerge":
- myprint=darkblue("[nomerge ] "+indent+x[2]+" "+myoldbest+" ")+verboseadd
- else:
- myprint="["+x[0]+" "+addl+"] "+indent+darkgreen(x[2])+" "+myoldbest+" "+verboseadd
- p.append(myprint)
-
- if ("--tree" not in myopts):
- mysplit=portage.pkgsplit(x[2])
-
- # XXX mysplit _can_ be None.... Why?
- if mysplit and (len(mysplit)==3):
- if "--emptytree" not in myopts:
- if mysplit[0]=="sys-apps/portage":
- if ((mysplit[1]+mysplit[2]) != portage.VERSION) and \
- ("livecvsportage" not in portage.settings.features):
- if mylist.index(x)<len(mylist)-1:
- p.append(red("*** Portage will stop merging at this point and reload itself,"))
- p.append(red(" recalculate dependencies, and complete the merge."))
- if "--update" not in myopts:
- p.append(darkgreen(" You may avoid the remerging of packages by updating portage on its own."))
- print
- else:
- if mysplit[0]=="sys-apps/portage" and ("--emptytree" in myopts):
- if mysplit[1]+mysplit[2]!=portage.VERSION:
- p.append(red("***")+" Please update portage to the above version before proceeding.")
- p.append(" Failure to do so may result in failed or improper merges.")
- p.append(" A simple '"+green("emerge -u portage")+"' is sufficient.")
- p.append("")
- del mysplit
-
- for x in p:
- print x
-
- if "--verbose" in myopts:
- print
- print "Total size of downloads: "+format_size(totalsize)
- if overlays and display_overlays:
- print "Portage overlays:"
- y=0
- for x in overlays:
- y=y+1
- print " "+teal("["+str(y)+"]"),x
-
- if "--changelog" in myopts:
- print
- for revision,text in changelogs:
- print bold('*'+revision)
- sys.stdout.write(text)
-
- def calc_changelog(self,ebuildpath,current,next):
- current = '-'.join(portage.catpkgsplit(current)[1:])
- if current.endswith('-r0'): current = current[:-3]
- next = '-'.join(portage.catpkgsplit(next)[1:])
- if next.endswith('-r0'): next = next[:-3]
- changelogpath = os.path.join(os.path.split(ebuildpath)[0],'ChangeLog')
- try:
- changelog = open(changelogpath).read()
- except SystemExit, e:
- raise # Needed else can't exit
- except:
- return []
- divisions = self.find_changelog_tags(changelog)
- #print 'XX from',current,'to',next
- #for div,text in divisions: print 'XX',div
- # skip entries for all revisions above the one we are about to emerge
- for i in range(len(divisions)):
- if divisions[i][0]==next:
- divisions = divisions[i:]
- break
- # find out how many entries we are going to display
- for i in range(len(divisions)):
- if divisions[i][0]==current:
- divisions = divisions[:i]
- break
- else:
- # couldnt find the current revision in the list. display nothing
- return []
- return divisions
-
- def find_changelog_tags(self,changelog):
- divs = []
- release = None
- while 1:
- match = re.search(r'^\*\ ?([-a-zA-Z0-9_.]*)(?:\ .*)?\n',changelog,re.M)
- if match is None:
- if release is not None:
- divs.append((release,changelog))
- return divs
- if release is not None:
- divs.append((release,changelog[:match.start()]))
- changelog = changelog[match.end():]
- release = match.group(1)
- if release.endswith('.ebuild'):
- release = release[:-7]
- if release.endswith('-r0'):
- release = release[:-3]
-
- def outdated(self):
- return self.outdatedpackages
-
- def merge(self,mylist):
- returnme=0
- mymergelist=[]
-
- #check for blocking dependencies
- if ("--fetchonly" not in myopts) and ("--buildpkgonly" not in myopts):
- for x in mylist:
- if x[0]=="blocks":
- print "\n!!! Error: the "+x[2]+" package conflicts with another package."
- print "!!! both can't be installed on the same system together."
- print "!!! Please use 'emerge --pretend' to determine blockers."
- print
- if ("--pretend" not in myopts):
- sys.exit(1)
-
- #buildsyspkg: I need mysysdict also on resume (moved from the else block)
- mysysdict=genericdict(syslist)
- if ("--resume" in myopts):
- # We're resuming.
- print green("*** Resuming merge...")
- emergelog(" *** Resuming merge...")
- mymergelist=portage.mtimedb["resume"]["mergelist"][:]
- if ("--skipfirst" in myopts) and mymergelist:
- del portage.mtimedb["resume"]["mergelist"][0]
- del mymergelist[0]
- else:
- myfavs=portage.grabfile(portage.root+portage.WORLD_FILE)
- myfavdict=genericdict(myfavs)
- for x in range(len(mylist)):
- if mylist[x][3]!="nomerge":
- # Add to the mergelist
- mymergelist.append(mylist[x])
- else:
- myfavkey=portage.cpv_getkey(mylist[x][2])
- if "--onlydeps" in myopts:
- continue
- # Add to the world file. Since we won't be able to later.
- if (not "--fetchonly" in myopts) and (myfavkey in favorites):
- #don't record if already in system profile or already recorded
- if (not mysysdict.has_key(myfavkey)) and (not myfavdict.has_key(myfavkey)):
- #we don't have a favorites entry for this package yet; add one
- myfavdict[myfavkey]=myfavkey
- print ">>> Recording",myfavkey,"in \"world\" favorites file..."
- if not "--fetchonly" in myopts:
- portage.writedict(myfavdict,portage.root+portage.WORLD_FILE,writekey=0)
-
- portage.mtimedb["resume"]["mergelist"]=mymergelist[:]
-
- # We need to yank the harmful-to-new-builds settings from features.
- myorigfeat=self.pkgsettings["FEATURES"]
- myfeat=myorigfeat.split()
- while ("keeptemp" in myfeat):
- del myfeat[myfeat.index("keeptemp")]
- while ("keepwork" in myfeat):
- del myfeat[myfeat.index("keepwork")]
-
- self.pkgsettings["FEATURES"]=string.join(myfeat)
-
- mergecount=0
- if "--fetchonly" in myopts:
- mynewmergelist = []
- for x in mymergelist:
- if x[0] != "blocks":
- mynewmergelist.append(x)
- mymergelist = mynewmergelist
- for x in mymergelist:
- mergecount+=1
- myroot=x[1]
- pkgindex=2
- if x[0]=="blocks":
- pkgindex=3
- y=portage.portdb.findname(x[pkgindex])
- if not "--pretend" in myopts:
- print ">>> emerge ("+str(mergecount)+" of "+str(len(mymergelist))+")",x[pkgindex],"to",x[1]
- emergelog(" >>> emerge ("+str(mergecount)+" of "+str(len(mymergelist))+") "+x[pkgindex]+" to "+x[1])
-
- self.pkgsettings["EMERGE_FROM"] = x[0][:]
- self.pkgsettings.backup_changes("EMERGE_FROM")
-
- #buildsyspkg: Check if we need to _force_ binary package creation
- issyspkg = ("buildsyspkg" in myfeat) \
- and x[0] != "blocks" \
- and mysysdict.has_key(portage.cpv_getkey(x[2])) \
- and not ("--buildpkg" in myopts)
- if x[0] in ["ebuild","blocks"]:
- if (x[0]=="blocks") and ("--fetchonly" not in myopts):
- raise Exception, "Merging a blocker"
- elif ("--fetchonly" in myopts) or ("--fetch-all-uri" in myopts):
- if x[0] == "blocks":
- continue
- if ("--fetch-all-uri" in myopts):
- retval=portage.doebuild(y,"fetch",myroot,self.pkgsettings,edebug,("--pretend" in myopts),fetchonly=1,fetchall=1)
- else:
- retval=portage.doebuild(y,"fetch",myroot,self.pkgsettings,edebug,("--pretend" in myopts),fetchonly=1)
- if (retval == None) or retval:
- print
- print "!!! Fetch for",y,"failed, continuing..."
- print
- returnme=1
- continue
- elif "--buildpkg" in myopts or issyspkg:
- #buildsyspkg: Sounds useful to display something, but I don't know if we should also log it
- if issyspkg:
- print ">>> This is a system package, let's pack a rescue tarball."
- #emergelog(">>> This is a system package, let's pack a rescue tarball.")
- #create pkg, then merge pkg
- short_msg = "emerge: ("+str(mergecount)+" of "+str(len(mymergelist))+") "+x[pkgindex]+" Clean"
- emergelog(" === ("+str(mergecount)+" of "+str(len(mymergelist))+") Cleaning ("+x[pkgindex]+"::"+y+")", short_msg=short_msg)
- retval=portage.doebuild(y,"clean",myroot,self.pkgsettings,edebug,cleanup=1)
- if (retval == None):
- portage_util.writemsg("Unable to run required binary.\n")
- sys.exit(127)
- if retval:
- sys.exit(retval)
- short_msg = "emerge: ("+str(mergecount)+" of "+str(len(mymergelist))+") "+x[pkgindex]+" Compile"
- emergelog(" === ("+str(mergecount)+" of "+str(len(mymergelist))+") Compiling/Packaging ("+x[pkgindex]+"::"+y+")", short_msg=short_msg)
- retval=portage.doebuild(y,"package",myroot,self.pkgsettings,edebug)
- if (retval == None):
- portage_util.writemsg("Unable to run required binary.\n")
- sys.exit(127)
- if retval:
- sys.exit(retval)
- #dynamically update our database
- if "--buildpkgonly" not in myopts:
- portage.db[portage.root]["bintree"].inject(x[2])
- mytbz2=portage.db[portage.root]["bintree"].getname(x[2])
- short_msg = "emerge: ("+str(mergecount)+" of "+str(len(mymergelist))+") "+x[pkgindex]+" Merge"
- emergelog(" === ("+str(mergecount)+" of "+str(len(mymergelist))+") Merging ("+x[pkgindex]+"::"+y+")", short_msg=short_msg)
-
- self.pkgsettings["EMERGE_FROM"] = "binary"
- self.pkgsettings.backup_changes("EMERGE_FROM")
-
- retval=portage.pkgmerge(mytbz2,myroot,self.pkgsettings)
- if retval==None:
- sys.exit(1)
- else:
- short_msg = "emerge: ("+str(mergecount)+" of "+str(len(mymergelist))+") "+x[pkgindex]+" Clean"
- emergelog(" === ("+str(mergecount)+" of "+str(len(mymergelist))+") Cleaning ("+x[pkgindex]+"::"+y+")", short_msg=short_msg)
- retval=portage.doebuild(y,"clean",myroot,self.pkgsettings,edebug,cleanup=1)
- if (retval == None):
- portage_util.writemsg("Unable to run required binary.\n")
- sys.exit(127)
- if retval:
- sys.exit(retval)
- short_msg = "emerge: ("+str(mergecount)+" of "+str(len(mymergelist))+") "+x[pkgindex]+" Compile"
- emergelog(" === ("+str(mergecount)+" of "+str(len(mymergelist))+") Compiling/Merging ("+x[pkgindex]+"::"+y+")", short_msg=short_msg)
- retval=portage.doebuild(y,"merge",myroot,self.pkgsettings,edebug)
- if (retval == None):
- portage_util.writemsg("Unable to run required binary.\n")
- sys.exit(127)
- if retval:
- sys.exit(retval)
- #dynamically update our database
- elif x[0]=="binary":
- #merge the tbz2
- mytbz2=portage.db[portage.root]["bintree"].getname(x[2])
- if portage.db[portage.root]["bintree"].isremote(x[2]):
- short_msg = "emerge: ("+str(mergecount)+" of "+str(len(mymergelist))+") "+x[pkgindex]+" Fetch"
- emergelog(" --- ("+str(mergecount)+" of "+str(len(mymergelist))+") Fetching Binary ("+x[pkgindex]+"::"+mytbz2+")", short_msg=short_msg)
- portage.db[portage.root]["bintree"].gettbz2(x[2])
-
- if ("--fetchonly" in myopts) or ("--fetch-all-uri" in myopts):
- continue
-
- short_msg = "emerge: ("+str(mergecount)+" of "+str(len(mymergelist))+") "+x[pkgindex]+" Merge Binary"
- emergelog(" === ("+str(mergecount)+" of "+str(len(mymergelist))+") Merging Binary ("+x[pkgindex]+"::"+mytbz2+")", short_msg=short_msg)
- retval=portage.pkgmerge(mytbz2,x[1],self.pkgsettings)
- if retval==None:
- sys.exit(1)
- #need to check for errors
- if "--buildpkgonly" not in myopts:
- portage.db[x[1]]["vartree"].inject(x[2])
- myfavkey=portage.cpv_getkey(x[2])
- if "--fetchonly" not in myopts and "--fetch-all-uri" not in myopts and myfavkey in favorites:
- myfavs=portage.grabfile(myroot+portage.WORLD_FILE)
- myfavdict=genericdict(myfavs)
- mysysdict=genericdict(syslist)
- #don't record if already in system profile or already recorded
- if (not mysysdict.has_key(myfavkey)) and (not myfavdict.has_key(myfavkey)):
- #we don't have a favorites entry for this package yet; add one
- myfavdict[myfavkey]=myfavkey
- print ">>> Recording",myfavkey,"in \"world\" favorites file..."
- emergelog(" === ("+str(mergecount)+" of "+str(len(mymergelist))+") Updating world file ("+x[pkgindex]+")")
- portage.writedict(myfavdict,myroot+portage.WORLD_FILE,writekey=0)
-
- if ("noclean" not in portage.features) and (x[0] != "binary"):
- short_msg = "emerge: ("+str(mergecount)+" of "+str(len(mymergelist))+") "+x[pkgindex]+" Clean Post"
- emergelog(" === ("+str(mergecount)+" of "+str(len(mymergelist))+") Post-Build Cleaning ("+x[pkgindex]+"::"+y+")", short_msg=short_msg)
- retval=portage.doebuild(y,"clean",myroot,self.pkgsettings,edebug,cleanup=1)
- if (retval == None):
- portage_util.writemsg("Unable to run required binary.\n")
- sys.exit(127)
- if retval:
- sys.exit(retval)
-
- if ("--pretend" not in myopts) and ("--fetchonly" not in myopts) and ("--fetch-all-uri" not in myopts):
- # Clean the old package that we have merged over top of it.
- if self.pkgsettings["AUTOCLEAN"]=="yes":
- xsplit=portage.pkgsplit(x[2])
- emergelog(" >>> AUTOCLEAN: "+xsplit[0])
- retval=unmerge("clean", [xsplit[0]])
- if not retval:
- emergelog(" --- AUTOCLEAN: Nothing unmerged.")
-
- # Figure out if we need a restart.
- mysplit=portage.pkgsplit(x[2])
- if mysplit[0]=="sys-apps/portage":
- myver=mysplit[1]+"-"+mysplit[2]
- if myver[-3:]=='-r0':
- myver=myver[:-3]
- if (myver != portage.VERSION) and \
- ("livecvsportage" not in portage.settings.features):
- if len(mymergelist) > mergecount:
- myargv=sys.argv
- myr=0
- for myra in range(len(myargv)):
- if myargv[myr][0:len("portage")]=="portage":
- del myargv[myr]
- myr-=1
- if myargv[myr][0:len("sys-apps/portage")]=="sys-apps/portage":
- del myargv[myr]
- myr-=1
- myr+=1
- emergelog(" *** RESTARTING emerge via exec() after change of portage version.")
- portage.portageexit()
- # Remove --ask from options before restarting
- mynewargv=[]
- badlongopts = ["--ask","--tree","--changelog"]
- badshortopts = ["a","t","l"]
- for arg in myargv:
- if arg[0:2] == "--":
- if arg in badlongopts:
- continue
- mynewargv += [arg]
- elif arg[0] == "-":
- myarg = "-"
- for ch in arg[1:]:
- if ch in badshortopts:
- continue
- myarg += ch
- mynewargv += [myarg]
- else:
- mynewargv += [arg]
- os.execv("/usr/lib/portage/bin/emerge", mynewargv)
-
- if ("--pretend" not in myopts) and ("--fetchonly" not in myopts) and ("--fetch-all-uri" not in myopts):
- emergelog(" ::: completed emerge ("+str(mergecount)+" of "+str(len(mymergelist))+") "+x[2]+" to "+x[1])
-
- # Unsafe for parallel merges
- del portage.mtimedb["resume"]["mergelist"][0]
-
- emergelog(" *** Finished. Cleaning up...")
-
- # We're out of the loop... We're done. Delete the resume data.
- if portage.mtimedb.has_key("resume"):
- del portage.mtimedb["resume"]
-
- if ("--pretend" not in myopts):
- if ("--fetchonly" not in myopts) and ("--fetch-all-uri" not in myopts):
- if (mergecount>0):
- if retval:
- portage.env_update()
-
- #by doing an exit this way, --fetchonly can continue to try to
- #fetch everything even if a particular download fails.
- if "--fetchonly" in myopts or "--fetch-all-uri" in myopts:
- if returnme:
- print "\n\n!!! Some fetch errors were encountered. Please see above for details.\n\n"
- sys.exit(returnme)
- else:
- sys.exit(0)
-
-def unmerge(unmerge_action, unmerge_files):
- candidate_catpkgs=[]
- global_unmerge=0
-
- realsyslist = getlist("system")
- syslist = []
- for x in realsyslist:
- mycp = portage.dep_getkey(x)
- if mycp in portage.settings.virtuals:
- syslist.extend(portage.settings.virtuals[mycp])
- syslist.append(mycp)
-
- global myopts
- mysettings = portage.config(clone=portage.settings)
-
- if not unmerge_files or "world" in unmerge_files or "system" in unmerge_files:
- if "unmerge"==unmerge_action:
- print
- print bold("emerge unmerge")+" can only be used with specific package names, not with "+bold("world")+" or"
- print bold("system")+" targets."
- print
- return 0
- else:
- global_unmerge=1
-
- localtree=portage.db[portage.root]["vartree"]
- # process all arguments and add all valid db entries to candidate_catpkgs
- if global_unmerge:
- if not unmerge_files or "world" in unmerge_files:
- candidate_catpkgs.extend(localtree.getallnodes())
- elif "system" in unmerge_files:
- candidate_catpkgs.extend(getlist("system"))
- else:
- #we've got command-line arguments
- if not unmerge_files:
- print "\nNo packages to unmerge have been provided.\n"
- return 0
- for x in unmerge_files:
- arg_parts=x.split('/')
- if (x[0] not in [".","/"]) and (arg_parts[-1][-7:] != ".ebuild"):
- #possible cat/pkg or dep; treat as such
- candidate_catpkgs.append(x)
- elif unmerge_action in ["prune","clean"]:
- print "\n!!! Prune and clean do not accept individual ebuilds as arguments;\n skipping.\n"
- continue
- else:
- # it appears that the user is specifying an installed ebuild and we're in "unmerge" mode, so it's
- # ok.
- if not os.path.exists(x):
- print "\n!!! The path '"+x+"' doesn't exist.\n"
- return 0
-
- absx = os.path.abspath(x)
- sp_absx = absx.split("/")
- if sp_absx[-1][-7:] == ".ebuild":
- del sp_absx[-1]
- absx = string.join(sp_absx,"/")
-
- sp_absx_len = len(sp_absx)
-
- vdb_path = portage.root+portage.VDB_PATH
- vdb_len = len(vdb_path)
-
- sp_vdb = vdb_path.split("/")
- sp_vdb_len = len(sp_vdb)
-
- if not os.path.exists(absx+"/CONTENTS"):
- print "!!! Not a valid db dir: "+str(absx)
- return 0
-
- if sp_absx_len <= sp_vdb_len:
- # The Path is shorter... so it can't be inside the vdb.
- print spabsx
- print absx
- print "\n!!!",x,"cannot be inside "+(portage.root+portage.VDB_PATH)+"; aborting.\n"
- return 0
-
- for idx in range(0,sp_vdb_len):
- if (idx >= sp_absx_len) or (sp_vdb[idx] != sp_absx[idx]):
- print sp_absx
- print absx
- print "\n!!!",x,"is not inside "+(portage.root+portage.VDB_PATH)+"; aborting.\n"
- return 0
-
- print "="+string.join(sp_absx[sp_vdb_len:],"/")
- candidate_catpkgs.append("="+string.join(sp_absx[sp_vdb_len:],"/"))
-
- if ("--pretend" in myopts) or ("--ask" in myopts):
- print darkgreen("\n>>> These are the packages that I would unmerge:")
-
- pkgmap={}
- numselected=0
- for x in candidate_catpkgs:
- #cycle through all our candidate deps and determine what will and will not get unmerged
- try:
- mymatch=localtree.dep_match(x)
- except KeyError:
- mymatch=None
- except ValueError, errpkgs:
- print "\n\n!!! The short ebuild name \"" + x + "\" is ambiguous. Please specify"
- print "!!! one of the following fully-qualified ebuild names instead:\n"
- for i in errpkgs[0]:
- print " " + green(i)
- print
- sys.exit(1)
-
- if not mymatch and x[0] not in "<>=~":
- #add a "=" if missing
- mymatch=localtree.dep_match("="+x)
- if not mymatch:
- print "\n--- Couldn't find " + white(x) + " to "+unmerge_action+"."
- continue
- mykey=portage.key_expand(portage.dep_getkey(mymatch[0]),portage.db["/"]["vartree"].dbapi)
- if not pkgmap.has_key(mykey):
- pkgmap[mykey]={"protected":[], "selected":[], "omitted":[] }
- if unmerge_action=="unmerge":
- for y in mymatch:
- if y not in pkgmap[mykey]["selected"]:
- pkgmap[mykey]["selected"].append(y)
- numselected=numselected+len(mymatch)
-
- else:
- #unmerge_action in ["prune", clean"]
- slotmap={}
- for mypkg in mymatch:
- if unmerge_action=="clean":
- myslot=localtree.getslot(mypkg)
- else:
- #since we're pruning, we don't care about slots and put all the pkgs in together
- myslot=0
- if not slotmap.has_key(myslot):
- slotmap[myslot]={}
- slotmap[myslot][localtree.dbapi.cpv_counter(mypkg)]=mypkg
- for myslot in slotmap.keys():
- counterkeys=slotmap[myslot].keys()
- counterkeys.sort()
- if not counterkeys:
- continue
- counterkeys.sort()
- pkgmap[mykey]["protected"].append(slotmap[myslot][counterkeys[-1]])
- del counterkeys[-1]
- #be pretty and get them in order of merge:
- for ckey in counterkeys:
- pkgmap[mykey]["selected"].append(slotmap[myslot][ckey])
- numselected=numselected+1
- #ok, now the last-merged package is protected, and the rest are selected
- if global_unmerge and not numselected:
- print "\n>>> No outdated packages were found on your system.\n"
- return 0
-
- if not numselected:
- print "\n>>>",unmerge_action+": No packages selected for removal.\n"
- return 0
-
- for x in pkgmap.keys():
- for y in localtree.dep_match(x):
- if y not in pkgmap[x]["omitted"] and \
- y not in pkgmap[x]["selected"] and \
- y not in pkgmap[x]["protected"]:
- pkgmap[x]["omitted"].append(y)
- if global_unmerge and not pkgmap[x]["selected"]:
- #avoid cluttering the preview printout with stuff that isn't getting unmerged
- continue
- if not (pkgmap[x]["protected"] or pkgmap[x]["omitted"]) and (x in syslist):
- print red("\a\n\n!!! '%s' is part of your system profile. '%s'" % (mykey))
- print yellow("\a!!! Unmerging it may be damaging to your system.\n")
- if "--pretend" not in myopts and "--ask" not in myopts:
- global EMERGE_WARNING_DELAY
- countdown(EMERGE_WARNING_DELAY,red("Press Ctrl-C to Stop"))
- print "\n "+white(x)
- for mytype in ["selected","protected","omitted"]:
- print string.rjust(mytype,12)+":",
- if pkgmap[x][mytype]:
- for mypkg in pkgmap[x][mytype]:
- mysplit=portage.catpkgsplit(mypkg)
- if mysplit[3]=="r0":
- myversion=mysplit[2]
- else:
- myversion=mysplit[2]+"-"+mysplit[3]
- if mytype=="selected":
- print red(myversion),
- else:
- print green(myversion),
- else:
- print "none",
- print
-
- print "\n>>>",red("'Selected'"),"packages are slated for removal."
- print ">>>",green("'Protected'"),"and",green("'omitted'"),"packages will not be removed.\n"
-
- if "--pretend" in myopts:
- #we're done... return
- return 0
- if "--ask" in myopts:
- if userquery("Do you want me to unmerge these packages?")=="No":
- # enter pretend mode for correct formatting of results
- myopts+=["--pretend"]
- print
- print "Quitting."
- print
- return 0
- #the real unmerging begins, after a short delay....
-
- global CLEAN_DELAY
- countdown(CLEAN_DELAY, ">>> Unmerging")
-
- for x in pkgmap.keys():
- for y in pkgmap[x]["selected"]:
- print ">>> Unmerging "+y+"..."
- emergelog("=== Unmerging... ("+y+")")
- mysplit=string.split(y,"/")
- #unmerge...
- retval=portage.unmerge(mysplit[0],mysplit[1],portage.root,mysettings,unmerge_action not in ["clean","prune"])
- if retval:
- emergelog(" !!! unmerge FAILURE: "+y)
- else:
- emergelog(" >>> unmerge success: "+y)
- #run ldconfig, etc...
- portage.env_update()
- if not numselected:
- return 0
- else:
- return 1
-
-
-def chk_updated_info_files(retval):
- root=portage.root
-
- infodirs=[]
- infodirs.extend(string.split(portage.settings["INFOPATH"], ":"))
- infodirs.extend(string.split(portage.settings["INFODIR"], ":"))
-
- print
- if os.path.exists("/usr/bin/install-info"):
- regen_infodirs=[]
- for z in infodirs:
- if z=='':
- continue
- inforoot=normpath(root+z)
- if os.path.isdir(inforoot):
- try:
- infomtime=os.stat(inforoot)[ST_MTIME]
- except SystemExit, e:
- raise # Needed else can't exit
- except:
- infomtime=0
-
- if not portage.mtimedb.has_key("info"):
- portage.mtimedb["info"]={}
- if portage.mtimedb["info"].has_key(inforoot):
- if portage.mtimedb["info"][inforoot]==infomtime:
- pass
- else:
- portage.mtimedb["info"][inforoot]=infomtime
- regen_infodirs.append(inforoot)
- else:
- regen_infodirs.append(inforoot)
-
- if not regen_infodirs:
- print " "+green("*")+" GNU info directory index is up-to-date."
- else:
- print " "+green("*")+" Regenerating GNU info directory index..."
-
- icount=0
- badcount=0
- for inforoot in regen_infodirs:
- if inforoot=='':
- continue
- try:
- os.rename(inforoot+"/dir",inforoot+"/dir.old")
- except SystemExit, e:
- raise # Needed else can't exit
- except:
- pass
-
- if not os.path.isdir(inforoot):
- continue
- errmsg = ""
- for x in os.listdir(inforoot):
- if (x[0] == ".") or (x in ["dir","dir.old"]) or (os.path.isdir(inforoot+"/"+x)):
- continue
- myso=commands.getstatusoutput("LANG=C LANGUAGE=C /usr/bin/install-info --dir-file="+inforoot+"/dir "+inforoot+"/"+x)[1]
- existsstr="already exists, for file `"
- if myso!="":
- if re.search(existsstr,myso):
- # Already exists... Don't increment the count for this.
- pass
- elif myso[:44]=="install-info: warning: no info dir entry in ":
- # This info file doesn't contain a DIR-header: install-info produces this
- # (harmless) warning (the --quiet switch doesn't seem to work).
- # Don't increment the count for this.
- pass
- else:
- badcount=badcount+1
- errmsg += myso + "\n"
- icount=icount+1
-
- #update mtime so we can potentially avoid regenerating.
- portage.mtimedb["info"][inforoot]=os.stat(inforoot)[ST_MTIME]
-
- if badcount:
- print " "+yellow("*")+" Processed",icount,"info files;",badcount,"errors."
- print errmsg
- else:
- print " "+green("*")+" Processed",icount,"info files."
-
-
-def post_emerge(retval=0):
- global myopts
- os.chdir("/")
- if "--pretend" in myopts:
- sys.exit(retval)
-
- emergelog(" *** exiting successfully.")
-
- if "noinfo" not in portage.settings.features:
- chk_updated_info_files(retval)
-
- chk_updated_cfg_files()
- sys.exit(retval)
-
-
-def chk_updated_cfg_files():
- if portage.settings["CONFIG_PROTECT"]:
- #number of directories with some protect files in them
- procount=0
- for x in string.split(portage.settings["CONFIG_PROTECT"]):
- if os.path.isdir(x):
- a=commands.getstatusoutput("cd "+x+"; find . -iname '._cfg????_*'")
- if a[0]!=0:
- print " "+red("*")+" error scanning",x
- else:
- files=string.split(a[1])
- if files:
- procount=procount+1
- print " "+yellow("* IMPORTANT:")+"",len(files),"config files in",x,"need updating."
- if procount:
- #print " "+yellow("*")+" Type "+green("emerge --help config")+" to learn how to update config files."
- print " "+yellow("*")+" Type "+green("emerge --help config")+" to learn how to update config files."
- print
-
-# general options that should be taken into account before any action
-if "--debug" in myopts:
- edebug=1
-
-if myaction in ["sync","rsync","metadata"] and (not "--help" in myopts):
- if "--pretend" in myopts:
- print "emerge: \"sync\" actions do not support \"--pretend.\""
- sys.exit(1)
-
- emergelog(" === "+str(myaction))
- myportdir=portage.settings["PORTDIR"]
- if myportdir[-1]=="/":
- myportdir=myportdir[:-1]
- if not os.path.exists(myportdir):
- print ">>>",myportdir,"not found, creating it."
- os.makedirs(myportdir,0755)
- syncuri=string.rstrip(portage.settings["SYNC"])
- os.umask(0022)
- if myaction == "metadata":
- if "--ask" in myopts:
- if userquery("Are you sure?") == "No":
- sys.exit(1)
- print "skipping sync"
- updatecache_flg = True
- tmpservertimestampfile = None
- elif syncuri[:8]=="rsync://":
- if not os.path.exists("/usr/bin/rsync"):
- print "!!! /usr/bin/rsync does not exist, so rsync support is disabled."
- print "!!! Type \"emerge net-misc/rsync\" to enable rsync support."
- sys.exit(1)
- mytimeout=180
- if portage.settings.has_key("RSYNC_TIMEOUT"):
- try:
- mytimeout=int(portage.settings["RSYNC_TIMEOUT"])
- except SystemExit, e:
- raise # Needed else can't exit
- except:
- pass
-
- rsync_flags = [
- "--recursive", # Recurse directories
- "--links", # Consider symlinks
- "--safe-links", # Ignore links outside of tree
- "--perms", # Preserve permissions
- "--times", # Preserive mod times
- "--compress", # Compress the data transmitted
- "--force", # Force deletion on non-empty dirs
- "--whole-file", # Don't do block transfers, only entire files
- "--delete", # Delete files that aren't in the master tree
- "--delete-after", # Delete only after everything else is done
- "--stats", # Show final statistics about what was transfered
- "--timeout="+str(mytimeout), # IO timeout if not done in X seconds
- "--exclude='/distfiles'", # Exclude distfiles from consideration
- "--exclude='/local'", # Exclude local from consideration
- "--exclude='/packages'", # Exclude packages from consideration
- ]
-
- if "--quiet" in myopts:
- rsync_flags.append("--quiet") # Shut up a lot
- else:
- rsync_flags.append("--progress") # Progress meter for each file
-
- if "--verbose" in myopts:
- rsync_flags.append("--verbose") # More noise? Not really sure what
-
- if "--debug" in myopts:
- rsync_flags.append("--checksum") # Force checksum on all files
-
- if portage.settings.has_key("RSYNC_EXCLUDEFROM"):
- if os.path.exists(portage.settings["RSYNC_EXCLUDEFROM"]):
- rsync_flags.append("--exclude-from="+portage.settings["RSYNC_EXCLUDEFROM"])
- else:
- print "!!! RSYNC_EXCLUDEFROM specified, but file does not exist."
-
- if portage.settings.has_key("RSYNC_RATELIMIT"):
- rsync_flags.append("--bwlimit="+portage.settings["RSYNC_RATELIMIT"])
-
- rsynccommand = "/usr/bin/rsync " + string.join(rsync_flags, " ")
-
- servertimestampdir = portage.settings.depcachedir+"/"
- servertimestampfile = portage.settings.depcachedir+"/timestamp.chk"
- tmpservertimestampdir = portage.settings["PORTAGE_TMPDIR"]+"/"
- tmpservertimestampfile = portage.settings["PORTAGE_TMPDIR"]+"/timestamp.chk"
-
- # We only use the backup if a timestamp exists in the portdir.
- content=None
- if os.path.exists(myportdir+"/metadata/timestamp.chk"):
- content=portage.grabfile(servertimestampfile)
- if (not content):
- content=portage.grabfile(myportdir+"/metadata/timestamp.chk")
-
- if (content):
- try:
- mytimestamp=time.mktime(time.strptime(content[0], "%a, %d %b %Y %H:%M:%S +0000"))
- except ValueError:
- mytimestamp=0
- else:
- mytimestamp=0
-
- if not os.path.exists(servertimestampdir):
- os.mkdir(servertimestampdir)
- os.chown(servertimestampdir, os.getuid(), portage.portage_gid)
- os.chmod(servertimestampdir, 02775)
-
- #exitcode=0
- try:
- maxretries=int(portage.settings["RSYNC_RETRIES"])
- except SystemExit, e:
- raise # Needed else can't exit
- except:
- maxretries=3 #default number of retries
-
- retries=0
- hostname, port=re.split("rsync://([^:/]*)(:[0-9]+)?", syncuri)[1:3];
- if port==None:
- port=""
- updatecache_flg=True
-
- ips=[]
- while (1):
- if ips:
- del ips[0]
- if ips==[]:
- try:
- ips=socket.gethostbyname_ex(hostname)[2]
- except SystemExit, e:
- raise # Needed else can't exit
- except Exception, e:
- print "Notice:",str(e)
- dosyncuri=syncuri
-
- if ips:
- try:
- dosyncuri=string.replace(syncuri, "//"+hostname+port+"/", "//"+ips[0]+port+"/", 1)
- except SystemExit, e:
- raise # Needed else can't exit
- except Exception, e:
- print "Notice:",str(e)
- dosyncuri=syncuri
-
- if (retries==0):
- if "--ask" in myopts:
- if userquery("Do you want to sync your Portage tree with the mirror at\n" + blue(dosyncuri) + bold("?"))=="No":
- print
- print "Quitting."
- print
- sys.exit(0)
- emergelog(">>> starting rsync with "+dosyncuri)
- if "--quiet" not in myopts:
- print ">>> starting rsync with "+dosyncuri+"..."
- else:
- emergelog(">>> Starting retry %d of %d with %s" % (retries,maxretries,dosyncuri))
- print "\n\n>>> Starting retry %d of %d with %s" % (retries,maxretries,dosyncuri)
-
- if "--quiet" not in myopts:
- print ">>> checking server timestamp ..."
- mycommand=rsynccommand+" "+dosyncuri+"/metadata/timestamp.chk "+tmpservertimestampdir
- exitcode=portage.spawn(mycommand,portage.settings,free=1)
- if (exitcode==0):
- try:
- servertimestamp = time.mktime(time.strptime(portage.grabfile(tmpservertimestampfile)[0], "%a, %d %b %Y %H:%M:%S +0000"))
- except SystemExit, e:
- raise # Needed else can't exit
- except:
- servertimestamp = 0
-
- if (servertimestamp != 0) and (servertimestamp == mytimestamp):
- emergelog(">>> Cancelling sync -- Already current.")
- print
- print ">>>"
- print ">>> Timestamps on the server and in the local repository are the same."
- print ">>> Cancelling all further sync action. You are already up to date."
- print ">>>"
- print
- sys.exit(0)
- elif (servertimestamp != 0) and (servertimestamp < mytimestamp):
- emergelog(">>> Server out of date: %s" % dosyncuri)
- print
- print ">>>"
- print ">>> SERVER OUT OF DATE: %s" % dosyncuri
- print ">>>"
- print
- elif (servertimestamp == 0) or (servertimestamp > mytimestamp):
- # actual sync
- mycommand=rsynccommand+" "+dosyncuri+"/ "+myportdir
- exitcode=portage.spawn(mycommand,portage.settings,free=1)
- if exitcode in [0,1,2,3,4,11,14,20,21]:
- break
- elif exitcode in [0,1,2,3,4,11,14,20,21]:
- break
-
- retries=retries+1
-
- if retries<=maxretries:
- print ">>> retry ..."
- time.sleep(11)
- else:
- # over retries
- # exit loop
- updatecache_flg=False
- break
-
- if (exitcode==0):
- emergelog("=== Sync completed with %s" % dosyncuri)
- elif (exitcode>0):
- print
- if exitcode==1:
- print darkred("!!!")+green(" Rsync has reported that there is a syntax error. Please ensure")
- print darkred("!!!")+green(" that your SYNC statement is proper.")
- print darkred("!!!")+green(" SYNC="+portage.settings["SYNC"])
- elif exitcode==11:
- print darkred("!!!")+green(" Rsync has reported that there is a File IO error. Normally")
- print darkred("!!!")+green(" this means your disk is full, but can be caused by corruption")
- print darkred("!!!")+green(" on the filesystem that contains PORTDIR. Please investigate")
- print darkred("!!!")+green(" and try again after the problem has been fixed.")
- print darkred("!!!")+green(" PORTDIR="+portage.settings["PORTDIR"])
- elif exitcode==20:
- print darkred("!!!")+green(" Rsync was killed before it finished.")
- else:
- print darkred("!!!")+green(" Rsync has not successfully finished. It is recommended that you keep")
- print darkred("!!!")+green(" trying or that you use the 'emerge-webrsync' option if you are unable")
- print darkred("!!!")+green(" to use rsync due to firewall or other restrictions. This should be a")
- print darkred("!!!")+green(" temporary problem unless complications exist with your network")
- print darkred("!!!")+green(" (and possibly your system's filesystem) configuration.")
- print
- sys.exit(exitcode)
- elif syncuri[:6]=="cvs://":
- if not os.path.exists("/usr/bin/cvs"):
- print "!!! /usr/bin/cvs does not exist, so rsync support is disabled."
- print "!!! Type \"emerge dev-util/cvs\" to enable CVS support."
- sys.exit(1)
- cvsroot=syncuri[6:]
- cvsdir=os.path.dirname(myportdir)
- if not os.path.exists(myportdir+"/CVS"):
- #initial checkout
- print ">>> starting initial cvs checkout with "+syncuri+"..."
- if not portage.spawn("cd "+cvsdir+"; cvs -d "+cvsroot+" login",portage.settings,free=1):
- print "!!! cvs login error; exiting."
- sys.exit(1)
- if os.path.exists(cvsdir+"/gentoo-x86"):
- print "!!! existing",cvsdir+"/gentoo-x86 directory; exiting."
- sys.exit(1)
- if not portage.spawn("cd "+cvsdir+"; cvs -z0 -d "+cvsroot+" co -P gentoo-x86",portage.settings,free=1):
- print "!!! cvs checkout error; exiting."
- sys.exit(1)
- if cvsdir!=myportdir:
- portage.movefile(cvsdir,portage.settings["PORTDIR"])
- sys.exit(0)
- else:
- #cvs update
- print ">>> starting cvs update with "+syncuri+"..."
- sys.exit(portage.spawn("cd "+myportdir+"; cvs -z0 -q update -dP",portage.settings,free=1))
- else:
- print "!!! rsync setting: ",syncuri,"not recognized; exiting."
- sys.exit(1)
-
- try: # Prevent users from affecting ebuild.sh.
- os.close(sys.stdin.fileno())
- except SystemExit, e:
- raise # Needed else can't exit
- except:
- pass
-
- if os.path.exists(myportdir+"/metadata/cache") and updatecache_flg:
- if "--quiet" not in myopts:
- print "\n>>> Updating Portage cache: ",
- os.umask(0002)
- cachedir = os.path.normpath(portage.settings.depcachedir)
- if cachedir in ["/", "/bin", "/dev", "/etc", "/home",
- "/lib", "/opt", "/proc", "/root", "/sbin",
- "/sys", "/tmp", "/usr", "/var"]:
- print "!!! PORTAGE_CACHEDIR IS SET TO A PRIMARY ROOT DIRECTORY ON YOUR SYSTEM."
- print "!!! This is ALMOST CERTAINLY NOT what you want: "+str(cachedir)
- sys.exit(73)
- if not os.path.exists(cachedir):
- os.mkdir(cachedir)
-
- # Potentially bad
- #if os.path.exists(cachedir+"/"+myportdir):
- # portage.spawn("rm -Rf "+cachedir+"/"+myportdir+"/*",portage.settings,free=1)
-
- # save timestamp.chk for next timestamp check.
- try:
- if tmpservertimestampfile != None:
- portage.movefile(tmpservertimestampfile, servertimestampfile)
- except SystemExit, e:
- raise # Needed else can't exit
- except Exception, e:
- print "!!! Failed to save current timestamp."
- print "!!!",e
-
- portage.portdb.flush_cache()
-
- try:
- os.umask(002)
- os.chown(cachedir, os.getuid(), portage.portage_gid)
- os.chmod(cachedir, 02775)
- except SystemExit, e:
- raise # Needed else can't exit
- except:
- pass
- # we don't make overlay trees cache here.
- backup_porttrees=portage.portdb.porttrees
- porttree_root = portage.portdb.porttree_root
- portage.portdb.porttrees=[porttree_root]
- cp_list=portage.portdb.cp_all()
- cp_list.sort()
- pcnt=0
- pcntstr=""
- pcntcount=len(cp_list)/100.0
- nextupdate=pcntcount
- current=1
- def cleanse_cache(cat, saves, porttree_root=porttree_root):
- if len(saves):
- d={}
- for v in saves:
- d[portage.catsplit(v)[1]] = True
- for pv in portage.db["/"]["porttree"].dbapi.auxdb[porttree_root][cat].keys():
- if pv not in d:
- portage.db["/"]["porttree"].dbapi.auxdb[porttree_root][cat].del_key(pv)
- else:
- portage.db["/"]["porttree"].dbapi.auxdb[porttree_root][cat].clear()
- del portage.db["/"]["porttree"].dbapi.auxdb[porttree_root][cat]
- savelist = []
- catlist = []
- oldcat = portage.catsplit(cp_list[0])[0]
- for cp in cp_list:
- current += 1
- if current >= nextupdate:
- pcnt += 1
- nextupdate += pcntcount
- if "--quiet" not in myopts:
- pcntstr = str(pcnt)
- sys.stdout.write("\b"*(len(pcntstr)+1)+pcntstr+"%")
- sys.stdout.flush()
- cat = portage.catsplit(cp)[0]
- if cat != oldcat:
- catlist.append(oldcat)
- cleanse_cache(oldcat, savelist)
- savelist = []
- oldcat = cat
- mymatches = portage.db["/"]["porttree"].dbapi.xmatch("match-all", cp)
- savelist.extend(mymatches)
- for cpv in mymatches:
- try: portage.db["/"]["porttree"].dbapi.aux_get(cpv, ["IUSE"],metacachedir=myportdir+"/metadata/cache",debug=("cachedebug" in portage.features))
- except SystemExit: raise
- except Exception, e: print "\nFailed cache update:",cpv,e
- catlist.append(oldcat)
- catlist.append("local")
- cleanse_cache(oldcat, savelist)
- filelist = portage.listdir(cachedir+"/"+myportdir)
- for x in filelist:
- found = False
- for y in catlist:
- if x.startswith(y):
- found = True
- break
- if not found:
- portage.spawn("cd /; rm -Rf "+cachedir+"/"+myportdir+"/"+x,portage.settings,free=1,droppriv=1)
-
-
- portage.portdb.porttrees=backup_porttrees
- sys.stdout.write("\n\n")
- sys.stdout.flush()
-
- portage.portageexit()
- reload(portage)
- mybestpv=portage.portdb.xmatch("bestmatch-visible","sys-apps/portage")
- mypvs=portage.best(portage.db[portage.root]["vartree"].dbapi.match("sys-apps/portage"))
-
- chk_updated_cfg_files()
-
- if(mybestpv != mypvs):
- print
- print red(" * ")+bold("An update to portage is available.")+" It is _highly_ recommended"
- print red(" * ")+"that you update portage now, before any other packages are updated."
- print red(" * ")+"Please do so and then update "+bold("ALL")+" of your configuration files."
- print
-elif myaction=="regen":
- emergelog(" === regen")
- #regenerate cache entries
- print "Regenerating cache entries... "
- try:
- os.close(sys.stdin.fileno())
- except SystemExit, e:
- raise # Needed else can't exit
- except:
- pass
- sys.stdout.flush()
- mynodes=portage.portdb.cp_all()
- for x in mynodes:
- mymatches=portage.portdb.xmatch("match-all",x)
- if not "--quiet" in myopts:
- print "processing",x
- for y in mymatches:
- try:
- foo=portage.portdb.aux_get(y,["DEPEND"],debug=1)
- except SystemExit, e:
- # sys.exit is an exception... And consequently, we can't catch it.
- raise
- except Exception, e:
- print "\n error processing %(cpv)s, continuing... (%(e)s)" % {"cpv":y,"e":str(e)}
- print "done!"
-# HELP action
-elif "config"==myaction:
- if len(myfiles) != 1 or "system" in myfiles or "world" in myfiles:
- print red("!!! config can only take a single package atom at this time\n")
- sys.exit(1)
-
- print
- pkgs = portage.db[portage.root]["vartree"].dbapi.match(myfiles[0])
- if len(pkgs) == 0:
- print "No packages found.\n"
- sys.exit(0)
- elif len(pkgs) > 1:
- if "--ask" in myopts:
- options = []
- print "Please select a package to configure:"
- idx = 0
- for pkg in pkgs:
- idx += 1
- options.append(str(idx))
- print options[-1]+") "+pkg
- print "X) Cancel"
- options.append("X")
- idx = userquery("Selection?", options)
- if idx == "X":
- sys.exit(0)
- pkg = pkgs[int(idx)-1]
- else:
- print "The following packages available:"
- for pkg in pkgs:
- print "* "+pkg
- print "\nPlease use a specific atom or the --ask option."
- sys.exit(1)
- else:
- pkg = pkgs[0]
-
- print
- if "--ask" in myopts:
- if userquery("Ready to configure "+pkg+"?") == "No":
- sys.exit(0)
- else:
- print "Configuring pkg..."
- print
- ebuildpath = portage.db[portage.root]["vartree"].dbapi.findname(pkg)
- mysettings = portage.config(clone=portage.settings)
- portage.doebuild(ebuildpath,"config",portage.root,mysettings,debug=("--debug" in myopts),cleanup=True)
- print
-
-# INFO action
-elif "info"==myaction:
- unameout=commands.getstatusoutput("uname -mrp")[1]
- print getportageversion()
- print "================================================================="
- print "System uname: "+unameout
- if os.path.exists("/etc/gentoo-release"):
- os.system("cat /etc/gentoo-release")
- else:
- print "Unknown Host Operating System"
-
- output=commands.getstatusoutput("distcc --version")
- if not output[0]:
- print str(string.split(output[1],"\n",1)[0]),
- if "distcc" in portage.features:
- print "[enabled]"
- else:
- print "[disabled]"
-
- output=commands.getstatusoutput("ccache -V")
- if not output[0]:
- print str(string.split(output[1],"\n",1)[0]),
- if "ccache" in portage.features:
- print "[enabled]"
- else:
- print "[disabled]"
-
- myvars = ["sys-devel/autoconf", "sys-devel/automake", "virtual/os-headers",
- "sys-devel/binutils", "sys-devel/libtool", "dev-lang/python"]
- myvars += portage_util.grabfile(portage.settings["PORTDIR"]+"/profiles/info_pkgs")
- myvars = portage_util.unique_array(myvars)
- myvars.sort()
-
- for x in myvars:
- if portage.isvalidatom(x):
- pkg_matches = portage.db["/"]["vartree"].dbapi.match(x)
- pkgs = []
- for y in pkg_matches:
- mycpv = portage.catpkgsplit(y)
- if(mycpv[3] != "r0"):
- pkgs += [mycpv[2] + "-" + mycpv[3]]
- else:
- pkgs += [mycpv[2]]
- if not pkgs:
- pkgs = "[Not Present]"
- else:
- pkgs = ", ".join(sorted_versions(pkgs))
- print "%-20s %s" % (x+":", pkgs)
- else:
- print "%-20s %s" % (x+":", "[NOT VALID]")
-
- libtool_vers = string.join(portage.db["/"]["vartree"].dbapi.match("sys-devel/libtool"), ",")
-
- if "--verbose" in myopts:
- myvars=portage.settings.keys()
- else:
- myvars = ['GENTOO_MIRRORS', 'CONFIG_PROTECT', 'CONFIG_PROTECT_MASK',
- 'PORTDIR', 'DISTDIR', 'PKGDIR', 'PORTAGE_TMPDIR',
- 'PORTDIR_OVERLAY', 'USE', 'CHOST', 'CFLAGS', 'CXXFLAGS',
- 'ACCEPT_KEYWORDS', 'SYNC', 'FEATURES']
-
- myvars.extend(portage_util.grabfile(portage.settings["PORTDIR"]+"/profiles/info_vars"))
-
- myvars = portage_util.unique_array(myvars)
- unset_vars = []
- myvars.sort()
- for x in myvars:
- if portage.settings.has_key(x):
- print x+'="'+portage.settings[x]+'"'
- else:
- unset_vars.append(x)
- if unset_vars:
- print "Unset: "+", ".join(unset_vars)
- print
-
- if "--debug" in myopts:
- for x in dir(portage):
- module = getattr(portage, x)
- if "cvs_id_string" in dir(module):
- print "%s: %s" % (str(x), str(module.cvs_id_string))
-
-# SEARCH action
-elif "search"==myaction:
- if not myfiles:
- print "emerge: no search terms provided."
- else:
- searchinstance = search()
- for mysearch in myfiles:
- try:
- searchinstance.execute(mysearch)
- except re.error, comment:
- print "\n!!! Regular expression error in \"%s\": %s" % ( mysearch, comment )
- sys.exit(1)
- searchinstance.output()
-elif "inject"==myaction:
- if not myfiles:
- print "emerge: please specify at least one cat/pkg-ver to inject."
- sys.exit(1)
- if "--pretend" in myopts:
- print "emerge: the \"inject\" action does not support \"--pretend.\""
- sys.exit(1)
- for x in myfiles:
- if x[0] in [">","<","=","!"]:
- print "!!! '"+x+"' is an invalid specification."
- print "!!! Must be 'category/package-version' with no other symbols."
- print
- continue
- mycps=portage.catpkgsplit(x)
- if (not mycps) or (mycps[0]=="null"):
- print "!!!",x,"is not a specific cat/pkg-version, skipping..."
- continue
- if portage.db["/"]["vartree"].exists_specific(x):
- print "!!! Not injecting",x+"; Package already exists."
- else:
- if "--ask" in myopts:
- if userquery("Do you want to inject the package %s?" % x)=="No":
- print
- print "Quitting."
- print
- sys.exit(0)
- portage.db["/"]["vartree"].dbapi.cpv_inject(x)
- print ">>> Injected",x+"."
- emergelog(" === inject: "+x)
-elif "unmerge"==myaction or "prune"==myaction or "clean"==myaction:
- if 1==unmerge(myaction, myfiles):
- post_emerge()
-
-elif "depclean"==myaction:
- # Kill packages that aren't explicitly merged or are required as a
- # dependency of another package. World file is explicit.
-
- print
- print red("*** WARNING ***")+" : DEPCLEAN CAN SERIOUSLY IMPAIR YOUR SYSTEM. USE CAUTION."
- print red("*** WARNING ***")+" : (Cancel: CONTROL-C) -- ALWAYS VERIFY ALL PACKAGES IN THE"
- print red("*** WARNING ***")+" : CANDIDATE LIST FOR SANITY BEFORE ALLOWING DEPCLEAN TO"
- print red("*** WARNING ***")+" : UNMERGE ANY PACKAGES."
- print red("*** WARNING ***")+" :"
- print red("*** WARNING ***")+" : USE FLAGS MAY HAVE AN EXTREME EFFECT ON THE OUTPUT."
- print red("*** WARNING ***")+" : SOME LIBRARIES MAY BE USED BY PACKAGES BUT ARE NOT"
- print red("*** WARNING ***")+" : CONSIDERED TO BE A DEPEND DUE TO USE FLAG SETTINGS."
- print red("*** WARNING ***")+" : emerge --update --deep --newuse world TO VERIFY"
- print red("*** WARNING ***")+" : SANITY IN THIS REGARD."
- print red("*** WARNING ***")+" :"
- print red("*** WARNING ***")+" : Packages in the list that are desired may be added"
- print red("*** WARNING ***")+" : directly to the world file to cause them to be ignored"
- print red("*** WARNING ***")+" : by depclean and maintained in the future. BREAKAGES DUE"
- print red("*** WARNING ***")+" : TO UNMERGING AN ==IN-USE LIBRARY== MAY BE REPAIRED BY"
- print red("*** WARNING ***")+" : MERGING *** THE PACKAGE THAT COMPLAINS *** ABOUT THE"
- print red("*** WARNING ***")+" : MISSING LIBRARY."
- print
- if ("--pretend" not in myopts) and ("--ask" not in myopts):
- countdown(EMERGE_WARNING_DELAY, ">>> Depclean")
- emergelog(" >>> depclean")
-
- mydepgraph=depgraph(myaction,myopts)
- syslist=getlist("system")
- worldlist=getlist("world")
-
- print "Calculating",myaction,"dependencies ",
- if not mydepgraph.xcreate("world"):
- print "\n!!! Failed to create deptree."
- sys.exit(1)
- print "\b\b ... done!"
-
- if ("--usepkgonly" in myopts) and mydepgraph.missingbins:
- sys.stderr.write(red("The following binaries are not available for merging...\n"))
- for x in mydepgraph.missingbins:
- sys.stderr.write(" "+str(x)+"\n")
- sys.stderr.write("\nThese are required by '--usepkgonly' -- Terminating.\n\n")
- sys.exit(1)
-
- alldeps=mydepgraph.digraph.allnodes()
- myvarlist=portage.vardbapi(portage.root).cp_all()
-
- if not syslist:
- print "!!! You have no system list. Cannot determine system from world."
- if not worldlist:
- print "!!! You have no world file. Cannot determine explicit merges."
- if not myvarlist:
- print "!!! You have no installed package tree (%s). This is a problem." % portage.VDB_PATH
- if not alldeps:
- print "!!! You have no dependencies. Impossible. Bug."
-
- if not (syslist and worldlist and myvarlist and alldeps):
- print
- sys.exit(1)
-
- reallist=[]
- for x in alldeps:
- myparts=portage.catpkgsplit(string.split(x)[2])
- if not myparts:
- sys.stderr.write(
- red("!!! There appears to be a problem with the following package:\n")+
- red("!!! "+str(string.split(x)[2])+"\n\n")+
- "!!! Please ensure that blocking/conflicting packages are not merged."+
- "!!! 'emerge -p "+str(string.split(x)[2])+"\n\n")
- if ("--pretend" not in myopts) and ("--ask" not in myopts):
- countdown(EMERGE_WARNING_DELAY, "*** Continuing")
- continue
-
- catpack=myparts[0]+"/"+myparts[1]
- if catpack not in reallist:
- reallist.append(catpack)
-
- cleanlist=[]
- for x in myvarlist:
- if x not in reallist:
- if x not in cleanlist:
- cleanlist.append(x)
-
- for x in syslist+worldlist:
- myparts = portage.catpkgsplit(x)
- if myparts:
- if myparts[0][0] in ('<','>','='):
- myparts[0] = myparts[0][1:]
- if myparts[0][0] in ('<','>','='):
- myparts[0] = myparts[0][1:]
- catpack=myparts[0]+"/"+myparts[1]
- else:
- catpack=x
- if catpack in cleanlist:
- cleanlist.remove(catpack)
-
- #print "\n\n\nCleaning: "
- #for x in cleanlist:
- # print x
- #print
-
- if len(cleanlist):
- unmerge("unmerge", cleanlist)
-
- print
- print "Packages installed: "+str(len(myvarlist))
- print "Packages in world: "+str(len(worldlist))
- print "Packages in system: "+str(len(syslist))
- print "Unique package names: "+str(len(reallist))
- print "Required packages: "+str(len(alldeps))
- if "--pretend" in myopts:
- print "Number to remove: "+str(len(cleanlist))
- else:
- print "Number removed: "+str(len(cleanlist))
- post_emerge()
-
-# "update", "system", or just process files:
-else:
- favorites=[]
- syslist=getlist("system")
- if (("--pretend" in myopts) and not ("--fetchonly" in myopts or "--fetch-all-uri" in myopts)) or ("--ask" in myopts):
- if "--tree" in myopts:
- print
- print darkgreen("These are the packages that I would merge, in reverse order:")
- print
- else:
- print
- print darkgreen("These are the packages that I would merge, in order:")
- print
-
- if ("--resume" in myopts) and portage.mtimedb.has_key("resume"):
- myresumeopts=portage.mtimedb["resume"]["myopts"][:]
-
- while "--skipfirst" in myresumeopts:
- myresumeopts.remove("--skipfirst")
- while "--ask" in myresumeopts:
- myresumeopts.remove("--ask")
-
- for myopt in myopts:
- if myopt not in myresumeopts:
- myresumeopts.append(myopt)
- myopts=myresumeopts
- mydepgraph=depgraph("resume",myopts)
- if "--resume" not in myopts:
- myopts+=["--resume"]
- else:
- if ("--resume" in myopts):
- del myopts[myopts.index("--resume")]
- print darkgreen("emerge: It seems we have nothing to resume...")
- sys.exit(0)
-
- mydepgraph=depgraph(myaction,myopts)
- if myaction in ["system","world"]:
- print "Calculating",myaction,"dependencies ",
- sys.stdout.flush()
- if not mydepgraph.xcreate(myaction):
- print "!!! Depgraph creation failed."
- sys.exit(1)
- print "\b\b ...done!"
- else:
- if not myfiles:
- print "emerge: please tell me what to do."
- help()
- sys.exit(1)
- #we don't have any files to process; skip this step and exit
- print "Calculating dependencies ",
- sys.stdout.flush()
- retval,favorites=mydepgraph.select_files(myfiles)
- if not retval:
- sys.exit(1)
- print "\b\b ...done!"
-
- if ("--usepkgonly" in myopts) and mydepgraph.missingbins:
- sys.stderr.write(red("The following binaries are not available for merging...\n"))
-
- if mydepgraph.missingbins:
- for x in mydepgraph.missingbins:
- sys.stderr.write(" "+str(x)+"\n")
- sys.stderr.write("\nThese are required by '--usepkgonly' -- Terminating.\n\n")
- sys.exit(1)
-
- if "--ask" in myopts:
- if "--resume" in myopts:
- mydepgraph.display(portage.mtimedb["resume"]["mergelist"])
- prompt="Do you want me to resume merging these packages?"
- else:
- mydepgraph.display(mydepgraph.altlist())
- mergecount=0
- hasblocks = False
- for x in mydepgraph.altlist():
- if x[3]!="nomerge":
- mergecount+=1
- #check for blocking dependencies
- if x[0]=="blocks":
- hasblocks = True
- if mergecount==0:
- if portage.settings["AUTOCLEAN"] and "yes"==portage.settings["AUTOCLEAN"]:
- prompt="Nothing to merge; do you want me to auto-clean packages?"
- else:
- print
- print "Nothing to merge; quitting."
- print
- sys.exit(0)
- elif "--fetchonly" in myopts or "--fetch-all-uri" in myopts:
- prompt="Do you want me to fetch the source files for these packages?"
- elif hasblocks:
- print "\n!!! Error: The above package list contains packages which cannot be installed"
- print "!!! on the same system."
- print
- sys.exit(1)
- else:
- prompt="Do you want me to merge these packages?"
- print
- if userquery(prompt)=="No":
- print
- print "Quitting."
- print
- sys.exit(0)
- # Don't ask again (e.g. when auto-cleaning packages after merge)
- myopts.remove("--ask")
-
- if ("--pretend" in myopts) and not ("--fetchonly" in myopts or "--fetch-all-uri" in myopts):
- if ("--resume" in myopts):
- mydepgraph.display(portage.mtimedb["resume"]["mergelist"])
- else:
- mydepgraph.display(mydepgraph.altlist())
- else:
- if ("--buildpkgonly" in myopts):
- if not mydepgraph.digraph.hasallzeros():
- print "\n!!! --buildpkgonly requires all dependencies to be merged."
- print "!!! Cannot merge requested packages. Merge deps and try again.\n"
- sys.exit(1)
-
- if ("--resume" in myopts):
- favorites=portage.mtimedb["resume"]["favorites"]
- mydepgraph.merge(portage.mtimedb["resume"]["mergelist"])
- else:
- portage.mtimedb["resume"]={}
- portage.mtimedb["resume"]["myopts"]=myopts
- portage.mtimedb["resume"]["favorites"]=favorites
- if ("--digest" in myopts) and not ("--fetchonly" in myopts or "--fetch-all-uri" in myopts):
- for pkgline in mydepgraph.altlist():
- if pkgline[0]=="ebuild" and pkgline[3]=="merge":
- y=portage.portdb.findname(pkgline[2])
- tmpsettings = portage.config(clone=portage.settings)
- retval=portage.doebuild(y,"digest",portage.root,tmpsettings,edebug,("--pretend" in myopts))
- mydepgraph.merge(mydepgraph.altlist())
-
- if portage.mtimedb.has_key("resume"):
- del portage.mtimedb["resume"]
- if portage.settings["AUTOCLEAN"] and "yes"==portage.settings["AUTOCLEAN"]:
- print ">>> Auto-cleaning packages ..."
- unmerge("clean", ["world"])
- post_emerge()