public inbox for gentoo-commits@lists.gentoo.org
 help / color / mirror / Atom feed
From: "André Erdmann" <dywi@mailerd.de>
To: gentoo-commits@lists.gentoo.org
Subject: [gentoo-commits] proj/R_overlay:master commit in: roverlay/overlay/pkgdir/manifest/, roverlay/overlay/pkgdir/
Date: Sat,  9 Feb 2013 20:45:31 +0000 (UTC)	[thread overview]
Message-ID: <1360440495.78639b007415e4c2f6aae115ec51c4e8fc4a604a.dywi@gentoo> (raw)

commit:     78639b007415e4c2f6aae115ec51c4e8fc4a604a
Author:     André Erdmann <dywi <AT> mailerd <DOT> de>
AuthorDate: Sat Feb  9 19:49:28 2013 +0000
Commit:     André Erdmann <dywi <AT> mailerd <DOT> de>
CommitDate: Sat Feb  9 20:08:15 2013 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/R_overlay.git;a=commit;h=78639b00

roverlay/overlay/pkgdir: use DISTROOT

This commit adds usage of the distroot/distdir feature to all PackageDir
variants.

Additionally, Manifest creation is now partially controlled by the base
class:
* The base (PackageDirBase) class creates the "packages for manifest" list now
* Derived classes now implement manifest writing for a given package list
  in "_write_manifest(<>)" and do not need to provide a "write_manifest(<>)"
  method

---
 .../overlay/pkgdir/manifest/manifest_ebuild.py     |   40 ++++----
 roverlay/overlay/pkgdir/packagedir_base.py         |   46 ++++++++-
 .../overlay/pkgdir/packagedir_ebuildmanifest.py    |   35 +------
 .../overlay/pkgdir/packagedir_portagemanifest.py   |  107 ++++++++------------
 4 files changed, 111 insertions(+), 117 deletions(-)

diff --git a/roverlay/overlay/pkgdir/manifest/manifest_ebuild.py b/roverlay/overlay/pkgdir/manifest/manifest_ebuild.py
index b6e3fc0..c81e833 100644
--- a/roverlay/overlay/pkgdir/manifest/manifest_ebuild.py
+++ b/roverlay/overlay/pkgdir/manifest/manifest_ebuild.py
@@ -6,20 +6,19 @@
 
 """manifest helpers (actual implementation)
 
-This module implements Manifest creation.
+This module implements Manifest creation using ebuild(1).
 """
 
 __all__ = [ 'ExternalManifestCreation', ]
 
-# TODO (in future): could use portage api directly, namely
-#  '/usr/lib/portage/pym/portage/package/ebuild/doebuild.py'
-# instead of using '/usr/bin/ebuild'
-
 import os.path
 import copy
 import logging
 import subprocess
 
+
+import roverlay.overlay.pkgdir.distroot.static
+
 from roverlay import config, strutil
 
 from roverlay.overlay.pkgdir.manifest.env import ManifestEnv
@@ -41,9 +40,11 @@ class ExternalManifestCreation ( object ):
 		self.manifest_env ['PORTDIR_OVERLAY'] = config.get_or_fail (
 			'OVERLAY.dir'
 		)
-		# !! FIXME: tell the <others> that __tmp__ is a reserved directory
-		self.manifest_env ['DISTDIR'] = \
-		config.get_or_fail ( 'DISTFILES.ROOT' ) + os.path.sep + '__tmp__'
+		# self.distroot[.get_distdir(...)] replaces the __tmp__ directory
+		self.distroot = (
+			roverlay.overlay.pkgdir.distroot.static.get_configured ( static=True )
+		)
+
 		self._initialized = True
 	# --- end of _doinit (...) ---
 
@@ -60,15 +61,23 @@ class ExternalManifestCreation ( object ):
 
 		raises: *passes Exceptions from failed config lookups
 		"""
-		if not self._initialized: self._doinit()
+		if not self._initialized:
+			self._doinit()
 
-		distdirs    = ' '.join ( set (
-			p ['distdir'] for p in package_info_list
-		) )
+		# choosing one ebuild for calling "ebuild <ebuild>" is sufficient
 		ebuild_file = package_info_list [0] ['ebuild_file']
 
+		distdir = self.distroot.get_distdir ( package_info_list [0] ['name'] )
 
-		self.manifest_env ['PORTAGE_RO_DISTDIRS'] = distdirs
+		#
+		self.manifest_env ['DISTDIR'] = distdir.get_root()
+
+		# add hardlinks to DISTROOT (replacing existing files/links)
+		for p in package_info_list:
+			# TODO: optimize this further?
+			# -> "not has physical_only?"
+			#     (should be covered by "has package_file")
+			distdir.add ( p ['package_file'] )
 
 		ebuild_call = subprocess.Popen (
 			(
@@ -84,11 +93,6 @@ class ExternalManifestCreation ( object ):
 
 		output = ebuild_call.communicate()
 
-		# log stdout?
-		#for line in strutil.pipe_lines ( output [0] ):
-		#	LOGGER.debug ( line )
-		#for line in strutil.pipe_lines ( output [0] ): print ( line )
-
 		# log stderr
 		for line in strutil.pipe_lines ( output [1], use_filter=True ):
 			self.logger.warning ( line )

diff --git a/roverlay/overlay/pkgdir/packagedir_base.py b/roverlay/overlay/pkgdir/packagedir_base.py
index 35350ee..3c9b623 100644
--- a/roverlay/overlay/pkgdir/packagedir_base.py
+++ b/roverlay/overlay/pkgdir/packagedir_base.py
@@ -597,19 +597,55 @@ class PackageDirBase ( object ):
 		return all_ebuilds_written
 	# --- end of write_ebuilds (...) ---
 
+	def _write_manifest ( self, pkgs_for_manifest ):
+		"""Generates and writes the Manifest file for the given PackageInfo
+		objects.
+
+		arguments:
+		* pkgs_for_manifest --
+
+		expects: called in write_manifest()
+
+		returns: success (True/False)
+
+		"""
+		raise NotImplementedError (
+			"_write_manifest() needs to be implemented by derived classes."
+		)
+	# --- end of _write_manifest (...) ---
+
 	def write_manifest ( self, ignore_empty=False ):
-		"""Generates and writes the Manifest file for this package.
+		"""Creates the Manifest file for this package dir.
 
 		expects: called after writing metadata/ebuilds
 
-		returns: success (True/False)
+		arguments:
+		* ignore_empty --
 
 		raises:
 		* Exception if no ebuild exists
+
+		returns: success (True/False)
 		"""
-		raise NotImplementedError (
-			"write_manifest() needs to be implemented by derived classes."
-		)
+
+		# collect all PackageInfo instances that have enough data (PACKAGE_FILE,
+		# EBUILD_FILE) for manifest creation
+		pkgs_for_manifest = [
+			p for p in self._packages.values()
+			if p.has ( 'package_file', 'ebuild_file' )
+		]
+
+		if pkgs_for_manifest:
+			self.logger.debug ( "Writing Manifest" )
+			return self._write_manifest ( pkgs_for_manifest )
+		elif ignore_empty:
+			return True
+		else:
+			raise Exception (
+				'In {mydir}: No ebuild written so far! '
+				'I really don\'t know what do to!'.format (
+					mydir=self.physical_location
+			) )
 	# --- end of write_manifest (...) ---
 
 	def write_metadata ( self, shared_fh=None ):

diff --git a/roverlay/overlay/pkgdir/packagedir_ebuildmanifest.py b/roverlay/overlay/pkgdir/packagedir_ebuildmanifest.py
index e1961dd..5fec14b 100644
--- a/roverlay/overlay/pkgdir/packagedir_ebuildmanifest.py
+++ b/roverlay/overlay/pkgdir/packagedir_ebuildmanifest.py
@@ -1,4 +1,4 @@
-# R overlay -- overlay package, package directory
+# R overlay -- overlay package, package directory (ebuild manifest)
 # -*- coding: utf-8 -*-
 # Copyright (C) 2012 André Erdmann <dywi@mailerd.de>
 # Distributed under the terms of the GNU General Public License;
@@ -9,6 +9,7 @@ __all__ = [ 'PackageDir', ]
 from roverlay.overlay.pkgdir import manifest
 from roverlay.overlay.pkgdir import packagedir_base
 
+
 class PackageDir ( packagedir_base.PackageDirBase ):
 	"""
 	PackageDir class that uses the ebuild executable for Manifest writing.
@@ -16,41 +17,17 @@ class PackageDir ( packagedir_base.PackageDirBase ):
 
 	MANIFEST_THREADSAFE = False
 
-	def write_manifest ( self, ignore_empty=False ):
+	def _write_manifest ( self, pkgs_for_manifest ):
 		"""Generates and writes the Manifest file for this package.
 
 		expects: called after writing metadata/ebuilds
 
 		returns: success (True/False)
-
-		raises:
-		* Exception if no ebuild exists
 		"""
 
-		# it should be sufficient to call create_manifest for one ebuild,
-		#  choosing the latest one that exists in self.physical_location and
-		#  has enough data (DISTDIR, EBUILD_FILE) for this task.
-		#  Additionally, all DISTDIRs (multiple repos, sub directories) have
-		#  to be collected and passed to Manifest creation.
-		#  => collect suitable PackageInfo objects from self._packages
-		#
-		pkgs_for_manifest = tuple (
-			p for p in self._packages.values() \
-			if p.has ( 'distdir', 'ebuild_file' )
-		)
-
-		if pkgs_for_manifest:
-			if manifest.create_manifest ( pkgs_for_manifest, nofail=False ):
-				self._need_manifest = False
-				return True
-		elif ignore_empty:
+		if manifest.create_manifest ( pkgs_for_manifest, nofail=False ):
+			self._need_manifest = False
 			return True
 		else:
-			raise Exception (
-				'In {mydir}: No ebuild written so far! '
-				'I really don\'t know what do to!'.format (
-					mydir=self.physical_location
-			) )
-
-		return False
+			return False
 	# --- end of write_manifest (...) ---

diff --git a/roverlay/overlay/pkgdir/packagedir_portagemanifest.py b/roverlay/overlay/pkgdir/packagedir_portagemanifest.py
index 9c8aca3..b9781a9 100644
--- a/roverlay/overlay/pkgdir/packagedir_portagemanifest.py
+++ b/roverlay/overlay/pkgdir/packagedir_portagemanifest.py
@@ -19,7 +19,7 @@ import roverlay.config
 import roverlay.strutil
 import roverlay.packageinfo
 import roverlay.overlay.pkgdir.packagedir_base
-import roverlay.overlay.pkgdir.symlink.distroot
+import roverlay.overlay.pkgdir.distroot
 
 class PackageDir ( roverlay.overlay.pkgdir.packagedir_base.PackageDirBase ):
 
@@ -82,23 +82,14 @@ class PackageDir ( roverlay.overlay.pkgdir.packagedir_base.PackageDirBase ):
 		self._packages [ p ['ebuild_verstr'] ] = p
 	# --- end of _scan_add_package (...) ---
 
-	def write_manifest ( self, ignore_empty=False ):
+	def _write_manifest ( self, pkgs_for_manifest ):
 		"""Generates and writes the Manifest file for this package.
 
 		expects: called after writing metadata/ebuilds
 
-		returns: success (True/False)
-
-		raises:
-		* Exception if no ebuild exists
+		returns: True
 		"""
 
-		# the "package_filename" key is also required
-		pkgs_for_manifest = frozenset (
-			p for p in self._packages.values()
-				if p.has ( 'ebuild_filename', 'package_file' )
-		)
-
 		# TODO: this needs proper testing
 		# * the written Manifest file must not differ from the one generated by
 		#   ebuild(1) (the order of the entries is not important, though)
@@ -107,64 +98,50 @@ class PackageDir ( roverlay.overlay.pkgdir.packagedir_base.PackageDirBase ):
 		# * what happens if an ebuild has been removed?
 		# * ...
 		#
-		if pkgs_for_manifest:
-			symlink_distdir = roverlay.overlay.pkgdir.symlink.distroot.\
-				SymlinkDistroot.get_configured().get ( self.name )
-
-			# allow_missing=True -- don't write empty Manifest files
-			manifest = portage.manifest.Manifest (
-				self.physical_location,
-				str ( symlink_distdir ),
-				allow_missing=True,
-			)
 
-			# metadata.xml
-			# os.path.basename ( self._metadata.filepath )
-			manifest.addFile ( 'MISC', 'metadata.xml' )
-
-			for p in pkgs_for_manifest:
-				ebuild_filename  = p ['ebuild_filename']
-				package_filename = p ['package_filename']
-
-				if not manifest.hasFile ( 'EBUILD', ebuild_filename ):
-					manifest.addFile ( 'EBUILD', ebuild_filename )
-
-				if not manifest.hasFile ( 'DIST', package_filename ):
-					symlink_distdir.add ( p ['package_file'], package_filename )
-					manifest.addFile (
-						'DIST',
-						package_filename,
-						# TODO:
-						# ignoreMissing for DIST files, else addFile raises
-						# FileNotFound -- is this the correct way to add DIST files?
-						ignoreMissing=True
-					)
+		distdir = roverlay.overlay.pkgdir.distroot.get_distdir ( self.name )
+
+		# allow_missing=True -- don't write empty Manifest files
+		manifest = portage.manifest.Manifest (
+			self.physical_location,
+			distdir.get_root(),
+			allow_missing=True,
+		)
 
-			# ??? FIXME: (read) portage api docs
-			#
-			# manifest.create -- recreate from scratch (required?)
-			# -> assumeDistHashesSometimes:
-			#     use existing checksums for non-existent DIST files (required?)
-			#
-			#manifest.create ( assumeDistHashesSometimes=True )
-			#manifest.create ( assumeDistHashesSometimes=False )
+		# metadata.xml
+		# os.path.basename ( self._metadata.filepath )
+		manifest.addFile ( 'MISC', 'metadata.xml' )
 
-			manifest.write()
-			self._need_manifest = False
+		for p in pkgs_for_manifest:
 
-			return True
+			ebuild_filename  = p ['ebuild_filename']
+			package_filename = p ['package_filename']
 
-		elif ignore_empty:
+			if not manifest.hasFile ( 'EBUILD', ebuild_filename ):
+				manifest.addFile ( 'EBUILD', ebuild_filename )
 
-			return True
+			if not manifest.hasFile ( 'DIST', package_filename ):
+				distdir.add ( p ['package_file'], package_filename )
+				manifest.addFile (
+					'DIST',
+					package_filename,
+					# TODO:
+					# ignoreMissing for DIST files, else addFile raises
+					# FileNotFound -- is this the correct way to add DIST files?
+					ignoreMissing=True
+				)
 
-		else:
-			raise Exception (
-				'In {mydir}: No ebuild written so far! '
-				'I really don\'t know what do to!'.format (
-					mydir=self.physical_location
-			) )
-
-		# @unreachable
-		return False
+		# ??? FIXME: (read) portage api docs
+		#
+		# manifest.create -- recreate from scratch (required?)
+		# -> assumeDistHashesSometimes:
+		#     use existing checksums for non-existent DIST files (required?)
+		#
+		#manifest.create ( assumeDistHashesSometimes=True )
+		#manifest.create ( assumeDistHashesSometimes=False )
+
+		manifest.write()
+		self._need_manifest = False
+
+		return True
 	# --- end of write_manifest (...) ---


                 reply	other threads:[~2013-02-09 20:45 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1360440495.78639b007415e4c2f6aae115ec51c4e8fc4a604a.dywi@gentoo \
    --to=dywi@mailerd.de \
    --cc=gentoo-commits@lists.gentoo.org \
    --cc=gentoo-dev@lists.gentoo.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox