public inbox for gentoo-commits@lists.gentoo.org
 help / color / mirror / Atom feed
* [gentoo-commits] portage r13714 - in main/branches/prefix: bin pym/_emerge pym/portage/dbapi
@ 2009-06-27 14:32 Fabian Groffen (grobian)
  0 siblings, 0 replies; only message in thread
From: Fabian Groffen (grobian) @ 2009-06-27 14:32 UTC (permalink / raw
  To: gentoo-commits

Author: grobian
Date: 2009-06-27 14:32:58 +0000 (Sat, 27 Jun 2009)
New Revision: 13714

Modified:
   main/branches/prefix/bin/portageq
   main/branches/prefix/bin/repoman
   main/branches/prefix/pym/_emerge/Package.py
   main/branches/prefix/pym/_emerge/Scheduler.py
   main/branches/prefix/pym/_emerge/depgraph.py
   main/branches/prefix/pym/portage/dbapi/bintree.py
   main/branches/prefix/pym/portage/dbapi/vartree.py
Log:
   Merged from trunk -r13677:13688

   | 13678   | Fix imports for _emerge submodules.                          |
   | zmedico |                                                              |
   
   | 13679   | Bug #275237 - If a directory exists in a location where a    |
   | zmedico | normal file is to be merged, generate a config-protect       |
   |         | filename for the file and merge it that way. Thanks to Jonas |
   |         | Bernoulli <jonas@bernoulli.cc> for this patch.               |
   
   | 13680   | In binarytree.inject(), when a symlink is created for the    |
   | zmedico | current package and it overwrites another package, delete    |
   |         | the corresponding metadata from the Packages file. Thanks to |
   |         | Eitan Mosenkis <eitan@mosenkis.net> for reporting.           |
   
   | 13681   | Add support to `portageq owners` for querying paths matching |
   | zmedico | a given basename. It is natural to support this since the    |
   |         | vartree already maintains a basename -> owner index anyway.  |
   |         | There are plans for the packagekit backend is to support     |
   |         | this type of search.                                         |
   
   | 13685   | Bug #275217 - Part 3 - Splits depgraph.select_files into     |
   | zmedico | select_files and _resolve. Thanks to Sebastian Mingramm      |
   |         | (few) <s.mingramm@gmx.de> for this patch.                    |
   
   | 13686   | * Make Package.metadata['USE'] access trigger USE            |
   | zmedico | calculation for unbuilt ebuilds. * Make                      |
   |         | Package.metadata['LICENSE'] access trigger USE conditional   |
   |         | evaluation. * Make Package.metadata['PROVIDE'] access        |
   |         | trigger USE conditional evaluation. * Initialize             |
   |         | Package.metadata['CHOST'] in the Package constructor for     |
   |         | unbuilt ebuilds.                                             |
   
   | 13687   | Remove obsolete Package.metadata['CHOST'] initialization.    |
   | zmedico |                                                              |
   
   | 13688   | Use depgraph._pkg() to construct Package instances inside    |
   | zmedico | _select_pkg_highest_available_imp().                         |


Modified: main/branches/prefix/bin/portageq
===================================================================
--- main/branches/prefix/bin/portageq	2009-06-27 14:31:19 UTC (rev 13713)
+++ main/branches/prefix/bin/portageq	2009-06-27 14:32:58 UTC (rev 13714)
@@ -161,8 +161,8 @@
 	Given a list of files, print the packages that own the files and which
 	files belong to each package. Files owned by a package are listed on
 	the lines below it, indented by a single tab character (\\t). All file
-	paths must start with <root>. Returns 1 if no owners could be found,
-	and 0 otherwise.
+	paths must either start with <root> or be a basename alone.
+	Returns 1 if no owners could be found, and 0 otherwise.
 	"""
 	if len(argv) < 2:
 		sys.stderr.write("ERROR: insufficient parameters!\n")
@@ -183,18 +183,22 @@
 	files = []
 	for f in argv[1:]:
 		f = portage.normalize_path(f)
-		if not f.startswith(os.path.sep):
+		is_basename = os.sep not in f
+		if not is_basename and f[:1] != os.sep:
 			if cwd is None:
 				sys.stderr.write("ERROR: cwd does not exist!\n")
 				sys.stderr.flush()
 				return 2
 			f = os.path.join(cwd, f)
 			f = portage.normalize_path(f)
-		if not f.startswith(root):
+		if not is_basename and not f.startswith(root):
 			sys.stderr.write("ERROR: file paths must begin with <root>!\n")
 			sys.stderr.flush()
 			return 2
-		files.append(f[len(root):])
+		if is_basename:
+			files.append(f)
+		else:
+			files.append(f[len(root):])
 
 	owners = vardb._owners.get_owners(files)
 

Modified: main/branches/prefix/bin/repoman
===================================================================
--- main/branches/prefix/bin/repoman	2009-06-27 14:31:19 UTC (rev 13713)
+++ main/branches/prefix/bin/repoman	2009-06-27 14:32:58 UTC (rev 13714)
@@ -48,7 +48,8 @@
 from repoman.checks import run_checks
 from repoman import utilities
 
-from _emerge import Package, RootConfig
+from _emerge.Package import Package
+from _emerge.RootConfig import RootConfig
 from portage.sets import load_default_config
 
 import portage.checksum

Modified: main/branches/prefix/pym/_emerge/Package.py
===================================================================
--- main/branches/prefix/pym/_emerge/Package.py	2009-06-27 14:31:19 UTC (rev 13713)
+++ main/branches/prefix/pym/_emerge/Package.py	2009-06-27 14:32:58 UTC (rev 13714)
@@ -11,7 +11,8 @@
 import portage
 
 from portage.cache.mappings import slot_dict_class
-
+from portage.dep import paren_reduce, use_reduce, \
+	paren_normalize, paren_enclose
 from _emerge.Task import Task
 
 class Package(Task):
@@ -22,7 +23,8 @@
 		"root_config", "type_name",
 		"category", "counter", "cp", "cpv_split",
 		"inherited", "iuse", "mtime",
-		"pf", "pv_split", "root", "slot", "slot_atom", "use")
+		"pf", "pv_split", "root", "slot", "slot_atom",) + \
+	("_use",)
 
 	metadata_keys = [
 		"CHOST", "COUNTER", "DEPEND", "EAPI",
@@ -35,6 +37,8 @@
 		Task.__init__(self, **kwargs)
 		self.root = self.root_config.root
 		self.metadata = _PackageMetadataWrapper(self, self.metadata)
+		if not self.built:
+			self.metadata['CHOST'] = self.root_config.settings.get('CHOST', '')
 		self.cp = portage.cpv_getkey(self.cpv)
 		slot = self.slot
 		if not slot:
@@ -46,13 +50,19 @@
 		self.cpv_split = portage.catpkgsplit(self.cpv)
 		self.pv_split = self.cpv_split[1:]
 
-	class _use(object):
+	class _use_class(object):
 
 		__slots__ = ("__weakref__", "enabled")
 
 		def __init__(self, use):
 			self.enabled = frozenset(use)
 
+	@property
+	def use(self):
+		if self._use is None:
+			self._use = self._use_class(self.metadata['USE'].split())
+		return self._use
+
 	class _iuse(object):
 
 		__slots__ = ("__weakref__", "all", "enabled", "disabled", "iuse_implicit", "regex", "tokens")
@@ -143,13 +153,38 @@
 
 	__slots__ = ("_pkg",)
 	_wrapped_keys = frozenset(
-		["COUNTER", "INHERITED", "IUSE", "SLOT", "USE", "_mtime_"])
+		["COUNTER", "INHERITED", "IUSE", "SLOT", "_mtime_"])
 
 	def __init__(self, pkg, metadata):
 		_PackageMetadataWrapperBase.__init__(self)
 		self._pkg = pkg
+		"""LICENSE with USE conditionals evaluated."""
+
+		if not pkg.built:
+			# USE is lazy, but we want it to show up in self.keys().
+			self['USE'] = ''
+
 		self.update(metadata)
 
+	def __getitem__(self, k):
+		v = _PackageMetadataWrapperBase.__getitem__(self, k)
+		if k in ('PROVIDE', 'LICENSE',):
+			if '?' in v:
+				v = paren_enclose(paren_normalize(use_reduce(
+					paren_reduce(v), uselist=self._pkg.use.enabled)))
+				self[k] = v
+
+		elif k == 'USE' and not self._pkg.built:
+			if not v:
+				# This is lazy because it's expensive.
+				pkgsettings = self._pkg.root_config.trees[
+					'porttree'].dbapi.doebuild_settings
+				pkgsettings.setcpv(self._pkg)
+				v = pkgsettings["PORTAGE_USE"]
+				self['USE'] = v
+
+		return v
+
 	def __setitem__(self, k, v):
 		_PackageMetadataWrapperBase.__setitem__(self, k, v)
 		if k in self._wrapped_keys:
@@ -167,9 +202,6 @@
 	def _set_slot(self, k, v):
 		self._pkg.slot = v
 
-	def _set_use(self, k, v):
-		self._pkg.use = self._pkg._use(v.split())
-
 	def _set_counter(self, k, v):
 		if isinstance(v, basestring):
 			try:

Modified: main/branches/prefix/pym/_emerge/Scheduler.py
===================================================================
--- main/branches/prefix/pym/_emerge/Scheduler.py	2009-06-27 14:31:19 UTC (rev 13713)
+++ main/branches/prefix/pym/_emerge/Scheduler.py	2009-06-27 14:32:58 UTC (rev 13714)
@@ -1627,12 +1627,6 @@
 		db_keys = list(self.trees[root_config.root][
 			tree_type].dbapi._aux_cache_keys)
 		metadata = izip(db_keys, db.aux_get(cpv, db_keys))
-		pkg = Package(cpv=cpv, metadata=metadata,
+		return Package(built=(type_name != 'ebuild'),
+			cpv=cpv, metadata=metadata,
 			root_config=root_config, installed=installed)
-		if type_name == "ebuild":
-			settings = self.pkgsettings[root_config.root]
-			settings.setcpv(pkg)
-			pkg.metadata["USE"] = settings["PORTAGE_USE"]
-			pkg.metadata['CHOST'] = settings.get('CHOST', '')
-
-		return pkg

Modified: main/branches/prefix/pym/_emerge/depgraph.py
===================================================================
--- main/branches/prefix/pym/_emerge/depgraph.py	2009-06-27 14:31:19 UTC (rev 13713)
+++ main/branches/prefix/pym/_emerge/depgraph.py	2009-06-27 14:32:58 UTC (rev 13714)
@@ -176,6 +176,8 @@
 					"--getbinpkgonly" in self.myopts)
 		del trees
 
+		#contains the args created by select_files
+		self._initial_arg_list = []
 		self.digraph=portage.digraph()
 		# contains all sets added to the graph
 		self._sets = {}
@@ -1067,7 +1069,8 @@
 				yield arg, atom
 
 	def select_files(self, myfiles):
-		"""Given a list of .tbz2s, .ebuilds sets, and deps, create the
+		"""Given a list of .tbz2s, .ebuilds sets, and deps, populate
+		self._initial_arg_list and call self._resolve to create the 
 		appropriate depgraph and return a favorite list."""
 		debug = "--debug" in self.myopts
 		root_config = self.roots[self.target_root]
@@ -1146,9 +1149,6 @@
 				metadata = izip(db_keys, portdb.aux_get(mykey, db_keys))
 				pkg = Package(type_name="ebuild", root_config=root_config,
 					cpv=mykey, metadata=metadata, onlydeps=onlydeps)
-				pkgsettings.setcpv(pkg)
-				pkg.metadata["USE"] = pkgsettings["PORTAGE_USE"]
-				pkg.metadata['CHOST'] = pkgsettings.get('CHOST', '')
 				self._pkg_cache[pkg] = pkg
 				args.append(PackageArg(arg=x, package=pkg,
 					root_config=root_config))
@@ -1325,14 +1325,25 @@
 				myfavorites.add(arg.arg)
 		myfavorites = list(myfavorites)
 
-		pprovideddict = pkgsettings.pprovideddict
 		if debug:
 			portage.writemsg("\n", noiselevel=-1)
 		# Order needs to be preserved since a feature of --nodeps
 		# is to allow the user to force a specific merge order.
 		args.reverse()
-		while args:
-			arg = args.pop()
+		self._initial_arg_list = args[:]
+	
+		return self._resolve(myfavorites)
+	
+	def _resolve(self, myfavorites):
+		"""Given self._initial_arg_list, pull in the root nodes, 
+		call self._creategraph to process theier deps and return 
+		a favorite list."""
+		debug = "--debug" in self.myopts
+		onlydeps = "--onlydeps" in self.myopts
+		myroot = self.target_root
+		pkgsettings = self.pkgsettings[myroot]
+		pprovideddict = pkgsettings.pprovideddict
+		for arg in self._initial_arg_list:
 			for atom in arg.set:
 				self.spinner.update()
 				dep = Dependency(atom=atom, onlydeps=onlydeps,
@@ -1866,9 +1877,7 @@
 
 				if not cpv_list:
 					continue
-				pkg_status = "merge"
-				if installed or onlydeps:
-					pkg_status = "nomerge"
+
 				# descending order
 				cpv_list.reverse()
 				for cpv in cpv_list:
@@ -1880,31 +1889,11 @@
 						# in case there is a visible downgrade.
 						continue
 					reinstall_for_flags = None
-					cache_key = (pkg_type, root, cpv, pkg_status)
-					calculated_use = True
-					pkg = self._pkg_cache.get(cache_key)
-					if pkg is None:
-						calculated_use = False
-						try:
-							metadata = izip(db_keys, db.aux_get(cpv, db_keys))
-						except KeyError:
-							continue
-						pkg = Package(built=built, cpv=cpv,
-							installed=installed, metadata=metadata,
-							onlydeps=onlydeps, root_config=root_config,
-							type_name=pkg_type)
-						metadata = pkg.metadata
-						if not built:
-							metadata['CHOST'] = pkgsettings.get('CHOST', '')
-						if not built and ("?" in metadata["LICENSE"] or \
-							"?" in metadata["PROVIDE"]):
-							# This is avoided whenever possible because
-							# it's expensive. It only needs to be done here
-							# if it has an effect on visibility.
-							pkgsettings.setcpv(pkg)
-							metadata["USE"] = pkgsettings["PORTAGE_USE"]
-							calculated_use = True
-						self._pkg_cache[pkg] = pkg
+					try:
+						pkg = self._pkg(cpv, pkg_type, root_config,
+							installed=installed, onlydeps=onlydeps)
+					except portage.exception.PackageNotFound:
+						continue
 
 					if not installed or (built and matched_packages):
 						# Only enforce visibility on installed packages
@@ -1955,11 +1944,9 @@
 										if not visible(pkgsettings, pkg_eb):
 											continue
 
-					if not pkg.built and not calculated_use:
-						# This is avoided whenever possible because
-						# it's expensive.
-						pkgsettings.setcpv(pkg)
-						pkg.metadata["USE"] = pkgsettings["PORTAGE_USE"]
+					# Calculation of USE for unbuilt ebuilds is relatively
+					# expensive, so it is only performed lazily, after the
+					# above visibility checks are complete.
 
 					if pkg.cp != atom.cp:
 						# A cpv can be returned from dbapi.match() as an
@@ -1972,8 +1959,6 @@
 					myarg = None
 					if root == self.target_root:
 						try:
-							# Ebuild USE must have been calculated prior
-							# to this point, in case atoms have USE deps.
 							myarg = self._iter_atoms_for_pkg(pkg).next()
 						except StopIteration:
 							pass
@@ -2202,18 +2187,24 @@
 					return 0
 		return 1
 
-	def _pkg(self, cpv, type_name, root_config, installed=False):
+	def _pkg(self, cpv, type_name, root_config, installed=False, 
+		onlydeps=False):
 		"""
 		Get a package instance from the cache, or create a new
-		one if necessary. Raises KeyError from aux_get if it
+		one if necessary. Raises PackageNotFound from aux_get if it
 		failures for some reason (package does not exist or is
 		corrupt).
 		"""
 		operation = "merge"
-		if installed:
+		if installed or onlydeps:
 			operation = "nomerge"
 		pkg = self._pkg_cache.get(
 			(type_name, root_config.root, cpv, operation))
+		if pkg is None and onlydeps and not installed:
+			# Maybe it already got pulled in as a "merge" node.
+			pkg = self.mydbapi[root_config.root].get(
+				(type_name, root_config.root, cpv, 'merge'))
+
 		if pkg is None:
 			tree_type = self.pkg_tree_map[type_name]
 			db = root_config.trees[tree_type].dbapi
@@ -2223,13 +2214,9 @@
 				metadata = izip(db_keys, db.aux_get(cpv, db_keys))
 			except KeyError:
 				raise portage.exception.PackageNotFound(cpv)
-			pkg = Package(cpv=cpv, metadata=metadata,
-				root_config=root_config, installed=installed)
-			if type_name == "ebuild":
-				settings = self.pkgsettings[root_config.root]
-				settings.setcpv(pkg)
-				pkg.metadata["USE"] = settings["PORTAGE_USE"]
-				pkg.metadata['CHOST'] = settings.get('CHOST', '')
+			pkg = Package(built=(type_name != "ebuild"), cpv=cpv,
+				installed=installed, metadata=metadata,
+				root_config=root_config, type_name=type_name)
 			self._pkg_cache[pkg] = pkg
 		return pkg
 
@@ -4369,11 +4356,6 @@
 				installed=installed, metadata=metadata,
 				operation=action, root_config=root_config,
 				type_name=pkg_type)
-			if pkg_type == "ebuild":
-				pkgsettings = self.pkgsettings[myroot]
-				pkgsettings.setcpv(pkg)
-				pkg.metadata["USE"] = pkgsettings["PORTAGE_USE"]
-				pkg.metadata['CHOST'] = pkgsettings.get('CHOST', '')
 			self._pkg_cache[pkg] = pkg
 
 			root_config = self.roots[pkg.root]
@@ -4815,10 +4797,7 @@
 			db.aux_get(cpv, db_keys)))
 	except KeyError:
 		metadata = None
