From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from lists.gentoo.org (pigeon.gentoo.org [208.92.234.80]) by finch.gentoo.org (Postfix) with ESMTP id 7AAA61381F3 for ; Thu, 5 Sep 2013 14:43:19 +0000 (UTC) Received: from pigeon.gentoo.org (localhost [127.0.0.1]) by pigeon.gentoo.org (Postfix) with SMTP id 1EE13E0EBE; Thu, 5 Sep 2013 14:43:17 +0000 (UTC) Received: from smtp.gentoo.org (smtp.gentoo.org [140.211.166.183]) (using TLSv1 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by pigeon.gentoo.org (Postfix) with ESMTPS id 794BFE0EB8 for ; Thu, 5 Sep 2013 14:43:16 +0000 (UTC) Received: from hornbill.gentoo.org (hornbill.gentoo.org [94.100.119.163]) (using TLSv1 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by smtp.gentoo.org (Postfix) with ESMTPS id 5271E33EB2A for ; Thu, 5 Sep 2013 14:43:15 +0000 (UTC) Received: from localhost.localdomain (localhost [127.0.0.1]) by hornbill.gentoo.org (Postfix) with ESMTP id CE412E5467 for ; Thu, 5 Sep 2013 14:43:12 +0000 (UTC) From: "André Erdmann" To: gentoo-commits@lists.gentoo.org Content-Transfer-Encoding: 8bit Content-type: text/plain; charset=UTF-8 Reply-To: gentoo-dev@lists.gentoo.org, "André Erdmann" Message-ID: <1378392115.014240b7155c2fede9931f83e0bb22fb292d83c0.dywi@gentoo> Subject: [gentoo-commits] proj/R_overlay:master commit in: roverlay/overlay/pkgdir/metadata/, roverlay/overlay/pkgdir/ X-VCS-Repository: proj/R_overlay X-VCS-Files: roverlay/overlay/pkgdir/metadata/__init__.py roverlay/overlay/pkgdir/packagedir_base.py X-VCS-Directories: roverlay/overlay/pkgdir/metadata/ roverlay/overlay/pkgdir/ X-VCS-Committer: dywi X-VCS-Committer-Name: André Erdmann X-VCS-Revision: 014240b7155c2fede9931f83e0bb22fb292d83c0 X-VCS-Branch: master Date: Thu, 5 Sep 2013 14:43:12 +0000 (UTC) Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: List-Id: Gentoo Linux mail X-BeenThere: gentoo-commits@lists.gentoo.org X-Archives-Salt: 6e48caf8-c3b5-46fd-9541-8af83d278982 X-Archives-Hash: 704ec0fa458bf765203c08c6f3d2a0d2 commit: 014240b7155c2fede9931f83e0bb22fb292d83c0 Author: André Erdmann mailerd de> AuthorDate: Thu Sep 5 14:41:55 2013 +0000 Commit: André Erdmann mailerd de> CommitDate: Thu Sep 5 14:41:55 2013 +0000 URL: http://git.overlays.gentoo.org/gitweb/?p=proj/R_overlay.git;a=commit;h=014240b7 log _why_ metadata.xml could not be created --- roverlay/overlay/pkgdir/metadata/__init__.py | 78 +++++++++++++++------------- roverlay/overlay/pkgdir/packagedir_base.py | 5 +- 2 files changed, 45 insertions(+), 38 deletions(-) diff --git a/roverlay/overlay/pkgdir/metadata/__init__.py b/roverlay/overlay/pkgdir/metadata/__init__.py index aad7553..da42307 100644 --- a/roverlay/overlay/pkgdir/metadata/__init__.py +++ b/roverlay/overlay/pkgdir/metadata/__init__.py @@ -22,7 +22,12 @@ USE_FULL_DESCRIPTION = True class MetadataJob ( object ): """R package description data -> metadata.xml interface.""" - DATA_KEYS = frozenset (( 'Description', 'Title' )) + METADATA_SUCCESS = 0 + METADATA_NO_PACKAGE = 2**0 + METADATA_EMPTY = 2**1 + METADATA_WRITE_ERROR = 2**2 + + DATA_KEYS = frozenset ({ 'Description', 'Title' }) def __init__ ( self, filepath, logger ): """Initializes a MetadataJob. @@ -31,9 +36,11 @@ class MetadataJob ( object ): * filepath -- path where the metadata file will be written to * logger -- parent logger to use """ - self.logger = logger.getChild ( 'metadata' ) - self._package_info = None - self.filepath = filepath + self.logger = logger.getChild ( 'metadata' ) + self._package_info = None + self.filepath = filepath + self.last_write_code = -1 + # no longer storing self._metadata, which will only be created twice # when running show() (expected 1x write per PackageInfo instance) # --- end of __init__ (...) --- @@ -112,20 +119,6 @@ class MetadataJob ( object ): return mref # --- end of update (...) --- - def _write ( self, fh, mref ): - """Writes the metadata into a file. - - arguments: - * fh -- file handle used for writing - - returns: True if writing succeeds, else False - - raises: Exception if no metadata to write - """ - return mref.write_file ( fh ) - #raise Exception ( "not enough metadata to write!" ) - # --- end of _write (...) --- - def show ( self, stream ): if self._package_info is not None: return self._create().write_file ( stream ) @@ -134,23 +127,36 @@ class MetadataJob ( object ): # --- end of show (...) --- def write ( self ): + retcode = self.METADATA_SUCCESS if self._package_info is not None: - _success = False - try: - # succeed if metadata empty or written - mref = self._create() - if mref.empty(): - _success = True - else: - fh = open ( self.filepath, 'w' ) - _success = self._write ( fh, mref ) - - except Exception as e: - self.logger.exception ( e ) - finally: - if 'fh' in locals() and fh: fh.close() - - return _success - else: - return False + # succeed if metadata empty or written + mref = self._create() + if mref.empty(): + retcode |= self.METADATA_EMPTY + else: + with open ( self.filepath, 'w' ) as fh: + if not mref.write_file ( fh ): + retcode |= self.METADATA_WRITE_ERROR + + self.last_write_code = retcode + return bool ( retcode == self.METADATA_SUCCESS ) # --- end of write (...) --- + + def decode_write_errors ( self ): + # usually yields only one word + def gen_decode ( code ): + if code < 0: + yield "" + else: + if code & self.METADATA_NO_PACKAGE: + yield "no package" + + if code & self.METADATA_EMPTY: + yield "empty" + + if code & self.METADATA_WRITE_ERROR: + yield "write error" + + reasons = list ( self.gen_decode ( self.last_write_code ) ) + return reasons if reasons else [ '', ] + # --- end of decode_write_errors (...) --- diff --git a/roverlay/overlay/pkgdir/packagedir_base.py b/roverlay/overlay/pkgdir/packagedir_base.py index 36ae5f7..870a419 100644 --- a/roverlay/overlay/pkgdir/packagedir_base.py +++ b/roverlay/overlay/pkgdir/packagedir_base.py @@ -1107,8 +1107,9 @@ class PackageDirBase ( roverlay.overlay.base.OverlayObject ): success = True else: self.logger.error ( - "Failed to write metadata file {}.".format ( - self._metadata.filepath + "Failed to write metadata file {}: {}".format ( + self._metadata.filepath, + ', '.join ( self._metadata.decode_write_errors() ) ) ) else: