diff options
Diffstat (limited to 'pym/gentoolkit/equery/__init__.py')
-rw-r--r-- | pym/gentoolkit/equery/__init__.py | 556 |
1 files changed, 282 insertions, 274 deletions
diff --git a/pym/gentoolkit/equery/__init__.py b/pym/gentoolkit/equery/__init__.py index e5b3deb..cecb5be 100644 --- a/pym/gentoolkit/equery/__init__.py +++ b/pym/gentoolkit/equery/__init__.py @@ -4,12 +4,8 @@ """Gentoo package query tool""" -__all__ = ( - 'format_options', - 'format_package_names', - 'mod_usage' -) -__docformat__ = 'epytext' +__all__ = ("format_options", "format_package_names", "mod_usage") +__docformat__ = "epytext" # version is dynamically set by distutils sdist __version__ = "git" @@ -32,8 +28,8 @@ from gentoolkit.textwrap_ import TextWrapper __productname__ = "equery" __authors__ = ( - 'Karl Trygve Kalleberg - Original author', - 'Douglas Anderson - 0.3.0 author' + "Karl Trygve Kalleberg - Original author", + "Douglas Anderson - 0.3.0 author", ) # ======= @@ -41,318 +37,330 @@ __authors__ = ( # ======= NAME_MAP = { - 'b': 'belongs', - 'k': 'check', - 'd': 'depends', - 'g': 'depgraph', - 'f': 'files', - 'h': 'hasuse', - 'l': 'list_', - 'y': 'keywords', - 'a': 'has', - 'm': 'meta', - 's': 'size', - 'u': 'uses', - 'w': 'which' + "b": "belongs", + "k": "check", + "d": "depends", + "g": "depgraph", + "f": "files", + "h": "hasuse", + "l": "list_", + "y": "keywords", + "a": "has", + "m": "meta", + "s": "size", + "u": "uses", + "w": "which", } # ========= # Functions # ========= + def print_help(with_description=True): - """Print description, usage and a detailed help message. - - @param with_description (bool): Option to print module's __doc__ or not - """ - - if with_description: - print(__doc__) - print(main_usage()) - print() - print(pp.globaloption("global options")) - print(format_options(( - (" -h, --help", "display this help message"), - (" -q, --quiet", "minimal output"), - (" -C, --no-color", "turn off colors"), - (" -N, --no-pipe", "turn off pipe detection"), - (" -V, --version", "display version info") - ))) - print() - print(pp.command("modules") + " (" + pp.command("short name") + ")") - print(format_options(( - (" (b)elongs", "list what package FILES belong to"), - (" chec(k)", "verify checksums and timestamps for PKG"), - (" (d)epends", "list all packages directly depending on ATOM"), - (" dep(g)raph", "display a tree of all dependencies for PKG"), - (" (f)iles", "list all files installed by PKG"), - (" h(a)s", "list all packages for matching ENVIRONMENT data stored in /var/db/pkg"), - (" (h)asuse", "list all packages that have USE flag"), - (" ke(y)words", "display keywords for specified PKG"), - (" (l)ist", "list package matching PKG"), - (" (m)eta", "display metadata about PKG"), - (" (s)ize", "display total size of all files owned by PKG"), - (" (u)ses", "display USE flags for PKG"), - (" (w)hich", "print full path to ebuild for PKG") - ))) + """Print description, usage and a detailed help message. + + @param with_description (bool): Option to print module's __doc__ or not + """ + + if with_description: + print(__doc__) + print(main_usage()) + print() + print(pp.globaloption("global options")) + print( + format_options( + ( + (" -h, --help", "display this help message"), + (" -q, --quiet", "minimal output"), + (" -C, --no-color", "turn off colors"), + (" -N, --no-pipe", "turn off pipe detection"), + (" -V, --version", "display version info"), + ) + ) + ) + print() + print(pp.command("modules") + " (" + pp.command("short name") + ")") + print( + format_options( + ( + (" (b)elongs", "list what package FILES belong to"), + (" chec(k)", "verify checksums and timestamps for PKG"), + (" (d)epends", "list all packages directly depending on ATOM"), + (" dep(g)raph", "display a tree of all dependencies for PKG"), + (" (f)iles", "list all files installed by PKG"), + ( + " h(a)s", + "list all packages for matching ENVIRONMENT data stored in /var/db/pkg", + ), + (" (h)asuse", "list all packages that have USE flag"), + (" ke(y)words", "display keywords for specified PKG"), + (" (l)ist", "list package matching PKG"), + (" (m)eta", "display metadata about PKG"), + (" (s)ize", "display total size of all files owned by PKG"), + (" (u)ses", "display USE flags for PKG"), + (" (w)hich", "print full path to ebuild for PKG"), + ) + ) + ) def expand_module_name(module_name): - """Returns one of the values of NAME_MAP or raises KeyError""" + """Returns one of the values of NAME_MAP or raises KeyError""" - if module_name == 'list': - # list is a Python builtin type, so we must rename our module - return 'list_' - elif module_name in NAME_MAP.values(): - return module_name - else: - return NAME_MAP[module_name] + if module_name == "list": + # list is a Python builtin type, so we must rename our module + return "list_" + elif module_name in NAME_MAP.values(): + return module_name + else: + return NAME_MAP[module_name] def format_options(options): - """Format module options. - - @type options: list - @param options: [('option 1', 'description 1'), ('option 2', 'des... )] - @rtype: str - @return: formatted options string - """ - - result = [] - twrap = TextWrapper(width=CONFIG['termWidth']) - opts = (x[0] for x in options) - descs = (x[1] for x in options) - for opt, desc in zip(opts, descs): - twrap.initial_indent = pp.emph(opt.ljust(25)) - twrap.subsequent_indent = " " * 25 - result.append(twrap.fill(desc)) - - return '\n'.join(result) - - -def format_filetype(path, fdesc, show_type=False, show_md5=False, - show_timestamp=False): - """Format a path for printing. - - @type path: str - @param path: the path - @type fdesc: list - @param fdesc: [file_type, timestamp, MD5 sum/symlink target] - file_type is one of dev, dir, obj, sym, fif. - If file_type is dir, there is no timestamp or MD5 sum. - If file_type is sym, fdesc[2] is the target of the symlink. - @type show_type: bool - @param show_type: if True, prepend the file's type to the formatted string - @type show_md5: bool - @param show_md5: if True, append MD5 sum to the formatted string - @type show_timestamp: bool - @param show_timestamp: if True, append time-of-creation after pathname - @rtype: str - @return: formatted pathname with optional added information - """ - - ftype = fpath = stamp = md5sum = "" - - if fdesc[0] == "obj": - ftype = "file" - fpath = path - stamp = format_timestamp(fdesc[1]) - md5sum = fdesc[2] - elif fdesc[0] == "dir": - ftype = "dir" - fpath = pp.path(path) - elif fdesc[0] == "sym": - ftype = "sym" - stamp = format_timestamp(fdesc[1]) - tgt = fdesc[2].split()[0] - if CONFIG["piping"]: - fpath = path - else: - fpath = pp.path_symlink(path + " -> " + tgt) - elif fdesc[0] == "dev": - ftype = "dev" - fpath = path - elif fdesc[0] == "fif": - ftype = "fifo" - fpath = path - else: - sys.stderr.write( - pp.error("%s has unknown type: %s" % (path, fdesc[0])) - ) - - result = "" - if show_type: - result += "%4s " % ftype - result += fpath - if show_timestamp: - result += " " + stamp - if show_md5: - result += " " + md5sum - - return result + """Format module options. + + @type options: list + @param options: [('option 1', 'description 1'), ('option 2', 'des... )] + @rtype: str + @return: formatted options string + """ + + result = [] + twrap = TextWrapper(width=CONFIG["termWidth"]) + opts = (x[0] for x in options) + descs = (x[1] for x in options) + for opt, desc in zip(opts, descs): + twrap.initial_indent = pp.emph(opt.ljust(25)) + twrap.subsequent_indent = " " * 25 + result.append(twrap.fill(desc)) + + return "\n".join(result) + + +def format_filetype(path, fdesc, show_type=False, show_md5=False, show_timestamp=False): + """Format a path for printing. + + @type path: str + @param path: the path + @type fdesc: list + @param fdesc: [file_type, timestamp, MD5 sum/symlink target] + file_type is one of dev, dir, obj, sym, fif. + If file_type is dir, there is no timestamp or MD5 sum. + If file_type is sym, fdesc[2] is the target of the symlink. + @type show_type: bool + @param show_type: if True, prepend the file's type to the formatted string + @type show_md5: bool + @param show_md5: if True, append MD5 sum to the formatted string + @type show_timestamp: bool + @param show_timestamp: if True, append time-of-creation after pathname + @rtype: str + @return: formatted pathname with optional added information + """ + + ftype = fpath = stamp = md5sum = "" + + if fdesc[0] == "obj": + ftype = "file" + fpath = path + stamp = format_timestamp(fdesc[1]) + md5sum = fdesc[2] + elif fdesc[0] == "dir": + ftype = "dir" + fpath = pp.path(path) + elif fdesc[0] == "sym": + ftype = "sym" + stamp = format_timestamp(fdesc[1]) + tgt = fdesc[2].split()[0] + if CONFIG["piping"]: + fpath = path + else: + fpath = pp.path_symlink(path + " -> " + tgt) + elif fdesc[0] == "dev": + ftype = "dev" + fpath = path + elif fdesc[0] == "fif": + ftype = "fifo" + fpath = path + else: + sys.stderr.write(pp.error("%s has unknown type: %s" % (path, fdesc[0]))) + + result = "" + if show_type: + result += "%4s " % ftype + result += fpath + if show_timestamp: + result += " " + stamp + if show_md5: + result += " " + md5sum + + return result def format_timestamp(timestamp): - """Format a timestamp into, e.g., '2009-01-31 21:19:44' format""" + """Format a timestamp into, e.g., '2009-01-31 21:19:44' format""" - return time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(int(timestamp))) + return time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(int(timestamp))) def initialize_configuration(): - """Setup the standard equery config""" + """Setup the standard equery config""" - # Get terminal size - term_width = pp.output.get_term_size()[1] - if term_width < 1: - # get_term_size() failed. Set a sane default width: - term_width = 80 + # Get terminal size + term_width = pp.output.get_term_size()[1] + if term_width < 1: + # get_term_size() failed. Set a sane default width: + term_width = 80 - # Terminal size, minus a 1-char margin for text wrapping - CONFIG['termWidth'] = term_width - 1 + # Terminal size, minus a 1-char margin for text wrapping + CONFIG["termWidth"] = term_width - 1 - # Guess color output - if (CONFIG['color'] == -1 and os.getenv("NOCOLOR") in ("yes", "true") or - CONFIG['color'] == 0): - pp.output.nocolor() + # Guess color output + if ( + CONFIG["color"] == -1 + and os.getenv("NOCOLOR") in ("yes", "true") + or CONFIG["color"] == 0 + ): + pp.output.nocolor() - if CONFIG['piping']: - CONFIG['verbose'] = False - # set extra wide, should disable wrapping unless - # there is some extra long text - CONFIG['termWidth'] = 600 + if CONFIG["piping"]: + CONFIG["verbose"] = False + # set extra wide, should disable wrapping unless + # there is some extra long text + CONFIG["termWidth"] = 600 - CONFIG['debug'] = bool(os.getenv('DEBUG', False)) + CONFIG["debug"] = bool(os.getenv("DEBUG", False)) def main_usage(): - """Return the main usage message for equery""" + """Return the main usage message for equery""" - return "%(usage)s %(product)s [%(g_opts)s] %(mod_name)s [%(mod_opts)s]" % { - 'usage': pp.emph("Usage:"), - 'product': pp.productname(__productname__), - 'g_opts': pp.globaloption("global-options"), - 'mod_name': pp.command("module-name"), - 'mod_opts': pp.localoption("module-options") - } + return "%(usage)s %(product)s [%(g_opts)s] %(mod_name)s [%(mod_opts)s]" % { + "usage": pp.emph("Usage:"), + "product": pp.productname(__productname__), + "g_opts": pp.globaloption("global-options"), + "mod_name": pp.command("module-name"), + "mod_opts": pp.localoption("module-options"), + } def mod_usage(mod_name="module", arg="pkgspec", optional=False): - """Provide a consistent usage message to the calling module. + """Provide a consistent usage message to the calling module. - @type arg: string - @param arg: what kind of argument the module takes (pkgspec, filename, etc) - @type optional: bool - @param optional: is the argument optional? - """ + @type arg: string + @param arg: what kind of argument the module takes (pkgspec, filename, etc) + @type optional: bool + @param optional: is the argument optional? + """ - return "%(usage)s: %(mod_name)s [%(opts)s] %(arg)s" % { - 'usage': pp.emph("Usage"), - 'mod_name': pp.command(mod_name), - 'opts': pp.localoption("options"), - 'arg': ("[%s]" % pp.emph(arg)) if optional else pp.emph(arg) - } + return "%(usage)s: %(mod_name)s [%(opts)s] %(arg)s" % { + "usage": pp.emph("Usage"), + "mod_name": pp.command(mod_name), + "opts": pp.localoption("options"), + "arg": ("[%s]" % pp.emph(arg)) if optional else pp.emph(arg), + } def parse_global_options(global_opts, args): - """Parse global input args and return True if we should display help for - the called module, else False (or display help and exit from here). - """ - - need_help = False - do_help = False - opts = (opt[0] for opt in global_opts) - for opt in opts: - if opt in ('-h', '--help'): - if args: - need_help = True - else: - do_help = True - elif opt in ('-q','--quiet'): - CONFIG['quiet'] = True - elif opt in ('-C', '--no-color', '--nocolor'): - CONFIG['color'] = 0 - pp.output.nocolor() - elif opt in ('-N', '--no-pipe'): - CONFIG['piping'] = False - elif opt in ('-V', '--version'): - print_version() - sys.exit(0) - elif opt in ('--debug'): - CONFIG['debug'] = True - if do_help: - print_help() - sys.exit(0) - return need_help + """Parse global input args and return True if we should display help for + the called module, else False (or display help and exit from here). + """ + + need_help = False + do_help = False + opts = (opt[0] for opt in global_opts) + for opt in opts: + if opt in ("-h", "--help"): + if args: + need_help = True + else: + do_help = True + elif opt in ("-q", "--quiet"): + CONFIG["quiet"] = True + elif opt in ("-C", "--no-color", "--nocolor"): + CONFIG["color"] = 0 + pp.output.nocolor() + elif opt in ("-N", "--no-pipe"): + CONFIG["piping"] = False + elif opt in ("-V", "--version"): + print_version() + sys.exit(0) + elif opt in ("--debug"): + CONFIG["debug"] = True + if do_help: + print_help() + sys.exit(0) + return need_help def print_version(): - """Print the version of this tool to the console.""" + """Print the version of this tool to the console.""" - print("%(product)s (%(version)s) - %(docstring)s" % { - "product": pp.productname(__productname__), - "version": __version__, - "docstring": __doc__ - }) + print( + "%(product)s (%(version)s) - %(docstring)s" + % { + "product": pp.productname(__productname__), + "version": __version__, + "docstring": __doc__, + } + ) def split_arguments(args): - """Separate module name from module arguments""" + """Separate module name from module arguments""" - return args.pop(0), args + return args.pop(0), args def main(argv): - """Parse input and run the program.""" - - short_opts = "hqCNV" - long_opts = ( - 'help', 'quiet', 'nocolor', 'no-color', 'no-pipe', 'version', 'debug' - ) - - initialize_configuration() - - try: - global_opts, args = getopt(argv[1:], short_opts, long_opts) - except GetoptError as err: - sys.stderr.write(pp.error("Global %s" % err)) - print_help(with_description=False) - sys.exit(2) - - # Parse global options - need_help = parse_global_options(global_opts, args) - - # verbose is shorthand for the very common 'not quiet or piping' - if CONFIG['quiet'] or CONFIG['piping']: - CONFIG['verbose'] = False - else: - CONFIG['verbose'] = True - - try: - module_name, module_args = split_arguments(args) - except IndexError: - print_help() - sys.exit(2) - - if need_help: - module_args.append('--help') - - try: - expanded_module_name = expand_module_name(module_name) - except KeyError: - sys.stderr.write(pp.error("Unknown module '%s'" % module_name)) - print_help(with_description=False) - sys.exit(2) - - try: - loaded_module = __import__( - expanded_module_name, globals(), locals(), [], 1 - ) - loaded_module.main(module_args) - except portage.exception.AmbiguousPackageName as err: - raise errors.GentoolkitAmbiguousPackage(err.args[0]) - except IOError as err: - if err.errno != errno.EPIPE: - raise - -if __name__ == '__main__': - main(sys.argv) + """Parse input and run the program.""" + + short_opts = "hqCNV" + long_opts = ("help", "quiet", "nocolor", "no-color", "no-pipe", "version", "debug") + + initialize_configuration() + + try: + global_opts, args = getopt(argv[1:], short_opts, long_opts) + except GetoptError as err: + sys.stderr.write(pp.error("Global %s" % err)) + print_help(with_description=False) + sys.exit(2) + + # Parse global options + need_help = parse_global_options(global_opts, args) + + # verbose is shorthand for the very common 'not quiet or piping' + if CONFIG["quiet"] or CONFIG["piping"]: + CONFIG["verbose"] = False + else: + CONFIG["verbose"] = True + + try: + module_name, module_args = split_arguments(args) + except IndexError: + print_help() + sys.exit(2) + + if need_help: + module_args.append("--help") + + try: + expanded_module_name = expand_module_name(module_name) + except KeyError: + sys.stderr.write(pp.error("Unknown module '%s'" % module_name)) + print_help(with_description=False) + sys.exit(2) + + try: + loaded_module = __import__(expanded_module_name, globals(), locals(), [], 1) + loaded_module.main(module_args) + except portage.exception.AmbiguousPackageName as err: + raise errors.GentoolkitAmbiguousPackage(err.args[0]) + except IOError as err: + if err.errno != errno.EPIPE: + raise + + +if __name__ == "__main__": + main(sys.argv) |