-	if metadata and not built:
-		pkgsettings.setcpv(cpv, mydb=metadata)
-		metadata["USE"] = pkgsettings["PORTAGE_USE"]
-		metadata['CHOST'] = pkgsettings.get('CHOST', '')
+
 	if metadata is None:
 		mreasons = ["corruption"]
 	else:

Modified: main/branches/prefix/pym/portage/dbapi/bintree.py
===================================================================
--- main/branches/prefix/pym/portage/dbapi/bintree.py	2009-06-27 14:31:19 UTC (rev 13713)
+++ main/branches/prefix/pym/portage/dbapi/bintree.py	2009-06-27 14:32:58 UTC (rev 13714)
@@ -836,6 +836,7 @@
 		# process) and then updated it, all while holding a lock.
 		from portage.locks import lockfile, unlockfile
 		pkgindex_lock = None
+		created_symlink = False
 		try:
 			pkgindex_lock = lockfile(self._pkgindex_file,
 				wantnewlockfile=1)
@@ -846,6 +847,7 @@
 			if self._all_directory and \
 				self.getname(cpv).split(os.path.sep)[-2] == "All":
 				self._create_symlink(cpv)
+				created_symlink = True
 			pkgindex = self._new_pkgindex()
 			try:
 				f = open(self._pkgindex_file)
