public inbox for gentoo-commits@lists.gentoo.org
 help / color / mirror / Atom feed
* [gentoo-commits] proj/portage:master commit in: pym/portage/package/ebuild/, pym/portage/dbapi/, pym/portage/, pym/_emerge/
@ 2012-08-22  4:01 Zac Medico
  0 siblings, 0 replies; 2+ messages in thread
From: Zac Medico @ 2012-08-22  4:01 UTC (permalink / raw
  To: gentoo-commits

commit:     a3185709c7e6fa576ffddac59a9b4ff7e5243e6b
Author:     Zac Medico <zmedico <AT> gentoo <DOT> org>
AuthorDate: Wed Aug 22 04:01:24 2012 +0000
Commit:     Zac Medico <zmedico <AT> gentoo <DOT> org>
CommitDate: Wed Aug 22 04:01:24 2012 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=a3185709

_apply_hash_filter: make hash_filter simpler

Now any callable object will work, which might be helpful for
consumers of the Manifest.checkFileHashes() method.

---
 pym/_emerge/EbuildFetcher.py              |    2 ++
 pym/portage/checksum.py                   |    8 ++++++--
 pym/portage/dbapi/bintree.py              |    3 ++-
 pym/portage/package/ebuild/digestcheck.py |    2 ++
 pym/portage/package/ebuild/fetch.py       |    8 ++++++--
 5 files changed, 18 insertions(+), 5 deletions(-)

diff --git a/pym/_emerge/EbuildFetcher.py b/pym/_emerge/EbuildFetcher.py
index bbcb6a9..2d9635a 100644
--- a/pym/_emerge/EbuildFetcher.py
+++ b/pym/_emerge/EbuildFetcher.py
@@ -59,6 +59,8 @@ class EbuildFetcher(SpawnProcess):
 				return False
 
 		hash_filter = _hash_filter(settings.get("PORTAGE_CHECKSUM_FILTER", ""))
+		if hash_filter.transparent:
+			hash_filter = None
 		stdout_orig = sys.stdout
 		stderr_orig = sys.stderr
 		global_havecolor = portage.output.havecolor

diff --git a/pym/portage/checksum.py b/pym/portage/checksum.py
index de4cc66..144e633 100644
--- a/pym/portage/checksum.py
+++ b/pym/portage/checksum.py
@@ -250,9 +250,13 @@ def _apply_hash_filter(digests, hash_filter):
 	dict if no changes are necessary. This will always preserve at
 	at least one digest, in order to ensure that they are not all
 	discarded.
+	@param digests: dictionary of digests
+	@type digests: dict
+	@param hash_filter: A callable that takes a single hash name
+		argument, and returns True if the hash is to be used or
+		False otherwise
+	@type hash_filter: callable
 	"""
-	if hash_filter.transparent:
-		return digests
 
 	verifiable_hash_types = set(digests).intersection(hashfunc_map)
 	verifiable_hash_types.discard("size")

diff --git a/pym/portage/dbapi/bintree.py b/pym/portage/dbapi/bintree.py
index a2fd5ea..7f09436 100644
--- a/pym/portage/dbapi/bintree.py
+++ b/pym/portage/dbapi/bintree.py
@@ -1465,7 +1465,8 @@ class binarytree(object):
 
 		hash_filter = _hash_filter(
 			self.settings.get("PORTAGE_CHECKSUM_FILTER", ""))
-		digests = _apply_hash_filter(digests, hash_filter)
+		if not hash_filter.transparent:
+			digests = _apply_hash_filter(digests, hash_filter)
 		eout = EOutput()
 		eout.quiet = self.settings.get("PORTAGE_QUIET") == "1"
 		ok, st = _check_distfile(pkg_path, digests, eout, show_errors=0)

diff --git a/pym/portage/package/ebuild/digestcheck.py b/pym/portage/package/ebuild/digestcheck.py
index 1d59948..e207ba8 100644
--- a/pym/portage/package/ebuild/digestcheck.py
+++ b/pym/portage/package/ebuild/digestcheck.py
@@ -30,6 +30,8 @@ def digestcheck(myfiles, mysettings, strict=False, justmanifest=None, mf=None):
 		return 1
 	pkgdir = mysettings["O"]
 	hash_filter = _hash_filter(mysettings.get("PORTAGE_CHECKSUM_FILTER", ""))
+	if hash_filter.transparent:
+		hash_filter = None
 	if mf is None:
 		mf = mysettings.repositories.get_repo_for_location(
 			os.path.dirname(os.path.dirname(pkgdir)))

diff --git a/pym/portage/package/ebuild/fetch.py b/pym/portage/package/ebuild/fetch.py
index 8365ad2..576a912 100644
--- a/pym/portage/package/ebuild/fetch.py
+++ b/pym/portage/package/ebuild/fetch.py
@@ -358,6 +358,8 @@ def fetch(myuris, mysettings, listonly=0, fetchonly=0,
 			mymirrors += [x.rstrip("/") for x in mysettings["GENTOO_MIRRORS"].split() if x]
 
 	hash_filter = _hash_filter(mysettings.get("PORTAGE_CHECKSUM_FILTER", ""))
+	if hash_filter.transparent:
+		hash_filter = None
 	skip_manifest = mysettings.get("EBUILD_SKIP_MANIFEST") == "1"
 	if skip_manifest:
 		allow_missing_digests = True
@@ -799,7 +801,8 @@ def fetch(myuris, mysettings, listonly=0, fetchonly=0,
 							continue
 						else:
 							digests = _filter_unaccelarated_hashes(mydigests[myfile])
-							digests = _apply_hash_filter(digests, hash_filter)
+							if hash_filter is not None:
+								digests = _apply_hash_filter(digests, hash_filter)
 							verified_ok, reason = verify_all(myfile_path, digests)
 							if not verified_ok:
 								writemsg(_("!!! Previously fetched"
@@ -1057,7 +1060,8 @@ def fetch(myuris, mysettings, listonly=0, fetchonly=0,
 								# net connection. This way we have a chance to try to download
 								# from another mirror...
 								digests = _filter_unaccelarated_hashes(mydigests[myfile])
-								digests = _apply_hash_filter(digests, hash_filter)
+								if hash_filter is not None:
+									digests = _apply_hash_filter(digests, hash_filter)
 								verified_ok, reason = verify_all(myfile_path, digests)
 								if not verified_ok:
 									writemsg(_("!!! Fetched file: %s VERIFY FAILED!\n") % myfile,


^ permalink raw reply related	[flat|nested] 2+ messages in thread

* [gentoo-commits] proj/portage:master commit in: pym/portage/package/ebuild/, pym/portage/dbapi/, pym/portage/, pym/_emerge/
@ 2012-08-29  7:38 Zac Medico
  0 siblings, 0 replies; 2+ messages in thread
From: Zac Medico @ 2012-08-29  7:38 UTC (permalink / raw
  To: gentoo-commits

commit:     f76b983e95d022d6f377e3efd599dd8efbd30b3d
Author:     Zac Medico <zmedico <AT> gentoo <DOT> org>
AuthorDate: Wed Aug 29 07:38:12 2012 +0000
Commit:     Zac Medico <zmedico <AT> gentoo <DOT> org>
CommitDate: Wed Aug 29 07:38:12 2012 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=f76b983e

EAPI 5: Profile IUSE injection

See bug #176467 and the PMS patch:
http://git.overlays.gentoo.org/gitweb/?p=proj/pms.git;a=commit;h=d9040ab3482af5f790368bac5d053bf1cd760ba8

---
 pym/_emerge/Package.py                 |   13 +++--
 pym/portage/const.py                   |    4 +-
 pym/portage/dbapi/__init__.py          |    9 +++-
 pym/portage/dbapi/_expand_new_virt.py  |   10 +++-
 pym/portage/eapi.py                    |    6 ++-
 pym/portage/package/ebuild/config.py   |   93 ++++++++++++++++++++++++++++++--
 pym/portage/package/ebuild/doebuild.py |    8 ++-
 7 files changed, 125 insertions(+), 18 deletions(-)

diff --git a/pym/_emerge/Package.py b/pym/_emerge/Package.py
index 0da374a..ce51a8b 100644
--- a/pym/_emerge/Package.py
+++ b/pym/_emerge/Package.py
@@ -64,6 +64,13 @@ class Package(Task):
 		self.slot_abi = self.cpv.slot_abi
 		# sync metadata with validated repo (may be UNKNOWN_REPO)
 		self.metadata['repository'] = self.cpv.repo
+
+		if eapi_attrs.iuse_effective:
+			implicit_match = self.root_config.settings._iuse_effective_match
+		else:
+			implicit_match = self.root_config.settings._iuse_implicit_match
+		self.iuse = self._iuse(self.metadata["IUSE"].split(), implicit_match)
+
 		if (self.iuse.enabled or self.iuse.disabled) and \
 			not eapi_attrs.iuse_defaults:
 			if not self.installed:
@@ -615,7 +622,7 @@ class _PackageMetadataWrapper(_PackageMetadataWrapperBase):
 
 	__slots__ = ("_pkg",)
 	_wrapped_keys = frozenset(
-		["COUNTER", "INHERITED", "IUSE", "USE", "_mtime_"])
+		["COUNTER", "INHERITED", "USE", "_mtime_"])
 	_use_conditional_keys = frozenset(
 		['LICENSE', 'PROPERTIES', 'PROVIDE', 'RESTRICT',])
 
@@ -684,10 +691,6 @@ class _PackageMetadataWrapper(_PackageMetadataWrapperBase):
 			v = frozenset(v.split())
 		self._pkg.inherited = v
 
-	def _set_iuse(self, k, v):
-		self._pkg.iuse = self._pkg._iuse(
-			v.split(), self._pkg.root_config.settings._iuse_implicit_match)
-
 	def _set_counter(self, k, v):
 		if isinstance(v, basestring):
 			try:

diff --git a/pym/portage/const.py b/pym/portage/const.py
index c2049f8..6dffc5d 100644
--- a/pym/portage/const.py
+++ b/pym/portage/const.py
@@ -79,8 +79,10 @@ OS_HEADERS_PACKAGE_ATOM  = "virtual/os-headers"
 INCREMENTALS             = ("USE", "USE_EXPAND", "USE_EXPAND_HIDDEN",
                            "FEATURES", "ACCEPT_KEYWORDS",
                            "CONFIG_PROTECT_MASK", "CONFIG_PROTECT",
+                           "IUSE_IMPLICIT",
                            "PRELINK_PATH", "PRELINK_PATH_MASK",
-                           "PROFILE_ONLY_VARIABLES")
+                           "PROFILE_ONLY_VARIABLES",
+                           "USE_EXPAND_IMPLICIT", "USE_EXPAND_UNPREFIXED")
 EBUILD_PHASES            = ("pretend", "setup", "unpack", "prepare", "configure",
                            "compile", "test", "install",
                            "package", "preinst", "postinst","prerm", "postrm",

diff --git a/pym/portage/dbapi/__init__.py b/pym/portage/dbapi/__init__.py
index 97b4255..f326e68 100644
--- a/pym/portage/dbapi/__init__.py
+++ b/pym/portage/dbapi/__init__.py
@@ -16,6 +16,7 @@ portage.proxy.lazyimport.lazyimport(globals(),
 
 from portage import os
 from portage import auxdbkeys
+from portage.eapi import _get_eapi_attrs
 from portage.exception import InvalidData
 from portage.localization import _
 
@@ -181,7 +182,7 @@ class dbapi(object):
 		2) Check enabled/disabled flag states.
 		"""
 
-		aux_keys = ["IUSE", "KEYWORDS", "SLOT", "USE", "repository"]
+		aux_keys = ["EAPI", "IUSE", "KEYWORDS", "SLOT", "USE", "repository"]
 		for cpv in cpv_iter:
 			try:
 				metadata = dict(zip(aux_keys,
@@ -195,7 +196,11 @@ class dbapi(object):
 			yield cpv
 
 	def _match_use(self, atom, cpv, metadata):
-		iuse_implicit_match = self.settings._iuse_implicit_match
+		eapi_attrs = _get_eapi_attrs(metadata["EAPI"])
+		if eapi_attrs.iuse_effective:
+			iuse_implicit_match = self.settings._iuse_effective_match
+		else:
+			iuse_implicit_match = self.settings._iuse_implicit_match
 		iuse = frozenset(x.lstrip('+-') for x in metadata["IUSE"].split())
 
 		for x in atom.unevaluated_atom.use.required:

diff --git a/pym/portage/dbapi/_expand_new_virt.py b/pym/portage/dbapi/_expand_new_virt.py
index d379b4c..95b2c28 100644
--- a/pym/portage/dbapi/_expand_new_virt.py
+++ b/pym/portage/dbapi/_expand_new_virt.py
@@ -1,8 +1,9 @@
-# Copyright 2011 Gentoo Foundation
+# Copyright 2011-2012 Gentoo Foundation
 # Distributed under the terms of the GNU General Public License v2
 
 import portage
 from portage.dep import Atom, _get_useflag_re
+from portage.eapi import _get_eapi_attrs
 
 def expand_new_virt(vardb, atom):
 	"""
@@ -44,6 +45,7 @@ def expand_new_virt(vardb, atom):
 			yield atom
 			continue
 
+		eapi_attrs = _get_eapi_attrs(eapi)
 		# Validate IUSE and IUSE, for early detection of vardb corruption.
 		useflag_re = _get_useflag_re(eapi)
 		valid_iuse = []
@@ -54,7 +56,11 @@ def expand_new_virt(vardb, atom):
 				valid_iuse.append(x)
 		valid_iuse = frozenset(valid_iuse)
 
-		iuse_implicit_match = vardb.settings._iuse_implicit_match
+		if eapi_attrs.iuse_effective:
+			iuse_implicit_match = vardb.settings._iuse_effective_match
+		else:
+			iuse_implicit_match = vardb.settings._iuse_implicit_match
+
 		valid_use = []
 		for x in use.split():
 			if x in valid_iuse or iuse_implicit_match(x):

diff --git a/pym/portage/eapi.py b/pym/portage/eapi.py
index b701d02..00ce2a5 100644
--- a/pym/portage/eapi.py
+++ b/pym/portage/eapi.py
@@ -8,6 +8,9 @@ from portage import eapi_is_supported
 def eapi_has_iuse_defaults(eapi):
 	return eapi != "0"
 
+def eapi_has_iuse_effective(eapi):
+	return eapi not in ("0", "1", "2", "3", "4", "4-python", "4-slot-abi")
+
 def eapi_has_slot_deps(eapi):
 	return eapi != "0"
 
@@ -72,7 +75,7 @@ def eapi_allows_dots_in_use_flags(eapi):
 	return eapi in ("4-python",)
 
 _eapi_attrs = collections.namedtuple('_eapi_attrs',
-	'dots_in_PN dots_in_use_flags iuse_defaults '
+	'dots_in_PN dots_in_use_flags iuse_defaults iuse_effective '
 	'repo_deps required_use required_use_at_most_one_of slot_abi slot_deps '
 	'src_uri_arrows strong_blocks use_deps use_dep_defaults')
 
@@ -98,6 +101,7 @@ def _get_eapi_attrs(eapi):
 		dots_in_PN = (eapi is None or eapi_allows_dots_in_PN(eapi)),
 		dots_in_use_flags = (eapi is None or eapi_allows_dots_in_use_flags(eapi)),
 		iuse_defaults = (eapi is None or eapi_has_iuse_defaults(eapi)),
+		iuse_effective = (eapi is not None and eapi_has_iuse_effective(eapi)),
 		repo_deps = (eapi is None or eapi_has_repo_deps(eapi)),
 		required_use = (eapi is None or eapi_has_required_use(eapi)),
 		required_use_at_most_one_of = (eapi is None or eapi_has_required_use_at_most_one_of(eapi)),

diff --git a/pym/portage/package/ebuild/config.py b/pym/portage/package/ebuild/config.py
index 871831f..6a9ed08 100644
--- a/pym/portage/package/ebuild/config.py
+++ b/pym/portage/package/ebuild/config.py
@@ -32,7 +32,7 @@ from portage.dbapi.porttree import portdbapi
 from portage.dbapi.vartree import vartree
 from portage.dep import Atom, isvalidatom, match_from_list, use_reduce, _repo_separator, _slot_separator
 from portage.eapi import eapi_exports_AA, eapi_exports_merge_type, \
-	eapi_supports_prefix, eapi_exports_replace_vars
+	eapi_supports_prefix, eapi_exports_replace_vars, _get_eapi_attrs
 from portage.env.loaders import KeyValuePairFileLoader
 from portage.exception import InvalidDependString, PortageException
 from portage.localization import _
@@ -215,6 +215,7 @@ class config(object):
 			self.profiles = clone.profiles
 			self.packages = clone.packages
 			self.repositories = clone.repositories
+			self._iuse_effective = clone._iuse_effective
 			self._iuse_implicit_match = clone._iuse_implicit_match
 			self._non_user_variables = clone._non_user_variables
 			self._env_d_blacklist = clone._env_d_blacklist
@@ -793,6 +794,7 @@ class config(object):
 			if bsd_chflags:
 				self.features.add('chflags')
 
+			self._iuse_effective = self._calc_iuse_effective()
 			self._iuse_implicit_match = _iuse_implicit_match_cache(self)
 
 			self._validate_commands()
@@ -1251,6 +1253,7 @@ class config(object):
 		pkg_configdict["CATEGORY"] = cat
 		pkg_configdict["PF"] = pf
 		repository = None
+		eapi = None
 		if mydb:
 			if not hasattr(mydb, "aux_get"):
 				for k in aux_keys:
@@ -1277,6 +1280,7 @@ class config(object):
 					# Empty USE means this dbapi instance does not contain
 					# built packages.
 					built_use = None
+			eapi = pkg_configdict['EAPI']
 
 			repository = pkg_configdict.pop("repository", None)
 			if repository is not None:
@@ -1295,6 +1299,9 @@ class config(object):
 				elif x.startswith("-"):
 					pkginternaluse.append(x)
 			pkginternaluse = " ".join(pkginternaluse)
+
+		eapi_attrs = _get_eapi_attrs(eapi)
+
 		if pkginternaluse != self.configdict["pkginternal"].get("USE", ""):
 			self.configdict["pkginternal"]["USE"] = pkginternaluse
 			has_changed = True
@@ -1434,9 +1441,17 @@ class config(object):
 		use = set(self["USE"].split())
 		if explicit_iuse is None:
 			explicit_iuse = frozenset(x.lstrip("+-") for x in iuse.split())
-		iuse_implicit_match = self._iuse_implicit_match
-		portage_iuse = self._get_implicit_iuse()
-		portage_iuse.update(explicit_iuse)
+
+		if eapi_attrs.iuse_effective:
+			iuse_implicit_match = self._iuse_effective_match
+			portage_iuse = set(self._iuse_effective)
+			portage_iuse.update(explicit_iuse)
+			self.configdict["pkg"]["IUSE_EFFECTIVE"] = \
+				" ".join(sorted(portage_iuse))
+		else:
+			iuse_implicit_match = self._iuse_implicit_match
+			portage_iuse = self._get_implicit_iuse()
+			portage_iuse.update(explicit_iuse)
 
 		# PORTAGE_IUSE is not always needed so it's lazily evaluated.
 		self.configdict["env"].addLazySingleton(
@@ -1501,6 +1516,14 @@ class config(object):
 			self.configdict['env'].addLazySingleton(k,
 				lazy_use_expand.__getitem__, k)
 
+		for k in self.get("USE_EXPAND_UNPREFIXED", "").split():
+			var_split = self.get(k, '').split()
+			var_split = [ x for x in var_split if x in use ]
+			if var_split:
+				self.configlist[-1][k] = ' '.join(var_split)
+			elif k in self:
+				self.configlist[-1][k] = ''
+
 		# Filtered for the ebuild environment. Store this in a separate
 		# attribute since we still want to be able to see global USE
 		# settings for things like emerge --info.
@@ -1545,9 +1568,42 @@ class config(object):
 					else:
 						container[k] = v
 
+	def _iuse_effective_match(self, flag):
+		return flag in self._iuse_effective
+
+	def _calc_iuse_effective(self):
+		"""
+		Beginning with EAPI 5, IUSE_EFFECTIVE is defined by PMS.
+		"""
+		iuse_effective = []
+		iuse_effective.extend(self.get("IUSE_IMPLICIT", "").split())
+
+		# USE_EXPAND_IMPLICIT should contain things like ARCH, ELIBC,
+		# KERNEL, and USERLAND.
+		use_expand_implicit = frozenset(
+			self.get("USE_EXPAND_IMPLICIT", "").split())
+
+		# USE_EXPAND_UNPREFIXED should contain at least ARCH, and
+		# USE_EXPAND_VALUES_ARCH should contain all valid ARCH flags.
+		for v in self.get("USE_EXPAND_UNPREFIXED", "").split():
+			if v not in use_expand_implicit:
+				continue
+			iuse_effective.extend(
+				self.get("USE_EXPAND_VALUES_" + v, "").split())
+
+		use_expand = frozenset(self.get("USE_EXPAND", "").split())
+		for v in use_expand_implicit:
+			if v not in use_expand:
+				continue
+			lower_v = v.lower()
+			for x in self.get("USE_EXPAND_VALUES_" + v, "").split():
+				iuse_effective.append(lower_v + "_" + x)
+
+		return frozenset(iuse_effective)
+
 	def _get_implicit_iuse(self):
 		"""
-		Some flags are considered to
+		Prior to EAPI 5, these flags are considered to
 		be implicit members of IUSE:
 		  * Flags derived from ARCH
 		  * Flags derived from USE_EXPAND_HIDDEN variables
@@ -2005,6 +2061,8 @@ class config(object):
 			if v is not None:
 				use_expand_dict[k] = v
 
+		use_expand_unprefixed = self.get("USE_EXPAND_UNPREFIXED", "").split()
+
 		# In order to best accomodate the long-standing practice of
 		# setting default USE_EXPAND variables in the profile's
 		# make.defaults, we translate these variables into their
@@ -2018,6 +2076,12 @@ class config(object):
 					continue
 				use = cfg.get("USE", "")
 				expand_use = []
+
+				for k in use_expand_unprefixed:
+					v = cfg.get(k)
+					if v is not None:
+						expand_use.extend(v.split())
+
 				for k in use_expand_dict:
 					v = cfg.get(k)
 					if v is None:
@@ -2055,6 +2119,17 @@ class config(object):
 			iuse = [x.lstrip("+-") for x in iuse.split()]
 		myflags = set()
 		for curdb in self.uvlist:
+
+			for k in use_expand_unprefixed:
+				v = curdb.get(k)
+				if v is None:
+					continue
+				for x in v.split():
+					if x[:1] == "-":
+						myflags.discard(x[1:])
+					else:
+						myflags.add(x)
+
 			cur_use_expand = [x for x in use_expand if x in curdb]
 			mysplit = curdb.get("USE", "").split()
 			if not mysplit and not cur_use_expand:
@@ -2171,6 +2246,14 @@ class config(object):
 				elif k in self:
 					self.configlist[-1][k] = ''
 
+			for k in use_expand_unprefixed:
+				var_split = self.get(k, '').split()
+				var_split = [ x for x in var_split if x in myflags ]
+				if var_split:
+					self.configlist[-1][k] = ' '.join(var_split)
+				elif k in self:
+					self.configlist[-1][k] = ''
+
 	@property
 	def virts_p(self):
 		warnings.warn("portage config.virts_p attribute " + \

diff --git a/pym/portage/package/ebuild/doebuild.py b/pym/portage/package/ebuild/doebuild.py
index 6e7e63c..3ba8ebd 100644
--- a/pym/portage/package/ebuild/doebuild.py
+++ b/pym/portage/package/ebuild/doebuild.py
@@ -1638,8 +1638,12 @@ def _post_src_install_write_metadata(settings):
 
 	build_info_dir = os.path.join(settings['PORTAGE_BUILDDIR'], 'build-info')
 
-	for k in ('IUSE',):
-		v = settings.get(k)
+	metadata_keys = ['IUSE']
+	if eapi_attrs.iuse_effective:
+		metadata_keys.append('IUSE_EFFECTIVE')
+
+	for k in metadata_keys:
+		v = settings.configdict['pkg'].get(k)
 		if v is not None:
 			write_atomic(os.path.join(build_info_dir, k), v + '\n')
 


^ permalink raw reply related	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2012-08-29  7:38 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-08-22  4:01 [gentoo-commits] proj/portage:master commit in: pym/portage/package/ebuild/, pym/portage/dbapi/, pym/portage/, pym/_emerge/ Zac Medico
  -- strict thread matches above, loose matches on Subject: below --
2012-08-29  7:38 Zac Medico

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox