diff --git a/pisi.e3p b/pisi.e3p index d88b2c8d..c3365ca5 100644 --- a/pisi.e3p +++ b/pisi.e3p @@ -1,7 +1,7 @@ - + Python @@ -446,10 +446,6 @@ tests conflicttests.py - - tests - zipfileexttests.py - pisi environment.py @@ -569,6 +565,10 @@ scripts lspisi + + scripts + pisish + @@ -613,7 +613,7 @@ - + diff --git a/pisi/cli/commands.py b/pisi/cli/commands.py index c1124e1a..0e6b03c1 100644 --- a/pisi/cli/commands.py +++ b/pisi/cli/commands.py @@ -54,10 +54,10 @@ class Command(object): return s @staticmethod - def get_command(cmd, fail=False): + def get_command(cmd, fail=False, args=None): if Command.cmd_dict.has_key(cmd): - return Command.cmd_dict[cmd]() + return Command.cmd_dict[cmd](args) if fail: raise Error(_("Unrecognized command: %s") % cmd) @@ -66,7 +66,7 @@ class Command(object): # instance variabes - def __init__(self): + def __init__(self, args = None): # now for the real parser import pisi self.comar = False @@ -74,7 +74,7 @@ class Command(object): version="%prog " + pisi.__version__) self.options() self.commonopts() - (self.options, self.args) = self.parser.parse_args() + (self.options, self.args) = self.parser.parse_args(args) if self.args: self.args.pop(0) # exclude command arg @@ -203,11 +203,11 @@ If run without parameters, it prints the general help.""" __metaclass__ = autocommand - def __init__(self): + def __init__(self, args = None): #TODO? Discard Help's own usage doc in favor of general usage doc #self.__doc__ = usage_text #self.__doc__ += commands_string() - super(Help, self).__init__() + super(Help, self).__init__(args) name = ("help", "?") @@ -238,8 +238,8 @@ This command deletes unused locks from the database directory.""" __metaclass__ = autocommand - def __init__(self): - super(Clean, self).__init__() + def __init__(self, args=None): + super(Clean, self).__init__(args) name = ("clean", None) @@ -260,8 +260,8 @@ consume a lot of disk space.""" __metaclass__ = autocommand - def __init__(self): - super(DeleteCache, self).__init__() + def __init__(self, args=None): + super(DeleteCache, self).__init__(args) name = ("delete-cache", "dc") @@ -283,8 +283,8 @@ the package in graphviz format to 'pgraph.dot'. __metaclass__ = autocommand - def __init__(self): - super(Graph, self).__init__() + def __init__(self, args=None): + super(Graph, self).__init__(args) def options(self): self.parser.add_option("-r", "--repository", action="store", @@ -364,8 +364,8 @@ unpack, setup, build, install, package. """ __metaclass__ = autocommand - def __init__(self): - super(Build, self).__init__() + def __init__(self, args): + super(Build, self).__init__(args) name = ("build", "bi") @@ -440,8 +440,8 @@ downloaded from a repository containing sources. """ __metaclass__ = autocommand - def __init__(self): - super(Emerge, self).__init__() + def __init__(self, args): + super(Emerge, self).__init__(args) self.comar = True name = ("emerge", "em") @@ -470,8 +470,8 @@ downloaded from a repository containing sources. class PackageOp(Command): """Abstract package operation command""" - def __init__(self): - super(PackageOp, self).__init__() + def __init__(self, args): + super(PackageOp, self).__init__(args) self.comar = True def options(self): @@ -507,8 +507,8 @@ expanded to package names. """ __metaclass__ = autocommand - def __init__(self): - super(Install, self).__init__() + def __init__(self, args): + super(Install, self).__init__(args) name = "install", "it" @@ -552,8 +552,8 @@ expanded to package names. __metaclass__ = autocommand - def __init__(self): - super(Upgrade, self).__init__() + def __init__(self, args): + super(Upgrade, self).__init__(args) name = ("upgrade", "up") @@ -602,8 +602,8 @@ expanded to package names. """ __metaclass__ = autocommand - def __init__(self): - super(Remove, self).__init__() + def __init__(self, args): + super(Remove, self).__init__(args) name = ("remove", "rm") @@ -628,8 +628,8 @@ configures those packages. __metaclass__ = autocommand - def __init__(self): - super(ConfigurePending, self).__init__() + def __init__(self, args): + super(ConfigurePending, self).__init__(args) name = ("configure-pending", "cp") @@ -649,8 +649,8 @@ Usage: info ... """ __metaclass__ = autocommand - def __init__(self): - super(Info, self).__init__() + def __init__(self, args): + super(Info, self).__init__(args) name = ("info", None) @@ -743,8 +743,8 @@ Just give the names of packages. """ __metaclass__ = autocommand - def __init__(self): - super(Check, self).__init__() + def __init__(self, args): + super(Check, self).__init__(args) name = ("check", None) @@ -777,8 +777,8 @@ everything in a single index file. """ __metaclass__ = autocommand - def __init__(self): - super(Index, self).__init__() + def __init__(self, args): + super(Index, self).__init__(args) name = ("index", "ix") @@ -825,8 +825,8 @@ Usage: list-installed __metaclass__ = autocommand - def __init__(self): - super(ListInstalled, self).__init__() + def __init__(self, args): + super(ListInstalled, self).__init__(args) name = ("list-installed", "li") @@ -867,8 +867,8 @@ dirs under /var/lib/pisi """ __metaclass__ = autocommand - def __init__(self): - super(RebuildDb, self).__init__() + def __init__(self, args): + super(RebuildDb, self).__init__(args) name = ("rebuild-db", "rdb") @@ -901,8 +901,8 @@ If no repository is given, all repositories are updated. """ __metaclass__ = autocommand - def __init__(self): - super(UpdateRepo, self).__init__() + def __init__(self,args): + super(UpdateRepo, self).__init__(args) name = ("update-repo", "ur") @@ -938,8 +938,8 @@ NB: We support only local files (e.g., /a/b/c) and http:// URIs at the moment """ __metaclass__ = autocommand - def __init__(self): - super(AddRepo, self).__init__() + def __init__(self, args): + super(AddRepo, self).__init__(args) name = ("add-repo", "ar") @@ -971,8 +971,8 @@ Remove all repository information from the system. """ __metaclass__ = autocommand - def __init__(self): - super(RemoveRepo, self).__init__() + def __init__(self,args): + super(RemoveRepo, self).__init__(args) name = ("remove-repo", "rr") @@ -997,8 +997,8 @@ Lists currently tracked repositories. """ __metaclass__ = autocommand - def __init__(self): - super(ListRepo, self).__init__() + def __init__(self, args): + super(ListRepo, self).__init__(args) name = ("list-repo", "lr") @@ -1022,8 +1022,8 @@ all repositories. """ __metaclass__ = autocommand - def __init__(self): - super(ListAvailable, self).__init__() + def __init__(self, args): + super(ListAvailable, self).__init__(args) name = ("list-available", "la") @@ -1079,8 +1079,8 @@ repositories. """ __metaclass__ = autocommand - def __init__(self): - super(ListComponents, self).__init__() + def __init__(self, args): + super(ListComponents, self).__init__(args) name = ("list-components", "lc") @@ -1116,8 +1116,8 @@ Gives a brief list of sources published in the repositories. """ __metaclass__ = autocommand - def __init__(self): - super(ListSources, self).__init__() + def __init__(self, args): + super(ListSources, self).__init__(args) name = ("list-sources", "ls") @@ -1153,8 +1153,8 @@ Lists the packages that will be upgraded. """ __metaclass__ = autocommand - def __init__(self): - super(ListUpgrades, self).__init__() + def __init__(self, args): + super(ListUpgrades, self).__init__(args) name = ("list-upgrades", "lu") @@ -1195,8 +1195,8 @@ Lists packages waiting to be configured. __metaclass__ = autocommand - def __init__(self): - super(ListPending, self).__init__() + def __init__(self, args): + super(ListPending, self).__init__(args) name = ("list-pending", "lp") @@ -1219,8 +1219,8 @@ in summary, description, and package name fields. """ __metaclass__ = autocommand - def __init__(self): - super(Search, self).__init__() + def __init__(self, args): + super(Search, self).__init__(args) name = ("search", "sr") @@ -1266,8 +1266,8 @@ Finds the installed package which contains the specified file. """ __metaclass__ = autocommand - def __init__(self): - super(SearchFile, self).__init__() + def __init__(self, args): + super(SearchFile, self).__init__(args) name = ("search-file", "sf") diff --git a/pisi/cli/pisicli.py b/pisi/cli/pisicli.py index 899bf125..efc274d9 100644 --- a/pisi/cli/pisicli.py +++ b/pisi/cli/pisicli.py @@ -82,13 +82,13 @@ class PreParser(OptionParser): class PisiCLI(object): - def __init__(self): + def __init__(self, args=None): # first construct a parser for common options # this is really dummy self.parser = PreParser(version="%prog " + pisi.__version__) try: - opts, args = self.parser.parse_args() + opts, args = self.parser.parse_args(args=args) if len(args)==0: # more explicit than using IndexError if 'version' in opts: self.parser.print_version() @@ -100,7 +100,7 @@ class PisiCLI(object): except ParserError: raise Error(_('Command line parsing error')) - self.command = Command.get_command(cmd_name) + self.command = Command.get_command(cmd_name, args) if not self.command: raise Error(_("Unrecognized command: %s") % cmd_name) diff --git a/scripts/pisish b/scripts/pisish new file mode 100755 index 00000000..116aa2ed --- /dev/null +++ b/scripts/pisish @@ -0,0 +1,93 @@ +#!/usr/bin/python +# +# Copyright (C) 2005, TUBITAK/UEKAE +# +# This program is free software; you can redistribute it and/or modify it under +# the terms of the GNU General Public License as published by the Free +# Software Foundation; either version 2 of the License, or (at your option) +# any later version. +# +# Please read the COPYING file. +# +# Authors: Eray, Baris + +import sys +import locale +import traceback +import exceptions +import signal +import bsddb3.db as db +import os + +import pisi.ui +import pisi.context as ctx +from pisi.cli.pisicli import PisiCLI + +import gettext +__trans = gettext.translation('pisi', fallback=True) +_ = __trans.ugettext + +def exit(retval = 0): + pisi.api.finalize() + sys.exit(retval) + + +if __name__ == "__main__": + + locale.setlocale(locale.LC_ALL, '') + print """Welcome to the interactive PISI shell. +Type "help" to see a list of commands. +To end the session, type "exit". +Copyright 2006 (c) Pardus +""" + while 1: + cmd = raw_input('pisi> ') + if cmd.strip()=='exit': + print 'Bye!' + exit() + if cmd.startswith('!'): + cmd = cmd[1:] + os.system(cmd) + continue + try: + cli = PisiCLI(cmd.split()) + cli.run_command() + except pisi.operations.PisiUpgradeException, e: + print _('PISI has been upgraded.') + except Exception, value: + signal.signal(signal.SIGINT, signal.SIG_IGN) # disable further interrupts + ui = pisi.cli.CLI() # make a temporary UI + show_traceback = False + if isinstance(value, exceptions.KeyboardInterrupt): + ui.error(_("Keyboard Interrupt: Exiting...")) + pisi.api.finalize() + sys.exit(1) + elif isinstance(value, pisi.Error): + ui.error(_("Program Terminated.")) + show_traceback = ctx.get_option('debug') + elif isinstance(value, db.DBRunRecoveryError): + ui.error(_("""A database operation has been aborted. You should run pisi + again for normal DB recovery procedure. Make sure you have free disk space. + You have to run rebuild-db only when there is file corruption and database upgrades.""")) + elif isinstance(value, pisi.Exception): + show_traceback = True + ui.error(_("""Unhandled internal exception. + Please file a bug report. (http://bugs.uludag.org.tr)""")) + else: + # For any other exception (possibly Python exceptions) show + # the traceback! + show_traceback = ctx.get_option('debug') + ui.error(_("System Error. Program Terminated.")) + + if ctx.get_option('debug'): + ui.error(u"%s: %s" % (exception, value)) + else: + ui.error(unicode(value)) + + ui.info(_("Please use 'pisi help' for general help.")) + + if show_traceback: + ui.info(_("Traceback:")) + traceback.print_tb(tb) + else: + ui.info(_("Use --debug to see a traceback.")) diff --git a/setup.py b/setup.py index 971d8a19..ef83948a 100755 --- a/setup.py +++ b/setup.py @@ -95,7 +95,7 @@ setup(name="pisi", packages = ['pisi', 'pisi.cli', 'pisi.actionsapi', 'pisi.pxml', 'pisi.search'], scripts = ['pisi-cli', 'scripts/repostats.py', 'scripts/find-lib-deps.py', 'scripts/update-environ.py', 'scripts/lspisi', 'scripts/unpisi', - 'scripts/calc-build-order.py'], + 'scripts/calc-build-order.py', 'scripts/pisish'], cmdclass = { 'install' : Install }