@@ -877,8 +879,14 @@
 					# Handle path collisions in $PKGDIR/All
 					# when CPV is not identical.
 					del pkgindex.packages[i]
-				elif cpv == d2.get("CPV") and path == d2.get("PATH", ""):
-					del pkgindex.packages[i]
+				elif cpv == d2.get("CPV"):
+					if path == d2.get("PATH", ""):
+						del pkgindex.packages[i]
+					elif created_symlink and not d2.get("PATH", ""):
+						# Delete entry for the package that was just
+						# overwritten by a symlink to this package.
+						del pkgindex.packages[i]
+
 			pkgindex.packages.append(d)
 
 			self._update_pkgindex_header(pkgindex.header)

Modified: main/branches/prefix/pym/portage/dbapi/vartree.py
===================================================================
--- main/branches/prefix/pym/portage/dbapi/vartree.py	2009-06-27 14:31:19 UTC (rev 13713)
+++ main/branches/prefix/pym/portage/dbapi/vartree.py	2009-06-27 14:32:58 UTC (rev 13714)
@@ -2053,7 +2053,12 @@
 				return x
 
 			for path in path_iter:
-				name = os.path.basename(path.rstrip(os.path.sep))
+				is_basename = os.sep != path[:1]
+				if is_basename:
+					name = path
+				else:
+					name = os.path.basename(path.rstrip(os.path.sep))
+
 				if not name:
 					continue
 
@@ -2074,9 +2079,15 @@
 
 						if current_hash != hash_value:
 							continue
-						if dblink(cpv).isowner(path, root):
-							yield dblink(cpv), path
 
+						if is_basename:
+							for p in dblink(cpv).getcontents():
+								if os.path.basename(p) == name:
+									yield dblink(cpv), p[len(root):]
+						else:
+							if dblink(cpv).isowner(path, root):
+								yield dblink(cpv), path
+
 class vartree(object):
 	"this tree will scan a var/db/pkg database located at root (passed to init)"
 	def __init__(self, root="/", virtual=None, clone=None, categories=None,
@@ -4357,7 +4368,7 @@
 					# destination file exists
 					if stat.S_ISDIR(mydmode):
 						# install of destination is blocked by an existing directory with the same name
-						moveme = 0
+						cfgprot = 1
 						showMessage("!!! %s\n" % mydest,
 							level=logging.ERROR, noiselevel=-1)
 					elif stat.S_ISREG(mydmode) or (stat.S_ISLNK(mydmode) and os.path.exists(mydest) and stat.S_ISREG(os.stat(mydest)[stat.ST_MODE])):
@@ -4392,8 +4403,8 @@
 								"""A previously remembered update has been
 								accepted, so it is removed from confmem."""
 								del cfgfiledict[myrealdest]
-						if cfgprot:
-							mydest = new_protect_filename(mydest, newmd5=mymd5)
+					if cfgprot:
+						mydest = new_protect_filename(mydest, newmd5=mymd5)
 
 				# whether config protection or not, we merge the new file the
 				# same way.  Unless moveme=0 (blocking directory)




^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2009-06-27 14:33 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-06-27 14:32 [gentoo-commits] portage r13714 - in main/branches/prefix: bin pym/_emerge pym/portage/dbapi 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