* [gentoo-commits] portage r15481 - in main/branches/prefix: bin pym/_emerge pym/portage pym/portage/dbapi pym/portage/package/ebuild pym/portage/util
@ 2010-02-27 19:21 99% Fabian Groffen (grobian)
0 siblings, 0 replies; 1+ results
From: Fabian Groffen (grobian) @ 2010-02-27 19:21 UTC (permalink / raw
To: gentoo-commits
Author: grobian
Date: 2010-02-27 19:21:09 +0000 (Sat, 27 Feb 2010)
New Revision: 15481
Added:
main/branches/prefix/pym/portage/util/ExtractKernelVersion.py
main/branches/prefix/pym/portage/util/digestgen.py
main/branches/prefix/pym/portage/util/env_update.py
Modified:
main/branches/prefix/bin/repoman
main/branches/prefix/pym/_emerge/Scheduler.py
main/branches/prefix/pym/portage/__init__.py
main/branches/prefix/pym/portage/dbapi/vartree.py
main/branches/prefix/pym/portage/package/ebuild/doebuild.py
Log:
Merged from trunk -r15451:15455
| 15452 | Move env_update to portage.util.env_update.envupdate. |
| zmedico | |
| 15453 | Move ExtractKernelVersion |
| zmedico | portage.util.ExtractKernelVersion. |
| 15454 | Move digestgen to portage.util.digestgen. |
| zmedico | |
| 15455 | Define 'long' for Python 3. |
| arfrever | |
Modified: main/branches/prefix/bin/repoman
===================================================================
--- main/branches/prefix/bin/repoman 2010-02-27 19:01:26 UTC (rev 15480)
+++ main/branches/prefix/bin/repoman 2010-02-27 19:21:09 UTC (rev 15481)
@@ -75,6 +75,7 @@
green, nocolor, red, turquoise, yellow
from portage.output import ConsoleStyleFile, StyleWriter
from portage.util import cmp_sort_key, writemsg_level
+from portage.util.digestgen import digestgen
if sys.hexversion >= 0x3000000:
basestring = str
@@ -1011,7 +1012,7 @@
portage._doebuild_manifest_exempt_depend -= 1
repoman_settings["O"] = checkdir
- if not portage.digestgen(mysettings=repoman_settings, myportdb=portdb):
+ if not digestgen(mysettings=repoman_settings, myportdb=portdb):
print("Unable to generate manifest.")
dofail = 1
if options.mode == "manifest":
@@ -2339,7 +2340,7 @@
mydone=[]
if repolevel==3: # In a package dir
repoman_settings["O"] = startdir
- portage.digestgen(mysettings=repoman_settings, myportdb=portdb)
+ digestgen(mysettings=repoman_settings, myportdb=portdb)
elif repolevel==2: # In a category dir
for x in myfiles:
xs=x.split("/")
@@ -2353,7 +2354,7 @@
repoman_settings["O"] = os.path.join(startdir, xs[0])
if not os.path.isdir(repoman_settings["O"]):
continue
- portage.digestgen(mysettings=repoman_settings, myportdb=portdb)
+ digestgen(mysettings=repoman_settings, myportdb=portdb)
elif repolevel==1: # repo-cvsroot
print(green("RepoMan sez:"), "\"You're rather crazy... doing the entire repository.\"\n")
for x in myfiles:
@@ -2368,7 +2369,7 @@
repoman_settings["O"] = os.path.join(startdir, xs[0], xs[1])
if not os.path.isdir(repoman_settings["O"]):
continue
- portage.digestgen(mysettings=repoman_settings, myportdb=portdb)
+ digestgen(mysettings=repoman_settings, myportdb=portdb)
else:
print(red("I'm confused... I don't know where I am!"))
sys.exit(1)
Modified: main/branches/prefix/pym/_emerge/Scheduler.py
===================================================================
--- main/branches/prefix/pym/_emerge/Scheduler.py 2010-02-27 19:01:26 UTC (rev 15480)
+++ main/branches/prefix/pym/_emerge/Scheduler.py 2010-02-27 19:21:09 UTC (rev 15481)
@@ -24,6 +24,7 @@
from portage.sets import SETPREFIX
from portage.sets.base import InternalPackageSet
from portage.util import writemsg, writemsg_level
+from portage.util.digestgen import digestgen
from _emerge.BinpkgPrefetcher import BinpkgPrefetcher
from _emerge.Blocker import Blocker
@@ -591,7 +592,7 @@
if ebuild_path is None:
raise AssertionError("ebuild not found for '%s'" % x.cpv)
pkgsettings['O'] = os.path.dirname(ebuild_path)
- if not portage.digestgen(mysettings=pkgsettings, myportdb=portdb):
+ if not digestgen(mysettings=pkgsettings, myportdb=portdb):
writemsg_level(
"!!! Unable to generate manifest for '%s'.\n" \
% x.cpv, level=logging.ERROR, noiselevel=-1)
Modified: main/branches/prefix/pym/portage/__init__.py
===================================================================
--- main/branches/prefix/pym/portage/__init__.py 2010-02-27 19:01:26 UTC (rev 15480)
+++ main/branches/prefix/pym/portage/__init__.py 2010-02-27 19:21:09 UTC (rev 15481)
@@ -42,8 +42,6 @@
# which is unavailable.
from StringIO import StringIO
- from time import sleep
- from itertools import chain
import platform
import warnings
@@ -121,7 +119,10 @@
'pickle_read,pickle_write,stack_dictlist,stack_dicts,' + \
'stack_lists,unique_array,varexpand,writedict,writemsg,' + \
'writemsg_stdout,write_atomic',
+ 'portage.util.digestgen:digestgen',
'portage.util.digraph:digraph',
+ 'portage.util.env_update:env_update',
+ 'portage.util.ExtractKernelVersion:ExtractKernelVersion',
'portage.util.listdir:cacheddir,listdir',
'portage.versions',
'portage.versions:best,catpkgsplit,catsplit,cpv_getkey,' + \
@@ -535,529 +536,6 @@
mylink=mydir+"/"+mylink
return os.path.normpath(mylink)
-#parse /etc/env.d and generate /etc/profile.env
-
-def env_update(makelinks=1, target_root=None, prev_mtimes=None, contents=None,
- env=None, writemsg_level=None):
- if writemsg_level is None:
- writemsg_level = portage.util.writemsg_level
- if target_root is None:
- global settings
- target_root = settings["ROOT"]
- if prev_mtimes is None:
- global mtimedb
- prev_mtimes = mtimedb["ldpath"]
- if env is None:
- env = os.environ
- envd_dir = os.path.join(target_root, EPREFIX_LSTRIP, "etc", "env.d")
- portage.util.ensure_dirs(envd_dir, mode=0o755)
- fns = listdir(envd_dir, EmptyOnError=1)
- fns.sort()
- templist = []
- for x in fns:
- if len(x) < 3:
- continue
- if not x[0].isdigit() or not x[1].isdigit():
- continue
- if x.startswith(".") or x.endswith("~") or x.endswith(".bak"):
- continue
- templist.append(x)
- fns = templist
- del templist
-
- space_separated = set(["CONFIG_PROTECT", "CONFIG_PROTECT_MASK"])
- colon_separated = set(["ADA_INCLUDE_PATH", "ADA_OBJECTS_PATH",
- "CLASSPATH", "INFODIR", "INFOPATH", "KDEDIRS", "LDPATH", "MANPATH",
- "PATH", "PKG_CONFIG_PATH", "PRELINK_PATH", "PRELINK_PATH_MASK",
- "PYTHONPATH", "ROOTPATH"])
-
- config_list = []
-
- for x in fns:
- file_path = os.path.join(envd_dir, x)
- try:
- myconfig = getconfig(file_path, expand=False)
- except portage.exception.ParseError as e:
- writemsg("!!! '%s'\n" % str(e), noiselevel=-1)
- del e
- continue
- if myconfig is None:
- # broken symlink or file removed by a concurrent process
- writemsg("!!! File Not Found: '%s'\n" % file_path, noiselevel=-1)
- continue
-
- config_list.append(myconfig)
- if "SPACE_SEPARATED" in myconfig:
- space_separated.update(myconfig["SPACE_SEPARATED"].split())
- del myconfig["SPACE_SEPARATED"]
- if "COLON_SEPARATED" in myconfig:
- colon_separated.update(myconfig["COLON_SEPARATED"].split())
- del myconfig["COLON_SEPARATED"]
-
- env = {}
- specials = {}
- for var in space_separated:
- mylist = []
- for myconfig in config_list:
- if var in myconfig:
- for item in myconfig[var].split():
- if item and not item in mylist:
- mylist.append(item)
- del myconfig[var] # prepare for env.update(myconfig)
- if mylist:
- env[var] = " ".join(mylist)
- specials[var] = mylist
-
- for var in colon_separated:
- mylist = []
- for myconfig in config_list:
- if var in myconfig:
- for item in myconfig[var].split(":"):
- if item and not item in mylist:
- mylist.append(item)
- del myconfig[var] # prepare for env.update(myconfig)
- if mylist:
- env[var] = ":".join(mylist)
- specials[var] = mylist
-
- for myconfig in config_list:
- """Cumulative variables have already been deleted from myconfig so that
- they won't be overwritten by this dict.update call."""
- env.update(myconfig)
-
- if EPREFIX == '':
- sleep_for_mtime_granularity = dolinkingstuff(
- target_root, specials, prelink_capable,
- makelinks, contents, prev_mtimes, env)
- else:
- sleep_for_mtime_granularity = False
- writeshellprofile(target_root, env, sleep_for_mtime_granularity)
-
-def dolinkingstuff(target_root, specials, prelink_capable, makelinks,
- contents, prev_mtimes, env):
- # updating this stuff will never work in an offset, other than ROOT
- # (e.g. not in Prefix), hence the EPREFIX is not taken into account
- # here since this code should never be triggered on an offset install
- ldsoconf_path = os.path.join(target_root, "etc", "ld.so.conf")
- try:
- myld = codecs.open(_unicode_encode(ldsoconf_path,
- encoding=_encodings['fs'], errors='strict'),
- mode='r', encoding=_encodings['content'], errors='replace')
- myldlines=myld.readlines()
- myld.close()
- oldld=[]
- for x in myldlines:
- #each line has at least one char (a newline)
- if x[0]=="#":
- continue
- oldld.append(x[:-1])
- except (IOError, OSError) as e:
- if e.errno != errno.ENOENT:
- raise
- oldld = None
-
- ld_cache_update=False
-
- newld = specials["LDPATH"]
- if (oldld!=newld):
- #ld.so.conf needs updating and ldconfig needs to be run
- myfd = atomic_ofstream(ldsoconf_path)
- myfd.write("# ld.so.conf autogenerated by env-update; make all changes to\n")
- myfd.write("# contents of /etc/env.d directory\n")
- for x in specials["LDPATH"]:
- myfd.write(x+"\n")
- myfd.close()
- ld_cache_update=True
-
- # Update prelink.conf if we are prelink-enabled
- if prelink_capable:
- newprelink = atomic_ofstream(
- os.path.join(target_root, "etc", "prelink.conf"))
- newprelink.write("# prelink.conf autogenerated by env-update; make all changes to\n")
- newprelink.write("# contents of /etc/env.d directory\n")
-
- for x in ["/bin","/sbin","/usr/bin","/usr/sbin","/lib","/usr/lib"]:
- newprelink.write("-l "+x+"\n");
- for x in specials["LDPATH"]+specials["PATH"]+specials["PRELINK_PATH"]:
- if not x:
- continue
- if x[-1]!='/':
- x=x+"/"
- plmasked=0
- for y in specials["PRELINK_PATH_MASK"]:
- if not y:
- continue
- if y[-1]!='/':
- y=y+"/"
- if y==x[0:len(y)]:
- plmasked=1
- break
- if not plmasked:
- newprelink.write("-h "+x+"\n")
- for x in specials["PRELINK_PATH_MASK"]:
- newprelink.write("-b "+x+"\n")
- newprelink.close()
-
- # Portage stores mtimes with 1 second granularity but in >=python-2.5 finer
- # granularity is possible. In order to avoid the potential ambiguity of
- # mtimes that differ by less than 1 second, sleep here if any of the
- # directories have been modified during the current second.
- sleep_for_mtime_granularity = False
- current_time = long(time.time())
- mtime_changed = False
- lib_dirs = set()
- for lib_dir in portage.util.unique_array(specials["LDPATH"]+['usr/lib','usr/lib64','usr/lib32','lib','lib64','lib32']):
- x = os.path.join(target_root, lib_dir.lstrip(os.sep))
- try:
- newldpathtime = os.stat(x)[stat.ST_MTIME]
- lib_dirs.add(normalize_path(x))
- except OSError as oe:
- if oe.errno == errno.ENOENT:
- try:
- del prev_mtimes[x]
- except KeyError:
- pass
- # ignore this path because it doesn't exist
- continue
- raise
- if newldpathtime == current_time:
- sleep_for_mtime_granularity = True
- if x in prev_mtimes:
- if prev_mtimes[x] == newldpathtime:
- pass
- else:
- prev_mtimes[x] = newldpathtime
- mtime_changed = True
- else:
- prev_mtimes[x] = newldpathtime
- mtime_changed = True
-
- if mtime_changed:
- ld_cache_update = True
-
- if makelinks and \
- not ld_cache_update and \
- contents is not None:
- libdir_contents_changed = False
- for mypath, mydata in contents.items():
- if mydata[0] not in ("obj","sym"):
- continue
- head, tail = os.path.split(mypath)
- if head in lib_dirs:
- libdir_contents_changed = True
- break
- if not libdir_contents_changed:
- makelinks = False
-
- ldconfig = "/sbin/ldconfig"
- if "CHOST" in env and "CBUILD" in env and \
- env["CHOST"] != env["CBUILD"]:
- from portage.process import find_binary
- ldconfig = find_binary("%s-ldconfig" % env["CHOST"])
-
- # Only run ldconfig as needed
- if (ld_cache_update or makelinks) and ldconfig:
- # ldconfig has very different behaviour between FreeBSD and Linux
- if ostype=="Linux" or ostype.lower().endswith("gnu"):
- # We can't update links if we haven't cleaned other versions first, as
- # an older package installed ON TOP of a newer version will cause ldconfig
- # to overwrite the symlinks we just made. -X means no links. After 'clean'
- # we can safely create links.
- writemsg_level(_(">>> Regenerating %setc/ld.so.cache...\n") % \
- (target_root,))
- if makelinks:
- os.system("cd / ; %s -r '%s'" % (ldconfig, target_root))
- else:
- os.system("cd / ; %s -X -r '%s'" % (ldconfig, target_root))
- elif ostype in ("FreeBSD","DragonFly"):
- writemsg_level(_(">>> Regenerating %svar/run/ld-elf.so.hints...\n") % \
- target_root)
- os.system(("cd / ; %s -elf -i " + \
- "-f '%svar/run/ld-elf.so.hints' '%setc/ld.so.conf'") % \
- (ldconfig, target_root, target_root))
-
- del specials["LDPATH"]
-
- return sleep_for_mtime_granularity
-
-def writeshellprofile(target_root, env, sleep_for_mtime_granularity):
- penvnotice = "# THIS FILE IS AUTOMATICALLY GENERATED BY env-update.\n"
- penvnotice += "# DO NOT EDIT THIS FILE. CHANGES TO STARTUP PROFILES\n"
- cenvnotice = penvnotice[:]
- penvnotice += "# GO INTO "+EPREFIX+"/etc/profile NOT "+EPREFIX+"/etc/profile.env\n\n"
- cenvnotice += "# GO INTO "+EPREFIX+"/etc/csh.cshrc NOT "+EPREFIX+"/etc/csh.env\n\n"
-
- #create /etc/profile.env for bash support
- outfile = atomic_ofstream(os.path.join(target_root, EPREFIX_LSTRIP, "etc", "profile.env"))
- outfile.write(penvnotice)
-
- env_keys = [ x for x in env if x != "LDPATH" ]
- env_keys.sort()
- for k in env_keys:
- v = env[k]
- if v.startswith('$') and not v.startswith('${'):
- outfile.write("export %s=$'%s'\n" % (k, v[1:]))
- else:
- outfile.write("export %s='%s'\n" % (k, v))
- outfile.close()
-
- #create /etc/csh.env for (t)csh support
- outfile = atomic_ofstream(os.path.join(target_root, EPREFIX_LSTRIP, "etc", "csh.env"))
- outfile.write(cenvnotice)
- for x in env_keys:
- outfile.write("setenv %s '%s'\n" % (x, env[x]))
- outfile.close()
-
- if sleep_for_mtime_granularity:
- while current_time == long(time.time()):
- sleep(1)
-
-def ExtractKernelVersion(base_dir):
- """
- Try to figure out what kernel version we are running
- @param base_dir: Path to sources (usually /usr/src/linux)
- @type base_dir: string
- @rtype: tuple( version[string], error[string])
- @returns:
- 1. tuple( version[string], error[string])
- Either version or error is populated (but never both)
-
- """
- lines = []
- pathname = os.path.join(base_dir, 'Makefile')
- try:
- f = codecs.open(_unicode_encode(pathname,
- encoding=_encodings['fs'], errors='strict'), mode='r',
- encoding=_encodings['content'], errors='replace')
- except OSError as details:
- return (None, str(details))
- except IOError as details:
- return (None, str(details))
-
- try:
- for i in range(4):
- lines.append(f.readline())
- except OSError as details:
- return (None, str(details))
- except IOError as details:
- return (None, str(details))
-
- lines = [l.strip() for l in lines]
-
- version = ''
-
- #XXX: The following code relies on the ordering of vars within the Makefile
- for line in lines:
- # split on the '=' then remove annoying whitespace
- items = line.split("=")
- items = [i.strip() for i in items]
- if items[0] == 'VERSION' or \
- items[0] == 'PATCHLEVEL':
- version += items[1]
- version += "."
- elif items[0] == 'SUBLEVEL':
- version += items[1]
- elif items[0] == 'EXTRAVERSION' and \
- items[-1] != items[0]:
- version += items[1]
-
- # Grab a list of files named localversion* and sort them
- localversions = os.listdir(base_dir)
- for x in range(len(localversions)-1,-1,-1):
- if localversions[x][:12] != "localversion":
- del localversions[x]
- localversions.sort()
-
- # Append the contents of each to the version string, stripping ALL whitespace
- for lv in localversions:
- version += "".join( " ".join( grabfile( base_dir+ "/" + lv ) ).split() )
-
- # Check the .config for a CONFIG_LOCALVERSION and append that too, also stripping whitespace
- kernelconfig = getconfig(base_dir+"/.config")
- if kernelconfig and "CONFIG_LOCALVERSION" in kernelconfig:
- version += "".join(kernelconfig["CONFIG_LOCALVERSION"].split())
-
- return (version,None)
-
-def digestgen(myarchives=None, mysettings=None,
- overwrite=None, manifestonly=None, myportdb=None):
- """
- Generates a digest file if missing. Fetches files if necessary.
- NOTE: myarchives and mysettings used to be positional arguments,
- so their order must be preserved for backward compatibility.
- @param mysettings: the ebuild config (mysettings["O"] must correspond
- to the ebuild's parent directory)
- @type mysettings: config
- @param myportdb: a portdbapi instance
- @type myportdb: portdbapi
- @rtype: int
- @returns: 1 on success and 0 on failure
- """
- if mysettings is None:
- raise TypeError("portage.digestgen(): missing" + \
- " required 'mysettings' parameter")
- if myportdb is None:
- warnings.warn("portage.digestgen() called without 'myportdb' parameter",
- DeprecationWarning, stacklevel=2)
- global portdb
- myportdb = portdb
- if overwrite is not None:
- warnings.warn("portage.digestgen() called with " + \
- "deprecated 'overwrite' parameter",
- DeprecationWarning, stacklevel=2)
- if manifestonly is not None:
- warnings.warn("portage.digestgen() called with " + \
- "deprecated 'manifestonly' parameter",
- DeprecationWarning, stacklevel=2)
- global _doebuild_manifest_exempt_depend
- try:
- _doebuild_manifest_exempt_depend += 1
- distfiles_map = {}
- fetchlist_dict = FetchlistDict(mysettings["O"], mysettings, myportdb)
- for cpv in fetchlist_dict:
- try:
- for myfile in fetchlist_dict[cpv]:
- distfiles_map.setdefault(myfile, []).append(cpv)
- except portage.exception.InvalidDependString as e:
- writemsg("!!! %s\n" % str(e), noiselevel=-1)
- del e
- return 0
- mytree = os.path.dirname(os.path.dirname(mysettings["O"]))
- manifest1_compat = False
- mf = Manifest(mysettings["O"], mysettings["DISTDIR"],
- fetchlist_dict=fetchlist_dict, manifest1_compat=manifest1_compat)
- # Don't require all hashes since that can trigger excessive
- # fetches when sufficient digests already exist. To ease transition
- # while Manifest 1 is being removed, only require hashes that will
- # exist before and after the transition.
- required_hash_types = set()
- required_hash_types.add("size")
- required_hash_types.add(portage.const.MANIFEST2_REQUIRED_HASH)
- dist_hashes = mf.fhashdict.get("DIST", {})
-
- # To avoid accidental regeneration of digests with the incorrect
- # files (such as partially downloaded files), trigger the fetch
- # code if the file exists and it's size doesn't match the current
- # manifest entry. If there really is a legitimate reason for the
- # digest to change, `ebuild --force digest` can be used to avoid
- # triggering this code (or else the old digests can be manually
- # removed from the Manifest).
- missing_files = []
- for myfile in distfiles_map:
- myhashes = dist_hashes.get(myfile)
- if not myhashes:
- try:
- st = os.stat(os.path.join(mysettings["DISTDIR"], myfile))
- except OSError:
- st = None
- if st is None or st.st_size == 0:
- missing_files.append(myfile)
- continue
- size = myhashes.get("size")
-
- try:
- st = os.stat(os.path.join(mysettings["DISTDIR"], myfile))
- except OSError as e:
- if e.errno != errno.ENOENT:
- raise
- del e
- if size == 0:
- missing_files.append(myfile)
- continue
- if required_hash_types.difference(myhashes):
- missing_files.append(myfile)
- continue
- else:
- if st.st_size == 0 or size is not None and size != st.st_size:
- missing_files.append(myfile)
- continue
-
- if missing_files:
- mytree = os.path.realpath(os.path.dirname(
- os.path.dirname(mysettings["O"])))
- fetch_settings = config(clone=mysettings)
- debug = mysettings.get("PORTAGE_DEBUG") == "1"
- for myfile in missing_files:
- uris = set()
- for cpv in distfiles_map[myfile]:
- myebuild = os.path.join(mysettings["O"],
- catsplit(cpv)[1] + ".ebuild")
- # for RESTRICT=fetch, mirror, etc...
- doebuild_environment(myebuild, "fetch",
- mysettings["ROOT"], fetch_settings,
- debug, 1, myportdb)
- uris.update(myportdb.getFetchMap(
- cpv, mytree=mytree)[myfile])
-
- fetch_settings["A"] = myfile # for use by pkg_nofetch()
-
- try:
- st = os.stat(os.path.join(
- mysettings["DISTDIR"],myfile))
- except OSError:
- st = None
-
- if not fetch({myfile : uris}, fetch_settings):
- writemsg(_("!!! Fetch failed for %s, can't update "
- "Manifest\n") % myfile, noiselevel=-1)
- if myfile in dist_hashes and \
- st is not None and st.st_size > 0:
- # stat result is obtained before calling fetch(),
- # since fetch may rename the existing file if the
- # digest does not match.
- writemsg(_("!!! If you would like to "
- "forcefully replace the existing "
- "Manifest entry\n!!! for %s, use "
- "the following command:\n") % myfile + \
- "!!! " + colorize("INFORM",
- "ebuild --force %s manifest" % \
- os.path.basename(myebuild)) + "\n",
- noiselevel=-1)
- return 0
- writemsg_stdout(_(">>> Creating Manifest for %s\n") % mysettings["O"])
- try:
- mf.create(assumeDistHashesSometimes=True,
- assumeDistHashesAlways=(
- "assume-digests" in mysettings.features))
- except portage.exception.FileNotFound as e:
- writemsg(_("!!! File %s doesn't exist, can't update "
- "Manifest\n") % e, noiselevel=-1)
- return 0
- except portage.exception.PortagePackageException as e:
- writemsg(("!!! %s\n") % (e,), noiselevel=-1)
- return 0
- try:
- mf.write(sign=False)
- except portage.exception.PermissionDenied as e:
- writemsg(_("!!! Permission Denied: %s\n") % (e,), noiselevel=-1)
- return 0
- if "assume-digests" not in mysettings.features:
- distlist = list(mf.fhashdict.get("DIST", {}))
- distlist.sort()
- auto_assumed = []
- for filename in distlist:
- if not os.path.exists(
- os.path.join(mysettings["DISTDIR"], filename)):
- auto_assumed.append(filename)
- if auto_assumed:
- mytree = os.path.realpath(
- os.path.dirname(os.path.dirname(mysettings["O"])))
- cp = os.path.sep.join(mysettings["O"].split(os.path.sep)[-2:])
- pkgs = myportdb.cp_list(cp, mytree=mytree)
- pkgs.sort()
- writemsg_stdout(" digest.assumed" + portage.output.colorize("WARN",
- str(len(auto_assumed)).rjust(18)) + "\n")
- for pkg_key in pkgs:
- fetchlist = myportdb.getFetchMap(pkg_key, mytree=mytree)
- pv = pkg_key.split("/")[1]
- for filename in auto_assumed:
- if filename in fetchlist:
- writemsg_stdout(
- " %s::%s\n" % (pv, filename))
- return 1
- finally:
- _doebuild_manifest_exempt_depend -= 1
-
def digestParseFile(myfilename, mysettings=None):
"""(filename) -- Parses a given file for entries matching:
<checksumkey> <checksum_hex_string> <filename> <filesize>
Modified: main/branches/prefix/pym/portage/dbapi/vartree.py
===================================================================
--- main/branches/prefix/pym/portage/dbapi/vartree.py 2010-02-27 19:01:26 UTC (rev 15480)
+++ main/branches/prefix/pym/portage/dbapi/vartree.py 2010-02-27 19:21:09 UTC (rev 15481)
@@ -25,6 +25,7 @@
'writemsg,writemsg_level,write_atomic,atomic_ofstream,writedict,' + \
'grabfile,grabdict,normalize_path,new_protect_filename,getlibpaths',
'portage.util.digraph:digraph',
+ 'portage.util.env_update:env_update',
'portage.util.listdir:dircache,listdir',
'portage.versions:best,catpkgsplit,catsplit,cpv_getkey,pkgcmp,' + \
'_pkgsplit@pkgsplit',
@@ -39,7 +40,7 @@
FileNotFound, PermissionDenied, UnsupportedAPIException
from portage.localization import _
-from portage import dep_expand, env_update, \
+from portage import dep_expand, \
abssymlink, movefile, _movefile, bsd_chflags
# This is a special version of the os module, wrapped for unicode support.
Modified: main/branches/prefix/pym/portage/package/ebuild/doebuild.py
===================================================================
--- main/branches/prefix/pym/portage/package/ebuild/doebuild.py 2010-02-27 19:01:26 UTC (rev 15480)
+++ main/branches/prefix/pym/portage/package/ebuild/doebuild.py 2010-02-27 19:21:09 UTC (rev 15481)
@@ -21,23 +21,35 @@
import portage
portage.proxy.lazyimport.lazyimport(globals(),
'portage.package.ebuild.config:check_config_instance',
+ 'portage.util.digestgen:digestgen',
+ 'portage.util.ExtractKernelVersion:ExtractKernelVersion'
)
-from portage import auxdbkeys, bsd_chflags, dep_check, digestcheck, digestgen, eapi_is_supported, ExtractKernelVersion, merge, os, selinux, StringIO, unmerge, _encodings, _parse_eapi_ebuild_head, _os_merge, _shell_quote, _split_ebuild_name_glep55, _unicode_decode, _unicode_encode
-from portage.const import EBUILD_SH_ENV_FILE, EBUILD_SH_BINARY, INVALID_ENV_FILE, MISC_SH_BINARY
-from portage.data import portage_gid, portage_uid, secpass, uid, userpriv_groups
+from portage import auxdbkeys, bsd_chflags, dep_check, digestcheck, \
+ eapi_is_supported, merge, os, selinux, StringIO, \
+ unmerge, _encodings, _parse_eapi_ebuild_head, _os_merge, \
+ _shell_quote, _split_ebuild_name_glep55, _unicode_decode, _unicode_encode
+from portage.const import EBUILD_SH_ENV_FILE, EBUILD_SH_BINARY, \
+ INVALID_ENV_FILE, MISC_SH_BINARY
+from portage.data import portage_gid, portage_uid, secpass, \
+ uid, userpriv_groups
from portage.dbapi.virtual import fakedbapi
-from portage.dep import Atom, paren_enclose, paren_normalize, paren_reduce, use_reduce
+from portage.dep import Atom, paren_enclose, paren_normalize, \
+ paren_reduce, use_reduce
from portage.elog import elog_process
from portage.elog.messages import eerror, eqawarn
-from portage.exception import DigestException, FileNotFound, IncorrectParameter, InvalidAtom, InvalidDependString, PermissionDenied, UnsupportedAPIException
+from portage.exception import DigestException, FileNotFound, \
+ IncorrectParameter, InvalidAtom, InvalidDependString, PermissionDenied, \
+ UnsupportedAPIException
from portage.localization import _
from portage.manifest import Manifest
from portage.output import style_to_ansi_code
from portage.package.ebuild.fetch import fetch
from portage.package.ebuild.prepare_build_dirs import prepare_build_dirs
from portage.package.ebuild._pty import _create_pty_or_pipe
-from portage.util import apply_recursive_permissions, apply_secpass_permissions, noiselimit, normalize_path, writemsg, writemsg_stdout, write_atomic
+from portage.util import apply_recursive_permissions, \
+ apply_secpass_permissions, noiselimit, normalize_path, \
+ writemsg, writemsg_stdout, write_atomic
from portage.versions import _pkgsplit
def doebuild_environment(myebuild, mydo, myroot, mysettings,
Copied: main/branches/prefix/pym/portage/util/ExtractKernelVersion.py (from rev 15455, main/trunk/pym/portage/util/ExtractKernelVersion.py)
===================================================================
--- main/branches/prefix/pym/portage/util/ExtractKernelVersion.py (rev 0)
+++ main/branches/prefix/pym/portage/util/ExtractKernelVersion.py 2010-02-27 19:21:09 UTC (rev 15481)
@@ -0,0 +1,77 @@
+# Copyright 2010 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Id$
+
+__all__ = ['ExtractKernelVersion']
+
+import codecs
+
+from portage import os, _encodings, _unicode_encode
+from portage.util import getconfig, grabfile
+
+def ExtractKernelVersion(base_dir):
+ """
+ Try to figure out what kernel version we are running
+ @param base_dir: Path to sources (usually /usr/src/linux)
+ @type base_dir: string
+ @rtype: tuple( version[string], error[string])
+ @returns:
+ 1. tuple( version[string], error[string])
+ Either version or error is populated (but never both)
+
+ """
+ lines = []
+ pathname = os.path.join(base_dir, 'Makefile')
+ try:
+ f = codecs.open(_unicode_encode(pathname,
+ encoding=_encodings['fs'], errors='strict'), mode='r',
+ encoding=_encodings['content'], errors='replace')
+ except OSError as details:
+ return (None, str(details))
+ except IOError as details:
+ return (None, str(details))
+
+ try:
+ for i in range(4):
+ lines.append(f.readline())
+ except OSError as details:
+ return (None, str(details))
+ except IOError as details:
+ return (None, str(details))
+
+ lines = [l.strip() for l in lines]
+
+ version = ''
+
+ #XXX: The following code relies on the ordering of vars within the Makefile
+ for line in lines:
+ # split on the '=' then remove annoying whitespace
+ items = line.split("=")
+ items = [i.strip() for i in items]
+ if items[0] == 'VERSION' or \
+ items[0] == 'PATCHLEVEL':
+ version += items[1]
+ version += "."
+ elif items[0] == 'SUBLEVEL':
+ version += items[1]
+ elif items[0] == 'EXTRAVERSION' and \
+ items[-1] != items[0]:
+ version += items[1]
+
+ # Grab a list of files named localversion* and sort them
+ localversions = os.listdir(base_dir)
+ for x in range(len(localversions)-1,-1,-1):
+ if localversions[x][:12] != "localversion":
+ del localversions[x]
+ localversions.sort()
+
+ # Append the contents of each to the version string, stripping ALL whitespace
+ for lv in localversions:
+ version += "".join( " ".join( grabfile( base_dir+ "/" + lv ) ).split() )
+
+ # Check the .config for a CONFIG_LOCALVERSION and append that too, also stripping whitespace
+ kernelconfig = getconfig(base_dir+"/.config")
+ if kernelconfig and "CONFIG_LOCALVERSION" in kernelconfig:
+ version += "".join(kernelconfig["CONFIG_LOCALVERSION"].split())
+
+ return (version,None)
Copied: main/branches/prefix/pym/portage/util/digestgen.py (from rev 15455, main/trunk/pym/portage/util/digestgen.py)
===================================================================
--- main/branches/prefix/pym/portage/util/digestgen.py (rev 0)
+++ main/branches/prefix/pym/portage/util/digestgen.py 2010-02-27 19:21:09 UTC (rev 15481)
@@ -0,0 +1,204 @@
+# Copyright 2010 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Id$
+
+__all__ = ['digestgen']
+
+import errno
+import warnings
+
+import portage
+portage.proxy.lazyimport.lazyimport(globals(),
+ 'portage.package.ebuild.doebuild:doebuild_environment',
+)
+
+from portage import os
+from portage.const import MANIFEST2_REQUIRED_HASH
+from portage.dbapi.porttree import FetchlistDict
+from portage.exception import InvalidDependString, FileNotFound, \
+ PermissionDenied, PortagePackageException
+from portage.localization import _
+from portage.manifest import Manifest
+from portage.output import colorize
+from portage.package.ebuild.config import config
+from portage.package.ebuild.fetch import fetch
+from portage.util import writemsg, writemsg_stdout
+from portage.versions import catsplit
+
+def digestgen(myarchives=None, mysettings=None,
+ overwrite=None, manifestonly=None, myportdb=None):
+ """
+ Generates a digest file if missing. Fetches files if necessary.
+ NOTE: myarchives and mysettings used to be positional arguments,
+ so their order must be preserved for backward compatibility.
+ @param mysettings: the ebuild config (mysettings["O"] must correspond
+ to the ebuild's parent directory)
+ @type mysettings: config
+ @param myportdb: a portdbapi instance
+ @type myportdb: portdbapi
+ @rtype: int
+ @returns: 1 on success and 0 on failure
+ """
+ if mysettings is None:
+ raise TypeError("portage.digestgen(): missing" + \
+ " required 'mysettings' parameter")
+ if myportdb is None:
+ warnings.warn("portage.digestgen() called without 'myportdb' parameter",
+ DeprecationWarning, stacklevel=2)
+ myportdb = portage.portdb
+ if overwrite is not None:
+ warnings.warn("portage.digestgen() called with " + \
+ "deprecated 'overwrite' parameter",
+ DeprecationWarning, stacklevel=2)
+ if manifestonly is not None:
+ warnings.warn("portage.digestgen() called with " + \
+ "deprecated 'manifestonly' parameter",
+ DeprecationWarning, stacklevel=2)
+
+ try:
+ portage._doebuild_manifest_exempt_depend += 1
+ distfiles_map = {}
+ fetchlist_dict = FetchlistDict(mysettings["O"], mysettings, myportdb)
+ for cpv in fetchlist_dict:
+ try:
+ for myfile in fetchlist_dict[cpv]:
+ distfiles_map.setdefault(myfile, []).append(cpv)
+ except InvalidDependString as e:
+ writemsg("!!! %s\n" % str(e), noiselevel=-1)
+ del e
+ return 0
+ mytree = os.path.dirname(os.path.dirname(mysettings["O"]))
+ manifest1_compat = False
+ mf = Manifest(mysettings["O"], mysettings["DISTDIR"],
+ fetchlist_dict=fetchlist_dict, manifest1_compat=manifest1_compat)
+ # Don't require all hashes since that can trigger excessive
+ # fetches when sufficient digests already exist. To ease transition
+ # while Manifest 1 is being removed, only require hashes that will
+ # exist before and after the transition.
+ required_hash_types = set()
+ required_hash_types.add("size")
+ required_hash_types.add(MANIFEST2_REQUIRED_HASH)
+ dist_hashes = mf.fhashdict.get("DIST", {})
+
+ # To avoid accidental regeneration of digests with the incorrect
+ # files (such as partially downloaded files), trigger the fetch
+ # code if the file exists and it's size doesn't match the current
+ # manifest entry. If there really is a legitimate reason for the
+ # digest to change, `ebuild --force digest` can be used to avoid
+ # triggering this code (or else the old digests can be manually
+ # removed from the Manifest).
+ missing_files = []
+ for myfile in distfiles_map:
+ myhashes = dist_hashes.get(myfile)
+ if not myhashes:
+ try:
+ st = os.stat(os.path.join(mysettings["DISTDIR"], myfile))
+ except OSError:
+ st = None
+ if st is None or st.st_size == 0:
+ missing_files.append(myfile)
+ continue
+ size = myhashes.get("size")
+
+ try:
+ st = os.stat(os.path.join(mysettings["DISTDIR"], myfile))
+ except OSError as e:
+ if e.errno != errno.ENOENT:
+ raise
+ del e
+ if size == 0:
+ missing_files.append(myfile)
+ continue
+ if required_hash_types.difference(myhashes):
+ missing_files.append(myfile)
+ continue
+ else:
+ if st.st_size == 0 or size is not None and size != st.st_size:
+ missing_files.append(myfile)
+ continue
+
+ if missing_files:
+ mytree = os.path.realpath(os.path.dirname(
+ os.path.dirname(mysettings["O"])))
+ fetch_settings = config(clone=mysettings)
+ debug = mysettings.get("PORTAGE_DEBUG") == "1"
+ for myfile in missing_files:
+ uris = set()
+ for cpv in distfiles_map[myfile]:
+ myebuild = os.path.join(mysettings["O"],
+ catsplit(cpv)[1] + ".ebuild")
+ # for RESTRICT=fetch, mirror, etc...
+ doebuild_environment(myebuild, "fetch",
+ mysettings["ROOT"], fetch_settings,
+ debug, 1, myportdb)
+ uris.update(myportdb.getFetchMap(
+ cpv, mytree=mytree)[myfile])
+
+ fetch_settings["A"] = myfile # for use by pkg_nofetch()
+
+ try:
+ st = os.stat(os.path.join(
+ mysettings["DISTDIR"],myfile))
+ except OSError:
+ st = None
+
+ if not fetch({myfile : uris}, fetch_settings):
+ writemsg(_("!!! Fetch failed for %s, can't update "
+ "Manifest\n") % myfile, noiselevel=-1)
+ if myfile in dist_hashes and \
+ st is not None and st.st_size > 0:
+ # stat result is obtained before calling fetch(),
+ # since fetch may rename the existing file if the
+ # digest does not match.
+ writemsg(_("!!! If you would like to "
+ "forcefully replace the existing "
+ "Manifest entry\n!!! for %s, use "
+ "the following command:\n") % myfile + \
+ "!!! " + colorize("INFORM",
+ "ebuild --force %s manifest" % \
+ os.path.basename(myebuild)) + "\n",
+ noiselevel=-1)
+ return 0
+ writemsg_stdout(_(">>> Creating Manifest for %s\n") % mysettings["O"])
+ try:
+ mf.create(assumeDistHashesSometimes=True,
+ assumeDistHashesAlways=(
+ "assume-digests" in mysettings.features))
+ except FileNotFound as e:
+ writemsg(_("!!! File %s doesn't exist, can't update "
+ "Manifest\n") % e, noiselevel=-1)
+ return 0
+ except PortagePackageException as e:
+ writemsg(("!!! %s\n") % (e,), noiselevel=-1)
+ return 0
+ try:
+ mf.write(sign=False)
+ except PermissionDenied as e:
+ writemsg(_("!!! Permission Denied: %s\n") % (e,), noiselevel=-1)
+ return 0
+ if "assume-digests" not in mysettings.features:
+ distlist = list(mf.fhashdict.get("DIST", {}))
+ distlist.sort()
+ auto_assumed = []
+ for filename in distlist:
+ if not os.path.exists(
+ os.path.join(mysettings["DISTDIR"], filename)):
+ auto_assumed.append(filename)
+ if auto_assumed:
+ mytree = os.path.realpath(
+ os.path.dirname(os.path.dirname(mysettings["O"])))
+ cp = os.path.sep.join(mysettings["O"].split(os.path.sep)[-2:])
+ pkgs = myportdb.cp_list(cp, mytree=mytree)
+ pkgs.sort()
+ writemsg_stdout(" digest.assumed" + colorize("WARN",
+ str(len(auto_assumed)).rjust(18)) + "\n")
+ for pkg_key in pkgs:
+ fetchlist = myportdb.getFetchMap(pkg_key, mytree=mytree)
+ pv = pkg_key.split("/")[1]
+ for filename in auto_assumed:
+ if filename in fetchlist:
+ writemsg_stdout(
+ " %s::%s\n" % (pv, filename))
+ return 1
+ finally:
+ portage._doebuild_manifest_exempt_depend -= 1
Copied: main/branches/prefix/pym/portage/util/env_update.py (from rev 15455, main/trunk/pym/portage/util/env_update.py)
===================================================================
--- main/branches/prefix/pym/portage/util/env_update.py (rev 0)
+++ main/branches/prefix/pym/portage/util/env_update.py 2010-02-27 19:21:09 UTC (rev 15481)
@@ -0,0 +1,307 @@
+# Copyright 2010 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Id$
+
+__all__ = ['env_update']
+
+import codecs
+import errno
+import stat
+import sys
+import time
+
+import portage
+from portage import os, _encodings, _unicode_encode
+from portage.checksum import prelink_capable
+from portage.data import ostype
+from portage.exception import ParseError
+from portage.localization import _
+from portage.process import find_binary
+from portage.util import atomic_ofstream, ensure_dirs, getconfig, \
+ normalize_path, writemsg
+from portage.util.listdir import listdir
+
+if sys.hexversion >= 0x3000000:
+ long = int
+
+def env_update(makelinks=1, target_root=None, prev_mtimes=None, contents=None,
+ env=None, writemsg_level=None):
+ """
+ Parse /etc/env.d and use it to generate /etc/profile.env, csh.env,
+ ld.so.conf, and prelink.conf. Finally, run ldconfig.
+ """
+ if writemsg_level is None:
+ writemsg_level = portage.util.writemsg_level
+ if target_root is None:
+ target_root = portage.settings["ROOT"]
+ if prev_mtimes is None:
+ prev_mtimes = portage.mtimedb["ldpath"]
+ if env is None:
+ env = os.environ
+ envd_dir = os.path.join(target_root, EPREFIX_LSTRIP, "etc", "env.d")
+ ensure_dirs(envd_dir, mode=0o755)
+ fns = listdir(envd_dir, EmptyOnError=1)
+ fns.sort()
+ templist = []
+ for x in fns:
+ if len(x) < 3:
+ continue
+ if not x[0].isdigit() or not x[1].isdigit():
+ continue
+ if x.startswith(".") or x.endswith("~") or x.endswith(".bak"):
+ continue
+ templist.append(x)
+ fns = templist
+ del templist
+
+ space_separated = set(["CONFIG_PROTECT", "CONFIG_PROTECT_MASK"])
+ colon_separated = set(["ADA_INCLUDE_PATH", "ADA_OBJECTS_PATH",
+ "CLASSPATH", "INFODIR", "INFOPATH", "KDEDIRS", "LDPATH", "MANPATH",
+ "PATH", "PKG_CONFIG_PATH", "PRELINK_PATH", "PRELINK_PATH_MASK",
+ "PYTHONPATH", "ROOTPATH"])
+
+ config_list = []
+
+ for x in fns:
+ file_path = os.path.join(envd_dir, x)
+ try:
+ myconfig = getconfig(file_path, expand=False)
+ except ParseError as e:
+ writemsg("!!! '%s'\n" % str(e), noiselevel=-1)
+ del e
+ continue
+ if myconfig is None:
+ # broken symlink or file removed by a concurrent process
+ writemsg("!!! File Not Found: '%s'\n" % file_path, noiselevel=-1)
+ continue
+
+ config_list.append(myconfig)
+ if "SPACE_SEPARATED" in myconfig:
+ space_separated.update(myconfig["SPACE_SEPARATED"].split())
+ del myconfig["SPACE_SEPARATED"]
+ if "COLON_SEPARATED" in myconfig:
+ colon_separated.update(myconfig["COLON_SEPARATED"].split())
+ del myconfig["COLON_SEPARATED"]
+
+ env = {}
+ specials = {}
+ for var in space_separated:
+ mylist = []
+ for myconfig in config_list:
+ if var in myconfig:
+ for item in myconfig[var].split():
+ if item and not item in mylist:
+ mylist.append(item)
+ del myconfig[var] # prepare for env.update(myconfig)
+ if mylist:
+ env[var] = " ".join(mylist)
+ specials[var] = mylist
+
+ for var in colon_separated:
+ mylist = []
+ for myconfig in config_list:
+ if var in myconfig:
+ for item in myconfig[var].split(":"):
+ if item and not item in mylist:
+ mylist.append(item)
+ del myconfig[var] # prepare for env.update(myconfig)
+ if mylist:
+ env[var] = ":".join(mylist)
+ specials[var] = mylist
+
+ for myconfig in config_list:
+ """Cumulative variables have already been deleted from myconfig so that
+ they won't be overwritten by this dict.update call."""
+ env.update(myconfig)
+
+ if EPREFIX == '':
+ sleep_for_mtime_granularity = dolinkingstuff(
+ target_root, specials, prelink_capable,
+ makelinks, contents, prev_mtimes, env)
+ else:
+ sleep_for_mtime_granularity = False
+ writeshellprofile(target_root, env, sleep_for_mtime_granularity)
+
+def dolinkingstuff(target_root, specials, prelink_capable, makelinks,
+ contents, prev_mtimes, env):
+ # updating this stuff will never work in an offset, other than ROOT
+ # (e.g. not in Prefix), hence the EPREFIX is not taken into account
+ # here since this code should never be triggered on an offset install
+ ldsoconf_path = os.path.join(target_root, "etc", "ld.so.conf")
+ try:
+ myld = codecs.open(_unicode_encode(ldsoconf_path,
+ encoding=_encodings['fs'], errors='strict'),
+ mode='r', encoding=_encodings['content'], errors='replace')
+ myldlines=myld.readlines()
+ myld.close()
+ oldld=[]
+ for x in myldlines:
+ #each line has at least one char (a newline)
+ if x[:1] == "#":
+ continue
+ oldld.append(x[:-1])
+ except (IOError, OSError) as e:
+ if e.errno != errno.ENOENT:
+ raise
+ oldld = None
+
+ ld_cache_update=False
+
+ newld = specials["LDPATH"]
+ if (oldld != newld):
+ #ld.so.conf needs updating and ldconfig needs to be run
+ myfd = atomic_ofstream(ldsoconf_path)
+ myfd.write("# ld.so.conf autogenerated by env-update; make all changes to\n")
+ myfd.write("# contents of /etc/env.d directory\n")
+ for x in specials["LDPATH"]:
+ myfd.write(x + "\n")
+ myfd.close()
+ ld_cache_update=True
+
+ # Update prelink.conf if we are prelink-enabled
+ if prelink_capable:
+ newprelink = atomic_ofstream(
+ os.path.join(target_root, "etc", "prelink.conf"))
+ newprelink.write("# prelink.conf autogenerated by env-update; make all changes to\n")
+ newprelink.write("# contents of /etc/env.d directory\n")
+
+ for x in ["/bin","/sbin","/usr/bin","/usr/sbin","/lib","/usr/lib"]:
+ newprelink.write("-l %s\n" % (x,));
+ prelink_paths = []
+ prelink_paths += specials.get("LDPATH", [])
+ prelink_paths += specials.get("PATH", [])
+ prelink_paths += specials.get("PRELINK_PATH", [])
+ prelink_path_mask = specials.get("PRELINK_PATH_MASK", [])
+ for x in prelink_paths:
+ if not x:
+ continue
+ if x[-1:] != '/':
+ x += "/"
+ plmasked = 0
+ for y in prelink_path_mask:
+ if not y:
+ continue
+ if y[-1] != '/':
+ y += "/"
+ if y == x[0:len(y)]:
+ plmasked = 1
+ break
+ if not plmasked:
+ newprelink.write("-h %s\n" % (x,))
+ for x in prelink_path_mask:
+ newprelink.write("-b %s\n" % (x,))
+ newprelink.close()
+
+ # Portage stores mtimes with 1 second granularity but in >=python-2.5 finer
+ # granularity is possible. In order to avoid the potential ambiguity of
+ # mtimes that differ by less than 1 second, sleep here if any of the
+ # directories have been modified during the current second.
+ sleep_for_mtime_granularity = False
+ current_time = long(time.time())
+ mtime_changed = False
+ lib_dirs = set()
+ for lib_dir in set(specials["LDPATH"] + \
+ ['usr/lib','usr/lib64','usr/lib32','lib','lib64','lib32']):
+ x = os.path.join(target_root, lib_dir.lstrip(os.sep))
+ try:
+ newldpathtime = os.stat(x)[stat.ST_MTIME]
+ lib_dirs.add(normalize_path(x))
+ except OSError as oe:
+ if oe.errno == errno.ENOENT:
+ try:
+ del prev_mtimes[x]
+ except KeyError:
+ pass
+ # ignore this path because it doesn't exist
+ continue
+ raise
+ if newldpathtime == current_time:
+ sleep_for_mtime_granularity = True
+ if x in prev_mtimes:
+ if prev_mtimes[x] == newldpathtime:
+ pass
+ else:
+ prev_mtimes[x] = newldpathtime
+ mtime_changed = True
+ else:
+ prev_mtimes[x] = newldpathtime
+ mtime_changed = True
+
+ if mtime_changed:
+ ld_cache_update = True
+
+ if makelinks and \
+ not ld_cache_update and \
+ contents is not None:
+ libdir_contents_changed = False
+ for mypath, mydata in contents.items():
+ if mydata[0] not in ("obj", "sym"):
+ continue
+ head, tail = os.path.split(mypath)
+ if head in lib_dirs:
+ libdir_contents_changed = True
+ break
+ if not libdir_contents_changed:
+ makelinks = False
+
+ ldconfig = "/sbin/ldconfig"
+ if "CHOST" in env and "CBUILD" in env and \
+ env["CHOST"] != env["CBUILD"]:
+ ldconfig = find_binary("%s-ldconfig" % env["CHOST"])
+
+ # Only run ldconfig as needed
+ if (ld_cache_update or makelinks) and ldconfig:
+ # ldconfig has very different behaviour between FreeBSD and Linux
+ if ostype == "Linux" or ostype.lower().endswith("gnu"):
+ # We can't update links if we haven't cleaned other versions first, as
+ # an older package installed ON TOP of a newer version will cause ldconfig
+ # to overwrite the symlinks we just made. -X means no links. After 'clean'
+ # we can safely create links.
+ writemsg_level(_(">>> Regenerating %setc/ld.so.cache...\n") % \
+ (target_root,))
+ if makelinks:
+ os.system("cd / ; %s -r '%s'" % (ldconfig, target_root))
+ else:
+ os.system("cd / ; %s -X -r '%s'" % (ldconfig, target_root))
+ elif ostype in ("FreeBSD","DragonFly"):
+ writemsg_level(_(">>> Regenerating %svar/run/ld-elf.so.hints...\n") % \
+ target_root)
+ os.system(("cd / ; %s -elf -i " + \
+ "-f '%svar/run/ld-elf.so.hints' '%setc/ld.so.conf'") % \
+ (ldconfig, target_root, target_root))
+
+ del specials["LDPATH"]
+
+ return sleep_for_mtime_granularity
+
+def writeshellprofile(target_root, env, sleep_for_mtime_granularity):
+ penvnotice = "# THIS FILE IS AUTOMATICALLY GENERATED BY env-update.\n"
+ penvnotice += "# DO NOT EDIT THIS FILE. CHANGES TO STARTUP PROFILES\n"
+ cenvnotice = penvnotice[:]
+ penvnotice += "# GO INTO " + EPREFIX + "/etc/profile NOT /etc/profile.env\n\n"
+ cenvnotice += "# GO INTO " + EPREFIX + "/etc/csh.cshrc NOT /etc/csh.env\n\n"
+
+ #create /etc/profile.env for bash support
+ outfile = atomic_ofstream(os.path.join(target_root, EPREFIX_LSTRIP, "etc", "profile.env"))
+ outfile.write(penvnotice)
+
+ env_keys = [ x for x in env if x != "LDPATH" ]
+ env_keys.sort()
+ for k in env_keys:
+ v = env[k]
+ if v.startswith('$') and not v.startswith('${'):
+ outfile.write("export %s=$'%s'\n" % (k, v[1:]))
+ else:
+ outfile.write("export %s='%s'\n" % (k, v))
+ outfile.close()
+
+ #create /etc/csh.env for (t)csh support
+ outfile = atomic_ofstream(os.path.join(target_root, EPREFIX_LSTRIP, "etc", "csh.env"))
+ outfile.write(cenvnotice)
+ for x in env_keys:
+ outfile.write("setenv %s '%s'\n" % (x, env[x]))
+ outfile.close()
+
+ if sleep_for_mtime_granularity:
+ while current_time == long(time.time()):
+ time.sleep(1)
^ permalink raw reply [relevance 99%]
Results 1-1 of 1 | reverse | options above
-- pct% links below jump to the message on this page, permalinks otherwise --
2010-02-27 19:21 99% [gentoo-commits] portage r15481 - in main/branches/prefix: bin pym/_emerge pym/portage pym/portage/dbapi pym/portage/package/ebuild pym/portage/util Fabian Groffen (grobian)
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox