public inbox for gentoo-commits@lists.gentoo.org
 help / color / mirror / Atom feed
* [gentoo-commits] proj/R_overlay:master commit in: roverlay/overlay/pkgdir/metadata/, roverlay/overlay/pkgdir/
@ 2013-09-05 14:43 André Erdmann
  0 siblings, 0 replies; only message in thread
From: André Erdmann @ 2013-09-05 14:43 UTC (permalink / raw
  To: gentoo-commits

commit:     014240b7155c2fede9931f83e0bb22fb292d83c0
Author:     André Erdmann <dywi <AT> mailerd <DOT> de>
AuthorDate: Thu Sep  5 14:41:55 2013 +0000
Commit:     André Erdmann <dywi <AT> mailerd <DOT> 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 "<invalid>"
+         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 [ '<unknown>', ]
+   # --- 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:


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

only message in thread, other threads:[~2013-09-05 14:43 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-09-05 14:43 [gentoo-commits] proj/R_overlay:master commit in: roverlay/overlay/pkgdir/metadata/, 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