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 74AFC138200 for ; Tue, 23 Jul 2013 07:51:57 +0000 (UTC) Received: from pigeon.gentoo.org (localhost [127.0.0.1]) by pigeon.gentoo.org (Postfix) with SMTP id 8FB47E0A8B; Tue, 23 Jul 2013 07:51:52 +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 C083AE0A88 for ; Tue, 23 Jul 2013 07:51:41 +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 9692F33E9D9 for ; Tue, 23 Jul 2013 07:51:35 +0000 (UTC) Received: from localhost.localdomain (localhost [127.0.0.1]) by hornbill.gentoo.org (Postfix) with ESMTP id 7F97BE547B for ; Tue, 23 Jul 2013 07:51:33 +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: <1374256554.88095f8d7f7c2c57edbc6319094fb272f3977444.dywi@gentoo> Subject: [gentoo-commits] proj/R_overlay:master commit in: roverlay/console/ X-VCS-Repository: proj/R_overlay X-VCS-Files: roverlay/console/depres.py X-VCS-Directories: roverlay/console/ X-VCS-Committer: dywi X-VCS-Committer-Name: André Erdmann X-VCS-Revision: 88095f8d7f7c2c57edbc6319094fb272f3977444 X-VCS-Branch: master Date: Tue, 23 Jul 2013 07:51:33 +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: e0b6db02-9407-49a8-b540-a22680d95608 X-Archives-Hash: b7bfa30a68ddcbd44ccc20845ad35a59 commit: 88095f8d7f7c2c57edbc6319094fb272f3977444 Author: André Erdmann mailerd de> AuthorDate: Fri Jul 19 17:55:54 2013 +0000 Commit: André Erdmann mailerd de> CommitDate: Fri Jul 19 17:55:54 2013 +0000 URL: http://git.overlays.gentoo.org/gitweb/?p=proj/R_overlay.git;a=commit;h=88095f8d extend new depres console * added extended versions of load, load_conf, write known from the old console * print_pool can now be used to print all or a specific set of pools * unwind_pool accepts '--all','-a' as opt, which removes all pools * '/resolve', '!' can be used to enter a resolve command chroot where dependency strings don't have to be prefixed with "resolve" * '!!' for exiting the command chroot --- roverlay/console/depres.py | 179 +++++++++++++++++++++++++++++++++++++++------ 1 file changed, 158 insertions(+), 21 deletions(-) diff --git a/roverlay/console/depres.py b/roverlay/console/depres.py index ce6a11b..457b577 100644 --- a/roverlay/console/depres.py +++ b/roverlay/console/depres.py @@ -4,24 +4,36 @@ # Distributed under the terms of the GNU General Public License; # either version 2 of the License, or (at your option) any later version. +import os import sys import roverlay.console.base import roverlay.console.interpreter +from roverlay.console.interpreter import ConsoleInterpreter + +import roverlay.strutil +from roverlay.strutil import unquote, unquote_all + +#wrap_lastarg = roverlay.console.interpreter.wrap_lastarg # hidden import #import roverlay.interface.depres # TODO/FIXME: turn off dep resolver logging: "RESOLVED: this as that" -class DepresConsoleInterpreter ( - roverlay.console.interpreter.ConsoleInterpreter -): +class DepresConsoleInterpreter ( ConsoleInterpreter ): + # Note: this is an old-style class (inherited from cmd.Cmd) + + CHROOT_ALLOWED = frozenset ({ 'resolve', }) + COMP_CHROOT_ALLOWED = list ( CHROOT_ALLOWED | { '/', } ) + def __init__ ( self, *args, **kwargs ): - super ( DepresConsoleInterpreter, self ).__init__ ( *args, **kwargs ) - self.intro = "depres console (r2)" + ConsoleInterpreter.__init__ ( self, *args, **kwargs ) + self.intro = "dependency resolution console (r2)" def setup_aliases ( self ): + ConsoleInterpreter.setup_aliases ( self ) + self.add_alias ( "help", "h" ) # rule pool management @@ -31,15 +43,61 @@ class DepresConsoleInterpreter ( # rule creation self.add_alias ( "add_rule", "+" ) + + # load rules self.add_alias ( "load_conf", "lc" ) + self.add_alias ( "load", "l" ) - # dep res + # rule export + self.add_alias ( "write", "w" ) + + # depres self.add_alias ( "resolve", "??" ) + + # enter/leave depres chroot + self.add_alias ( "chroot /resolve", "!" ) + self.add_alias ( "chroot /", "!!" ) # --- end of setup_aliases (...) --- + def setup_argparser ( self ): + ConsoleInterpreter.setup_argparser ( self ) + + # write + parser = self.get_argparser ( "write", create=True ) + + parser.add_argument ( 'outfile', nargs=1, metavar="", type=str, + help="file to write" + ) + parser.add_opt_in ( '--force', '-f', help='overwrite existing files' ) + parser.add_opt_in ( '--all', '-a', + help="write all pools into a single file" + ) + + # load + parser = self.get_argparser ( "load", create=True ) + + parser.add_argument ( 'files', nargs='*', metavar="", + type=self.argparse_fspath, help="files/dirs to load", + ) + + # print_pool + parser = self.get_argparser ( "print_pool", create=True ) + + parser.add_opt_in ( '--all', '-a', help="print all pools" ) + parser.add_argument ( 'pools', metavar='', nargs='*', + help="print specific pools (by id)", type=int, + ) + + + # unwind_pool + parser = self.get_argparser ( "unwind_pool", create=True ) + + parser.add_opt_in ( '--all', '-a', help='discard all rule pools' ) + + # --- end of setup_argparser (...) --- def reset ( self, soft=True ): - super ( DepresConsoleInterpreter, self ).reset ( soft=soft ) + ConsoleInterpreter.reset ( self, soft=soft ) if not soft: self.interface.discard_pools() @@ -54,18 +112,21 @@ class DepresConsoleInterpreter ( * resolve R * resolve fftw 3.2 """ - if line: - ret = self.interface.resolve ( line ) + depstr = unquote ( line ) + if depstr: + ret = self.interface.resolve ( depstr ) if ret is None: - sys.stdout.write ( "{!r} could not be resolved.\n".format ( line ) ) + sys.stdout.write ( + "{!r} could not be resolved.\n".format ( depstr ) + ) elif not ret: sys.stdout.write ( - "{!r} has been resolved as nothing(?)\n".format ( line ) + "{!r} has been resolved as nothing(?)\n".format ( depstr ) ) elif len ( ret ) == 1: sys.stdout.write ( "{!r} has been resolved as {}.\n".format ( - line, ( + depstr, ( ret[0].dep if ( ret[0] and ret[0].dep is not None ) else "" ) @@ -74,7 +135,7 @@ class DepresConsoleInterpreter ( else: sys.stdout.write ( "{!r} has been resolved as {}.\n".format ( - line, ( ', '.join ( str ( dep ) for dep in ret ) ) + depstr, ( ', '.join ( str ( dep ) for dep in ret ) ) ) ) else: @@ -87,8 +148,20 @@ class DepresConsoleInterpreter ( # --- end of do_add_pool (...) --- def do_unwind_pool ( self, line ): - """Removes the topmost rule pool.""" - if self.interface.discard_pool(): + """Removes the topmost rule pool. See --help for usage.""" + args = self.parse_cmdline ( "unwind_pool", line ) + + if args is None: + pass + elif args.all: + count = self.interface.discard_all_pools() + if count == 0: + sys.stdout.write ( "resolver has no pools.\n" ) + else: + sys.stdout.write ( + "{:d} pools have been removed.\n".format ( count ) + ) + elif self.interface.discard_pool(): sys.stdout.write ( "pool has been removed.\n" ) else: sys.stdout.write ( "resolver has no pools.\n" ) @@ -116,28 +189,92 @@ class DepresConsoleInterpreter ( # --- end of do_add_rule (...) --- def do_print_pool ( self, line ): - """Prints the topmost pool (TODO:: or all).""" - sys.stdout.write ( self.interface.visualize_pool() ) - sys.stdout.write ( "\n" ) + """Prints the topmost pool. See --help for usage.""" + args = self.parse_cmdline ( "print_pool", line ) + if args is not None: + if args.all: + sys.stdout.write ( self.interface.visualize_pools() ) + elif args.pools: + sys.stdout.write ( self.interface.visualize_pools ( args.pools ) ) + else: + sys.stdout.write ( self.interface.visualize_pool() ) + + sys.stdout.write ( "\n" ) # --- end of do_print_pool (...) --- def do_print ( self, line ): - """Prints the topmost pool (TODO:: or all).""" + """Prints the topmost pool. See --help for usage.""" return self.do_print_pool ( line ) # --- end of do_print (...) --- def do_load_conf ( self, line ): - """Load configured dependency rule files.""" + """Load configured dependency rule files. See --help for usage.""" self.interface.discard_empty_pools() if not self.interface.load_rules_from_config ( ignore_missing=True ): sys.stderr.write ( "failed to load rule files!\n" ) - # --- end of do_load_conf (...) --- + def complete_load ( self, *args, **kw ): + return self.complete_fspath ( *args, **kw ) + # --- end of complete_load (...) --- + + def do_load ( self, line ): + """Loads a dependency rule file. + + Usage: load + + See --help for detailed usage. + """ + self.interface.discard_empty_pools() + + args = self.parse_cmdline ( "load", line ) + if args and args.files: + if not self.interface.load_rule_files ( + args.files, ignore_missing=True + ): + sys.stderr.write ( + "failed to load rule file {!r}\n".format ( line ) + ) + # --- end of do_load (...) --- + + def complete_write ( self, text, *args, **kw ): + return self.complete_fspath ( text, *args, **kw ) + # --- end of complete_write (...) --- + + def do_write ( self, line ): + """Exports the rules of the topmost rule pool into a file. + See --help for usage.""" + args = self.parse_cmdline ( "write", line ) + if args and args.outfile and args.outfile[0]: + outfile = self.get_fspath ( args.outfile[0] ) + if args.force or not os.path.exists ( outfile ): + try: + output = ( + self.interface.visualize_pools() if args.all + else self.interface.visualize_pool() + ) + with open ( outfile, 'wt' ) as FH: + FH.write ( output ) + FH.write ( '\n' ) + except Exception as err: + sys.stderr.write ( "write failed: {}\n".format ( err ) ) + else: + self.set_lastarg ( outfile ) + sys.stdout.write ( "wrote {!r}\n".format ( outfile ) ) + else: + sys.stderr.write ( "cannot write {!r}: exists\n".format ( outfile ) ) + else: + sys.stderr.write ( "nothing written!\n" ) + # --- end of do_write (...) --- + +# --- end of DepresConsoleInterpreter --- class DepresConsole ( roverlay.console.base.MainConsole ): INTERPRETER_CLS = DepresConsoleInterpreter def get_interface ( self ): return self.root_interface.spawn_interface ( "depres" ) + # --- end of get_interface (...) --- + +# --- end of DepresConsole --- 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 327141381F3 for ; Fri, 19 Jul 2013 18:00:51 +0000 (UTC) Received: from pigeon.gentoo.org (localhost [127.0.0.1]) by pigeon.gentoo.org (Postfix) with SMTP id A046AE0952; Fri, 19 Jul 2013 18:00:50 +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 23E20E0952 for ; Fri, 19 Jul 2013 18:00:45 +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 E569C33E929 for ; Fri, 19 Jul 2013 18:00:43 +0000 (UTC) Received: from localhost.localdomain (localhost [127.0.0.1]) by hornbill.gentoo.org (Postfix) with ESMTP id 58DEEE5461 for ; Fri, 19 Jul 2013 18:00:41 +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: <1374256554.88095f8d7f7c2c57edbc6319094fb272f3977444.dywi@gentoo> Subject: [gentoo-commits] proj/R_overlay:gsoc13/next commit in: roverlay/console/ X-VCS-Repository: proj/R_overlay X-VCS-Files: roverlay/console/depres.py X-VCS-Directories: roverlay/console/ X-VCS-Committer: dywi X-VCS-Committer-Name: André Erdmann X-VCS-Revision: 88095f8d7f7c2c57edbc6319094fb272f3977444 X-VCS-Branch: gsoc13/next Date: Fri, 19 Jul 2013 18:00:41 +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: 330c9810-2191-4e7c-b438-48ccde15521f X-Archives-Hash: 1539e902a5076492859eb99bcc0fa04f Message-ID: <20130719180041.U8TWIWyoIW7bRwu4RxkSR8A3XL0dBegjEV8QsQ8Zgzg@z> commit: 88095f8d7f7c2c57edbc6319094fb272f3977444 Author: André Erdmann mailerd de> AuthorDate: Fri Jul 19 17:55:54 2013 +0000 Commit: André Erdmann mailerd de> CommitDate: Fri Jul 19 17:55:54 2013 +0000 URL: http://git.overlays.gentoo.org/gitweb/?p=proj/R_overlay.git;a=commit;h=88095f8d extend new depres console * added extended versions of load, load_conf, write known from the old console * print_pool can now be used to print all or a specific set of pools * unwind_pool accepts '--all','-a' as opt, which removes all pools * '/resolve', '!' can be used to enter a resolve command chroot where dependency strings don't have to be prefixed with "resolve" * '!!' for exiting the command chroot --- roverlay/console/depres.py | 179 +++++++++++++++++++++++++++++++++++++++------ 1 file changed, 158 insertions(+), 21 deletions(-) diff --git a/roverlay/console/depres.py b/roverlay/console/depres.py index ce6a11b..457b577 100644 --- a/roverlay/console/depres.py +++ b/roverlay/console/depres.py @@ -4,24 +4,36 @@ # Distributed under the terms of the GNU General Public License; # either version 2 of the License, or (at your option) any later version. +import os import sys import roverlay.console.base import roverlay.console.interpreter +from roverlay.console.interpreter import ConsoleInterpreter + +import roverlay.strutil +from roverlay.strutil import unquote, unquote_all + +#wrap_lastarg = roverlay.console.interpreter.wrap_lastarg # hidden import #import roverlay.interface.depres # TODO/FIXME: turn off dep resolver logging: "RESOLVED: this as that" -class DepresConsoleInterpreter ( - roverlay.console.interpreter.ConsoleInterpreter -): +class DepresConsoleInterpreter ( ConsoleInterpreter ): + # Note: this is an old-style class (inherited from cmd.Cmd) + + CHROOT_ALLOWED = frozenset ({ 'resolve', }) + COMP_CHROOT_ALLOWED = list ( CHROOT_ALLOWED | { '/', } ) + def __init__ ( self, *args, **kwargs ): - super ( DepresConsoleInterpreter, self ).__init__ ( *args, **kwargs ) - self.intro = "depres console (r2)" + ConsoleInterpreter.__init__ ( self, *args, **kwargs ) + self.intro = "dependency resolution console (r2)" def setup_aliases ( self ): + ConsoleInterpreter.setup_aliases ( self ) + self.add_alias ( "help", "h" ) # rule pool management @@ -31,15 +43,61 @@ class DepresConsoleInterpreter ( # rule creation self.add_alias ( "add_rule", "+" ) + + # load rules self.add_alias ( "load_conf", "lc" ) + self.add_alias ( "load", "l" ) - # dep res + # rule export + self.add_alias ( "write", "w" ) + + # depres self.add_alias ( "resolve", "??" ) + + # enter/leave depres chroot + self.add_alias ( "chroot /resolve", "!" ) + self.add_alias ( "chroot /", "!!" ) # --- end of setup_aliases (...) --- + def setup_argparser ( self ): + ConsoleInterpreter.setup_argparser ( self ) + + # write + parser = self.get_argparser ( "write", create=True ) + + parser.add_argument ( 'outfile', nargs=1, metavar="", type=str, + help="file to write" + ) + parser.add_opt_in ( '--force', '-f', help='overwrite existing files' ) + parser.add_opt_in ( '--all', '-a', + help="write all pools into a single file" + ) + + # load + parser = self.get_argparser ( "load", create=True ) + + parser.add_argument ( 'files', nargs='*', metavar="", + type=self.argparse_fspath, help="files/dirs to load", + ) + + # print_pool + parser = self.get_argparser ( "print_pool", create=True ) + + parser.add_opt_in ( '--all', '-a', help="print all pools" ) + parser.add_argument ( 'pools', metavar='', nargs='*', + help="print specific pools (by id)", type=int, + ) + + + # unwind_pool + parser = self.get_argparser ( "unwind_pool", create=True ) + + parser.add_opt_in ( '--all', '-a', help='discard all rule pools' ) + + # --- end of setup_argparser (...) --- def reset ( self, soft=True ): - super ( DepresConsoleInterpreter, self ).reset ( soft=soft ) + ConsoleInterpreter.reset ( self, soft=soft ) if not soft: self.interface.discard_pools() @@ -54,18 +112,21 @@ class DepresConsoleInterpreter ( * resolve R * resolve fftw 3.2 """ - if line: - ret = self.interface.resolve ( line ) + depstr = unquote ( line ) + if depstr: + ret = self.interface.resolve ( depstr ) if ret is None: - sys.stdout.write ( "{!r} could not be resolved.\n".format ( line ) ) + sys.stdout.write ( + "{!r} could not be resolved.\n".format ( depstr ) + ) elif not ret: sys.stdout.write ( - "{!r} has been resolved as nothing(?)\n".format ( line ) + "{!r} has been resolved as nothing(?)\n".format ( depstr ) ) elif len ( ret ) == 1: sys.stdout.write ( "{!r} has been resolved as {}.\n".format ( - line, ( + depstr, ( ret[0].dep if ( ret[0] and ret[0].dep is not None ) else "" ) @@ -74,7 +135,7 @@ class DepresConsoleInterpreter ( else: sys.stdout.write ( "{!r} has been resolved as {}.\n".format ( - line, ( ', '.join ( str ( dep ) for dep in ret ) ) + depstr, ( ', '.join ( str ( dep ) for dep in ret ) ) ) ) else: @@ -87,8 +148,20 @@ class DepresConsoleInterpreter ( # --- end of do_add_pool (...) --- def do_unwind_pool ( self, line ): - """Removes the topmost rule pool.""" - if self.interface.discard_pool(): + """Removes the topmost rule pool. See --help for usage.""" + args = self.parse_cmdline ( "unwind_pool", line ) + + if args is None: + pass + elif args.all: + count = self.interface.discard_all_pools() + if count == 0: + sys.stdout.write ( "resolver has no pools.\n" ) + else: + sys.stdout.write ( + "{:d} pools have been removed.\n".format ( count ) + ) + elif self.interface.discard_pool(): sys.stdout.write ( "pool has been removed.\n" ) else: sys.stdout.write ( "resolver has no pools.\n" ) @@ -116,28 +189,92 @@ class DepresConsoleInterpreter ( # --- end of do_add_rule (...) --- def do_print_pool ( self, line ): - """Prints the topmost pool (TODO:: or all).""" - sys.stdout.write ( self.interface.visualize_pool() ) - sys.stdout.write ( "\n" ) + """Prints the topmost pool. See --help for usage.""" + args = self.parse_cmdline ( "print_pool", line ) + if args is not None: + if args.all: + sys.stdout.write ( self.interface.visualize_pools() ) + elif args.pools: + sys.stdout.write ( self.interface.visualize_pools ( args.pools ) ) + else: + sys.stdout.write ( self.interface.visualize_pool() ) + + sys.stdout.write ( "\n" ) # --- end of do_print_pool (...) --- def do_print ( self, line ): - """Prints the topmost pool (TODO:: or all).""" + """Prints the topmost pool. See --help for usage.""" return self.do_print_pool ( line ) # --- end of do_print (...) --- def do_load_conf ( self, line ): - """Load configured dependency rule files.""" + """Load configured dependency rule files. See --help for usage.""" self.interface.discard_empty_pools() if not self.interface.load_rules_from_config ( ignore_missing=True ): sys.stderr.write ( "failed to load rule files!\n" ) - # --- end of do_load_conf (...) --- + def complete_load ( self, *args, **kw ): + return self.complete_fspath ( *args, **kw ) + # --- end of complete_load (...) --- + + def do_load ( self, line ): + """Loads a dependency rule file. + + Usage: load + + See --help for detailed usage. + """ + self.interface.discard_empty_pools() + + args = self.parse_cmdline ( "load", line ) + if args and args.files: + if not self.interface.load_rule_files ( + args.files, ignore_missing=True + ): + sys.stderr.write ( + "failed to load rule file {!r}\n".format ( line ) + ) + # --- end of do_load (...) --- + + def complete_write ( self, text, *args, **kw ): + return self.complete_fspath ( text, *args, **kw ) + # --- end of complete_write (...) --- + + def do_write ( self, line ): + """Exports the rules of the topmost rule pool into a file. + See --help for usage.""" + args = self.parse_cmdline ( "write", line ) + if args and args.outfile and args.outfile[0]: + outfile = self.get_fspath ( args.outfile[0] ) + if args.force or not os.path.exists ( outfile ): + try: + output = ( + self.interface.visualize_pools() if args.all + else self.interface.visualize_pool() + ) + with open ( outfile, 'wt' ) as FH: + FH.write ( output ) + FH.write ( '\n' ) + except Exception as err: + sys.stderr.write ( "write failed: {}\n".format ( err ) ) + else: + self.set_lastarg ( outfile ) + sys.stdout.write ( "wrote {!r}\n".format ( outfile ) ) + else: + sys.stderr.write ( "cannot write {!r}: exists\n".format ( outfile ) ) + else: + sys.stderr.write ( "nothing written!\n" ) + # --- end of do_write (...) --- + +# --- end of DepresConsoleInterpreter --- class DepresConsole ( roverlay.console.base.MainConsole ): INTERPRETER_CLS = DepresConsoleInterpreter def get_interface ( self ): return self.root_interface.spawn_interface ( "depres" ) + # --- end of get_interface (...) --- + +# --- end of DepresConsole ---