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 B28181381F3 for ; Tue, 18 Jun 2013 14:13:04 +0000 (UTC) Received: from pigeon.gentoo.org (localhost [127.0.0.1]) by pigeon.gentoo.org (Postfix) with SMTP id 3F7A3E0853; Tue, 18 Jun 2013 14:12:59 +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 9305EE086F for ; Tue, 18 Jun 2013 14:12:58 +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 7A74F33DFE1 for ; Tue, 18 Jun 2013 14:12:57 +0000 (UTC) Received: from localhost.localdomain (localhost [127.0.0.1]) by hornbill.gentoo.org (Postfix) with ESMTP id 2B440E5462 for ; Tue, 18 Jun 2013 14:12:56 +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: <1371286696.dea12476091298811456b8c8f6ca596ae195e7ee.dywi@gentoo> Subject: [gentoo-commits] proj/R_overlay:master commit in: roverlay/overlay/ X-VCS-Repository: proj/R_overlay X-VCS-Files: roverlay/overlay/header.py roverlay/overlay/root.py X-VCS-Directories: roverlay/overlay/ X-VCS-Committer: dywi X-VCS-Committer-Name: André Erdmann X-VCS-Revision: dea12476091298811456b8c8f6ca596ae195e7ee X-VCS-Branch: master Date: Tue, 18 Jun 2013 14:12:56 +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: d1a3ff7e-95fd-4307-803a-775cef85f416 X-Archives-Hash: 3db37969b318229fe3215938a81acbbb commit: dea12476091298811456b8c8f6ca596ae195e7ee Author: André Erdmann mailerd de> AuthorDate: Sat Jun 15 08:58:16 2013 +0000 Commit: André Erdmann mailerd de> CommitDate: Sat Jun 15 08:58:16 2013 +0000 URL: http://git.overlays.gentoo.org/gitweb/?p=proj/R_overlay.git;a=commit;h=dea12476 overlay: write/update USE_EXPAND description files --- roverlay/overlay/header.py | 13 ++++ roverlay/overlay/root.py | 168 ++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 171 insertions(+), 10 deletions(-) diff --git a/roverlay/overlay/header.py b/roverlay/overlay/header.py index 6cd1f1f..8c7c05a 100644 --- a/roverlay/overlay/header.py +++ b/roverlay/overlay/header.py @@ -29,6 +29,19 @@ class EbuildHeader ( object ): return self._cached_header # --- end of get (...) --- + def get_use_expand_header ( self, use_expand_name ): + if self.default_header: + return ( + self.default_header + '\n' + + ( + '# This file contains descriptions of the {} ' + 'USE_EXPAND flags.'.format ( use_expand_name ) + ) + '\n' + ) + else: + return None + # --- end of get_use_expand_header (...) --- + def _make ( self ): if self.eclasses: inherit = 'inherit ' + ' '.join ( sorted ( self.eclasses ) ) diff --git a/roverlay/overlay/root.py b/roverlay/overlay/root.py index 98d0b26..71156df 100644 --- a/roverlay/overlay/root.py +++ b/roverlay/overlay/root.py @@ -17,6 +17,7 @@ due do double-linkage between PackageInfo and PackageDir. __all__ = [ 'Overlay', ] +import errno import logging import os import shutil @@ -313,13 +314,18 @@ class Overlay ( object ): # profiles/desc/.desc # !!! (late) config access (FIXME) + + use_expand_name = roverlay.config.get_or_fail ( + "EBUILD.USE_EXPAND.name" + ).rstrip ( "_" ) + self._write_rsuggests_use_desc ( ( self._profiles_dir + os.sep + 'desc' + os.sep - + roverlay.config.get_or_fail ( - "EBUILD.USE_EXPAND.name" - ).rstrip ( "_" ).lower()+ '.desc' - ) + + use_expand_name.lower() + '.desc' + ), + use_expand_name.upper(), + roverlay.config.get ( 'OVERLAY.backup_desc', True ) ) # profiles/use.desc @@ -342,12 +348,154 @@ class Overlay ( object ): raise # --- end of _init_overlay (...) --- - def _write_rsuggests_use_desc ( self, desc_file ): - # TODO - #open ( desc_file, "r" ), errno == errno.ENOENT (2) - self.logger.error ( - "Cannot write {!r}: code is missing ;)".format ( desc_file ) - ) + def _write_rsuggests_use_desc ( + self, desc_file, use_expand_name, backup_file, rewrite=False + ): + """Creates a USE_EXPAND description file. + + Reads the old file (if it exists) and imports its header / flag desc. + + arguments: + * desc_file -- path to the file that should be written/read + * use_expand_name -- name of the USE_EXPAND variable, e.g. R_SUGGESTS + * backup_file -- move desc_file to backup_file before overwriting it + This can also be an int i (=> desc_file + '.') + or a bool (if True => desc_file + '.bak'). + * rewrite -- force recreation of the desc file + """ + FLAG_SEPA = ' - ' + DESC_UNDEF = 'unknown' + + def do_backup ( dest, makedir=False ): + self.logger.debug ( "Moving old desc file to {!r}".format ( dest ) ) + if makedir: + roverlay.util.dodir ( os.path.dirname ( dest ), mkdir_p=True ) + shutil.move ( desc_file, dest ) + # --- end of do_backup (...) --- + + def read_desc_file(): + """Reads the old desc file (if it exists). + Returns a 3-tuple ( list header, dict flags, bool file_existed ). + + arguments: + * @implicit desc_file -- + + Passes all exceptions (IOError, ...) but "file does not exist". + """ + + FH = None + header = list() + # flags := dict { => |None } + flags = dict() + fexist = False + try: + FH = open ( desc_file, 'rt' ) + + addto_header = True + + for line in FH.readlines(): + rsline = line.rstrip() + if rsline and rsline [0] != '#': + flag, sepa, desc = rsline.partition ( FLAG_SEPA ) + # == DESC_UNDEF -- ignore + flags [flag] = desc if sepa else None + addto_header = False + elif addto_header is True: + header.append ( rsline ) + elif rsline: + self.logger.warning ( + "dropping line from {f!r}: {l}".format ( + f=desc_file, l=rsline + ) + ) + # -- end for + + FH.close() + fexist = True + except IOError as ioerr: + if ioerr.errno == errno.ENOENT: + pass + else: + raise + finally: + if FH: FH.close() + + return ( header, flags, fexist ) + # --- end of read_desc_file --- + + def gen_desc ( header, flags ): + """Creates new text lines for the desc file. + + arguments: + * @implicit use_expand_name -- + * header -- header line(s) to use (a default header will be created + if this is empty) + * flags -- flag=>desc dict + """ + NEWLINE = '\n' + + if header: + for line in header: + yield line + yield NEWLINE + #yield NEWLINE + else: + defheader = self._header.get_use_expand_header ( use_expand_name ) + if defheader: + yield defheader + yield NEWLINE + + for flag, desc in sorted ( flags.items(), key=lambda e: e[0] ): + if desc: + yield flag + FLAG_SEPA + desc + else: + yield flag + FLAG_SEPA + DESC_UNDEF + yield NEWLINE + # --- end of gen_desc (...) --- + + header, old_flags, can_backup = read_desc_file() + + if self._incremental: + # incremental: add new flags + # Create dict flag=>None that contains all new flags + # and copy old_flags "over" it. + # + flags = dict.fromkeys ( self._rsuggests_flags ) + flags.update ( old_flags ) + else: + # not incremental: discard old flags + # Create a dict that contains the new flags only and use desc + # from old_flags if available. + # + flags = { + flag: old_flags.get ( flag, None ) + for flag in self._rsuggests_flags + } + # -- end if + + # don't rewrite the desc file if nothing has changed + if rewrite or ( + frozenset ( flags.keys() ) != frozenset ( old_flags.keys() ) + ): + if can_backup: + if backup_file is True: + do_backup ( desc_file + '.bak' ) + elif isinstance ( backup_file, int ): + do_backuo ( desc_file + '.' + str ( backup_file ) ) + elif backup_file: + do_backup ( str ( backup_file ), makedir=True ) + # -- end if + + self.logger.debug ( "writing desc file {!r}".format ( desc_file ) ) + + roverlay.util.dodir ( os.path.dirname ( desc_file ) ) + with open ( desc_file, 'wt' ) as FH: + for line in gen_desc ( header, flags ): + FH.write ( line ) + else: + self.logger.debug ( + "not writing desc file {!r} (nothing changed)".format ( desc_file ) + ) # --- end of _write_rsuggests_use_desc (...) --- def add ( self, package_info ): 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 E1AE01381F3 for ; Sat, 15 Jun 2013 08:59:23 +0000 (UTC) Received: from pigeon.gentoo.org (localhost [127.0.0.1]) by pigeon.gentoo.org (Postfix) with SMTP id 72342E08E0; Sat, 15 Jun 2013 08:59:23 +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 E1808E08E0 for ; Sat, 15 Jun 2013 08:59:22 +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 9043E33E312 for ; Sat, 15 Jun 2013 08:59:21 +0000 (UTC) Received: from localhost.localdomain (localhost [127.0.0.1]) by hornbill.gentoo.org (Postfix) with ESMTP id 37AB6E468F for ; Sat, 15 Jun 2013 08:59:20 +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: <1371286696.dea12476091298811456b8c8f6ca596ae195e7ee.dywi@gentoo> Subject: [gentoo-commits] proj/R_overlay:gsoc13/next commit in: roverlay/overlay/ X-VCS-Repository: proj/R_overlay X-VCS-Files: roverlay/overlay/header.py roverlay/overlay/root.py X-VCS-Directories: roverlay/overlay/ X-VCS-Committer: dywi X-VCS-Committer-Name: André Erdmann X-VCS-Revision: dea12476091298811456b8c8f6ca596ae195e7ee X-VCS-Branch: gsoc13/next Date: Sat, 15 Jun 2013 08:59:20 +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: 129eaaf8-b3b3-44b1-8abe-4e2182c26fa8 X-Archives-Hash: 1cb91ce9e6e51485466d6dc00f9d8dbf Message-ID: <20130615085920.VkHJjXFZ7caXWeBl4y5OYYZk3h2qlSvfghl311gg7Uc@z> commit: dea12476091298811456b8c8f6ca596ae195e7ee Author: André Erdmann mailerd de> AuthorDate: Sat Jun 15 08:58:16 2013 +0000 Commit: André Erdmann mailerd de> CommitDate: Sat Jun 15 08:58:16 2013 +0000 URL: http://git.overlays.gentoo.org/gitweb/?p=proj/R_overlay.git;a=commit;h=dea12476 overlay: write/update USE_EXPAND description files --- roverlay/overlay/header.py | 13 ++++ roverlay/overlay/root.py | 168 ++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 171 insertions(+), 10 deletions(-) diff --git a/roverlay/overlay/header.py b/roverlay/overlay/header.py index 6cd1f1f..8c7c05a 100644 --- a/roverlay/overlay/header.py +++ b/roverlay/overlay/header.py @@ -29,6 +29,19 @@ class EbuildHeader ( object ): return self._cached_header # --- end of get (...) --- + def get_use_expand_header ( self, use_expand_name ): + if self.default_header: + return ( + self.default_header + '\n' + + ( + '# This file contains descriptions of the {} ' + 'USE_EXPAND flags.'.format ( use_expand_name ) + ) + '\n' + ) + else: + return None + # --- end of get_use_expand_header (...) --- + def _make ( self ): if self.eclasses: inherit = 'inherit ' + ' '.join ( sorted ( self.eclasses ) ) diff --git a/roverlay/overlay/root.py b/roverlay/overlay/root.py index 98d0b26..71156df 100644 --- a/roverlay/overlay/root.py +++ b/roverlay/overlay/root.py @@ -17,6 +17,7 @@ due do double-linkage between PackageInfo and PackageDir. __all__ = [ 'Overlay', ] +import errno import logging import os import shutil @@ -313,13 +314,18 @@ class Overlay ( object ): # profiles/desc/.desc # !!! (late) config access (FIXME) + + use_expand_name = roverlay.config.get_or_fail ( + "EBUILD.USE_EXPAND.name" + ).rstrip ( "_" ) + self._write_rsuggests_use_desc ( ( self._profiles_dir + os.sep + 'desc' + os.sep - + roverlay.config.get_or_fail ( - "EBUILD.USE_EXPAND.name" - ).rstrip ( "_" ).lower()+ '.desc' - ) + + use_expand_name.lower() + '.desc' + ), + use_expand_name.upper(), + roverlay.config.get ( 'OVERLAY.backup_desc', True ) ) # profiles/use.desc @@ -342,12 +348,154 @@ class Overlay ( object ): raise # --- end of _init_overlay (...) --- - def _write_rsuggests_use_desc ( self, desc_file ): - # TODO - #open ( desc_file, "r" ), errno == errno.ENOENT (2) - self.logger.error ( - "Cannot write {!r}: code is missing ;)".format ( desc_file ) - ) + def _write_rsuggests_use_desc ( + self, desc_file, use_expand_name, backup_file, rewrite=False + ): + """Creates a USE_EXPAND description file. + + Reads the old file (if it exists) and imports its header / flag desc. + + arguments: + * desc_file -- path to the file that should be written/read + * use_expand_name -- name of the USE_EXPAND variable, e.g. R_SUGGESTS + * backup_file -- move desc_file to backup_file before overwriting it + This can also be an int i (=> desc_file + '.') + or a bool (if True => desc_file + '.bak'). + * rewrite -- force recreation of the desc file + """ + FLAG_SEPA = ' - ' + DESC_UNDEF = 'unknown' + + def do_backup ( dest, makedir=False ): + self.logger.debug ( "Moving old desc file to {!r}".format ( dest ) ) + if makedir: + roverlay.util.dodir ( os.path.dirname ( dest ), mkdir_p=True ) + shutil.move ( desc_file, dest ) + # --- end of do_backup (...) --- + + def read_desc_file(): + """Reads the old desc file (if it exists). + Returns a 3-tuple ( list header, dict flags, bool file_existed ). + + arguments: + * @implicit desc_file -- + + Passes all exceptions (IOError, ...) but "file does not exist". + """ + + FH = None + header = list() + # flags := dict { => |None } + flags = dict() + fexist = False + try: + FH = open ( desc_file, 'rt' ) + + addto_header = True + + for line in FH.readlines(): + rsline = line.rstrip() + if rsline and rsline [0] != '#': + flag, sepa, desc = rsline.partition ( FLAG_SEPA ) + # == DESC_UNDEF -- ignore + flags [flag] = desc if sepa else None + addto_header = False + elif addto_header is True: + header.append ( rsline ) + elif rsline: + self.logger.warning ( + "dropping line from {f!r}: {l}".format ( + f=desc_file, l=rsline + ) + ) + # -- end for + + FH.close() + fexist = True + except IOError as ioerr: + if ioerr.errno == errno.ENOENT: + pass + else: + raise + finally: + if FH: FH.close() + + return ( header, flags, fexist ) + # --- end of read_desc_file --- + + def gen_desc ( header, flags ): + """Creates new text lines for the desc file. + + arguments: + * @implicit use_expand_name -- + * header -- header line(s) to use (a default header will be created + if this is empty) + * flags -- flag=>desc dict + """ + NEWLINE = '\n' + + if header: + for line in header: + yield line + yield NEWLINE + #yield NEWLINE + else: + defheader = self._header.get_use_expand_header ( use_expand_name ) + if defheader: + yield defheader + yield NEWLINE + + for flag, desc in sorted ( flags.items(), key=lambda e: e[0] ): + if desc: + yield flag + FLAG_SEPA + desc + else: + yield flag + FLAG_SEPA + DESC_UNDEF + yield NEWLINE + # --- end of gen_desc (...) --- + + header, old_flags, can_backup = read_desc_file() + + if self._incremental: + # incremental: add new flags + # Create dict flag=>None that contains all new flags + # and copy old_flags "over" it. + # + flags = dict.fromkeys ( self._rsuggests_flags ) + flags.update ( old_flags ) + else: + # not incremental: discard old flags + # Create a dict that contains the new flags only and use desc + # from old_flags if available. + # + flags = { + flag: old_flags.get ( flag, None ) + for flag in self._rsuggests_flags + } + # -- end if + + # don't rewrite the desc file if nothing has changed + if rewrite or ( + frozenset ( flags.keys() ) != frozenset ( old_flags.keys() ) + ): + if can_backup: + if backup_file is True: + do_backup ( desc_file + '.bak' ) + elif isinstance ( backup_file, int ): + do_backuo ( desc_file + '.' + str ( backup_file ) ) + elif backup_file: + do_backup ( str ( backup_file ), makedir=True ) + # -- end if + + self.logger.debug ( "writing desc file {!r}".format ( desc_file ) ) + + roverlay.util.dodir ( os.path.dirname ( desc_file ) ) + with open ( desc_file, 'wt' ) as FH: + for line in gen_desc ( header, flags ): + FH.write ( line ) + else: + self.logger.debug ( + "not writing desc file {!r} (nothing changed)".format ( desc_file ) + ) # --- end of _write_rsuggests_use_desc (...) --- def add ( self, package_info ):