* [gentoo-commits] proj/R_overlay:master commit in: roverlay/overlay/pkgdir/manifest/, roverlay/overlay/pkgdir/
@ 2013-02-09 20:45 André Erdmann
0 siblings, 0 replies; only message in thread
From: André Erdmann @ 2013-02-09 20:45 UTC (permalink / raw
To: gentoo-commits
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 (...) ---
^ permalink raw reply related [flat|nested] only message in thread
only message in thread, other threads:[~2013-02-09 20:45 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-02-09 20:45 [gentoo-commits] proj/R_overlay:master commit in: roverlay/overlay/pkgdir/manifest/, roverlay/overlay/pkgdir/ André Erdmann
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox