biraz şekle soktum. komutların her birini sınıf yapmak getattr magiclerinden kurtardı bizi.
This commit is contained in:
+182
-157
@@ -6,6 +6,8 @@ from optparse import OptionParser
|
||||
import pisi
|
||||
from pisi.config import config
|
||||
|
||||
|
||||
# globals
|
||||
usage = """%prog <command> [options] [arguments]
|
||||
|
||||
where <command> is one of:
|
||||
@@ -23,100 +25,63 @@ Use \"%prog help <command>\" for help on a specific subcommand.
|
||||
PISI Package Manager
|
||||
"""
|
||||
|
||||
class ParserError:
|
||||
def __init__(self, msg):
|
||||
self.msg = msg
|
||||
# helper functions
|
||||
def cmdObject(cmd, fail=False):
|
||||
commands = {"help": Help,
|
||||
"build": Build,
|
||||
"info": Info,
|
||||
"install": Install,
|
||||
"remove": Remove,
|
||||
"index": Index,
|
||||
"updatedb": UpdateDB}
|
||||
|
||||
class Parser(OptionParser):
|
||||
if commands.has_key(cmd):
|
||||
obj = commands[cmd]()
|
||||
return obj
|
||||
|
||||
def __init__(self, usage, version):
|
||||
OptionParser.__init__(self, usage=usage, version=version)
|
||||
if fail:
|
||||
print "Unrecognized command: ", cmd
|
||||
sys.exit(1)
|
||||
else:
|
||||
return None
|
||||
|
||||
def error(self, msg):
|
||||
raise ParserError(msg)
|
||||
|
||||
# eheh, burada ne yaptigim anlasilamamis galiba
|
||||
# sunlari yazin:
|
||||
# pisi-cli --test remove x
|
||||
# pisi-cli --test build x
|
||||
# diger turlu olmaz bu. dikkat. per command optionlar
|
||||
# svn log'unda anlatmistim. simdi bir daha yazmam gerekti bazi
|
||||
# seyleri bastan calistirabilmek icin. bir ise yaramasa yapmazdim.
|
||||
|
||||
class PisiCLI(object):
|
||||
|
||||
commands = ["help", "build", "info", "install",
|
||||
"remove", "index", "updatedb"]
|
||||
|
||||
def commonopts(self):
|
||||
p = self.parser
|
||||
p.add_option("-D", "--destdir", action="store")
|
||||
p.add_option("-u", "--username", action="store")
|
||||
p.add_option("-p", "--password", action="store")
|
||||
p.add_option("-P", action="store_true", dest="getpass", default=False,
|
||||
help="Get password from the command line")
|
||||
p.add_option("-v", "--verbose", action="store_true",
|
||||
dest="verbose", default=False,
|
||||
help="detailed output")
|
||||
p.add_option("-d", "--debug", action="store_true",
|
||||
default=True, help="show debugging information")
|
||||
p.add_option("-n", "--dry-run", action="store_true", default=False,
|
||||
help = "do not perform any action, just show what\
|
||||
would be done")
|
||||
def commonopts(parser):
|
||||
p = parser
|
||||
p.add_option("-D", "--destdir", action="store")
|
||||
p.add_option("-u", "--username", action="store")
|
||||
p.add_option("-p", "--password", action="store")
|
||||
p.add_option("-P", action="store_true", dest="getpass", default=False,
|
||||
help="Get password from the command line")
|
||||
p.add_option("-v", "--verbose", action="store_true",
|
||||
dest="verbose", default=False,
|
||||
help="detailed output")
|
||||
p.add_option("-d", "--debug", action="store_true",
|
||||
default=True, help="show debugging information")
|
||||
p.add_option("-n", "--dry-run", action="store_true", default=False,
|
||||
help = "do not perform any action, just show what\
|
||||
would be done")
|
||||
return p
|
||||
|
||||
|
||||
######## start commands #########
|
||||
class Command(object):
|
||||
"""generic help string for any command"""
|
||||
def __init__(self):
|
||||
# first construct a parser for common options
|
||||
# this is really dummy
|
||||
self.parser = Parser(usage=usage, version="%prog " + pisi.__version__)
|
||||
#self.parser.allow_interspersed_args = False
|
||||
self.commonopts()
|
||||
|
||||
self.command = ""
|
||||
try:
|
||||
(options, args) = self.parser.parse_args()
|
||||
#if len(parser.rargs)==0:
|
||||
# self.die()
|
||||
self.command = args[0]
|
||||
except ParserError:
|
||||
# fully expected :) let's see if we got an argument
|
||||
if len(self.parser.rargs)==0:
|
||||
self.die()
|
||||
self.command = self.parser.rargs[0]
|
||||
|
||||
#print '*', self.command
|
||||
|
||||
# now for the real parser THIS IS ABSOLUTELY NECESSARY
|
||||
self.parser = OptionParser(usage=usage,
|
||||
version="%prog " + pisi.__version__)
|
||||
#self.parser.allow_interspersed_args = False
|
||||
self.commonopts()
|
||||
self.add_subcommand_opts()
|
||||
self.options()
|
||||
self.parsr = commonopts(self.parser)
|
||||
(self.options, args) = self.parser.parse_args()
|
||||
self.args = args[1:]
|
||||
|
||||
self.authInfo = None
|
||||
self.checkAuthInfo()
|
||||
|
||||
def die(self):
|
||||
print usage
|
||||
sys.exit(1)
|
||||
|
||||
def add_subcommand_opts(self):
|
||||
if self.command in self.commands:
|
||||
f = self.__getattribute__(self.command + '_opts')
|
||||
f()
|
||||
else:
|
||||
print 'Unrecognized command:', self.command
|
||||
self.die()
|
||||
|
||||
def runCommand(self):
|
||||
if self.command in self.commands:
|
||||
f = self.__getattribute__(self.command)
|
||||
f()
|
||||
else:
|
||||
print 'Unrecognized command:', self.command
|
||||
self.die()
|
||||
def options(self):
|
||||
"""This is a fall back function. If the implementer module provides an
|
||||
options function it will be called"""
|
||||
pass
|
||||
|
||||
def checkAuthInfo(self):
|
||||
username = self.options.username
|
||||
@@ -124,7 +89,7 @@ class PisiCLI(object):
|
||||
if not username and not password:
|
||||
if config.username and config.password:
|
||||
self.authInfo = (config.username, config.password)
|
||||
return
|
||||
return
|
||||
elif username and password:
|
||||
self.authInfo = (username, password)
|
||||
return
|
||||
@@ -133,37 +98,87 @@ class PisiCLI(object):
|
||||
from getpass import getpass
|
||||
password = getpass("Password: ")
|
||||
self.authInfo = (username, password)
|
||||
return
|
||||
|
||||
else:
|
||||
self.authInfo = None
|
||||
|
||||
# FIX: her komut için ayrı help
|
||||
def help(self):
|
||||
print getattr(self, "__doc__")
|
||||
|
||||
help_help = """help: display help
|
||||
usage: help
|
||||
help <command>"""
|
||||
|
||||
def help_opts(self):
|
||||
pass
|
||||
class Help(Command):
|
||||
"""prints usage"""
|
||||
def __init__(self):
|
||||
super(Help, self).__init__()
|
||||
|
||||
def help(self, command=""):
|
||||
if not self.args:
|
||||
def run(self, args=None):
|
||||
if not args:
|
||||
print usage
|
||||
return
|
||||
|
||||
for arg in args:
|
||||
obj = cmdObject(arg, True)
|
||||
obj.help()
|
||||
|
||||
class Build(Command):
|
||||
"""build: compile PISI package using a pspec.xml file"""
|
||||
def __init__(self):
|
||||
super(Build, self).__init__()
|
||||
|
||||
if command !="":
|
||||
print self.__getattribute__(command + '_help')
|
||||
else:
|
||||
print self.__getattribute__(self.args[0] + '_help')
|
||||
|
||||
info_help = """info: display information about a package
|
||||
usage: info <package> ...
|
||||
"""
|
||||
def info_opts(self):
|
||||
pass
|
||||
|
||||
def info(self):
|
||||
def run(self):
|
||||
if not self.args:
|
||||
self.help("info")
|
||||
self.help()
|
||||
return
|
||||
|
||||
from pisi.cli import buildhelper
|
||||
for arg in self.args:
|
||||
buildhelper.build(arg, self.authInfo)
|
||||
|
||||
class Install(Command):
|
||||
"""install: install PISI packages"""
|
||||
def __init__(self):
|
||||
super(Install, self).__init__()
|
||||
|
||||
def options(self):
|
||||
self.parser.add_option("", "--test", action="store_true",
|
||||
default=True, help="xxxx")
|
||||
|
||||
def run(self):
|
||||
if not self.args:
|
||||
self.help()
|
||||
return
|
||||
|
||||
from pisi.cli import installhelper
|
||||
for arg in self.args:
|
||||
installhelper.install(arg)
|
||||
|
||||
|
||||
class Remove(Command):
|
||||
"""remove: remove PISI packages"""
|
||||
def __init__(self):
|
||||
super(Remove, self).__init__()
|
||||
|
||||
def options(self):
|
||||
self.parser.add_option("", "--test", action="store_true",
|
||||
default=True, help="xxxx")
|
||||
|
||||
def run(self):
|
||||
if not self.args:
|
||||
self.help()
|
||||
return
|
||||
|
||||
for arg in self.args:
|
||||
pisi.install.remove(arg)
|
||||
|
||||
class Info(Command):
|
||||
"""info: display information about a package
|
||||
usage: info <package> ..."""
|
||||
def __init__(self):
|
||||
super(Info, self).__init__()
|
||||
|
||||
def run(self):
|
||||
if not self.args:
|
||||
self.help()
|
||||
return
|
||||
|
||||
for arg in self.args:
|
||||
self.printinfo(arg)
|
||||
|
||||
@@ -173,16 +188,17 @@ usage: info <package> ...
|
||||
metadata, files = pisi.install.get_pkg_info(arg)
|
||||
print metadata.package
|
||||
|
||||
index_help = """index: Index PISI files in a given directory"""
|
||||
class Index(Command):
|
||||
"""index: Index PISI files in a given directory"""
|
||||
def __init__(self):
|
||||
super(Index, self).__init__()
|
||||
|
||||
def index_opts(self):
|
||||
pass
|
||||
|
||||
def index(self):
|
||||
from pisi.cli import indexhelper
|
||||
def run(self):
|
||||
if not self.args:
|
||||
self.help("index")
|
||||
self.help()
|
||||
return
|
||||
|
||||
from pisi.cli import indexhelper
|
||||
if len(self.args)==1:
|
||||
indexhelper.index(self.args[0])
|
||||
elif len(self.args)==0:
|
||||
@@ -191,54 +207,63 @@ usage: info <package> ...
|
||||
print 'Indexing only a single directory supported'
|
||||
self.die()
|
||||
|
||||
install_help = """install: install PISI packages"""
|
||||
class UpdateDB(Command):
|
||||
"""updatedb: update source and package databases"""
|
||||
def __init__(self):
|
||||
super(UpdateDB, self).__init__()
|
||||
|
||||
def install_opts(self):
|
||||
self.parser.add_option("", "--test", action="store_true",
|
||||
default=True, help="xxxx")
|
||||
|
||||
def install(self):
|
||||
from pisi.cli import installhelper
|
||||
if not self.args:
|
||||
self.help("install")
|
||||
for arg in self.args:
|
||||
installhelper.install(arg)
|
||||
|
||||
build_help = """build: compile PISI packages"""
|
||||
|
||||
def build_opts(self):
|
||||
pass
|
||||
|
||||
def build(self):
|
||||
from pisi.cli import buildhelper
|
||||
|
||||
if not self.args:
|
||||
self.help("build")
|
||||
|
||||
for arg in self.args:
|
||||
buildhelper.build(arg, self.authInfo)
|
||||
|
||||
remove_help = """remove: remove PISI packages"""
|
||||
|
||||
def remove_opts(self):
|
||||
self.parser.add_option("", "--test", action="store_true",
|
||||
default=True, help="xxxx")
|
||||
|
||||
def remove(self):
|
||||
if not self.args:
|
||||
self.help("install")
|
||||
for arg in self.args:
|
||||
pisi.install.remove(arg)
|
||||
|
||||
updatedb_help = """updatedb: update source and package databases"""
|
||||
|
||||
def updatedb_opts(self):
|
||||
pass
|
||||
|
||||
def updatedb(self):
|
||||
"""Update the repos db with the given index file (pisi-index.xml)"""
|
||||
def run(self):
|
||||
if len(self.args) != 1:
|
||||
self.help("updatedb")
|
||||
self.help()
|
||||
return
|
||||
|
||||
indexfile = self.args[0]
|
||||
indexhelper.updatedb(indexfile)
|
||||
######## end commands #########
|
||||
|
||||
class ParserError:
|
||||
def __init__(self, msg):
|
||||
self.msg = msg
|
||||
|
||||
class Parser(OptionParser):
|
||||
def __init__(self, usage, version):
|
||||
OptionParser.__init__(self, usage=usage, version=version)
|
||||
|
||||
def error(self, msg):
|
||||
raise ParserError(msg)
|
||||
|
||||
class PisiCLI(object):
|
||||
|
||||
def __init__(self):
|
||||
# first construct a parser for common options
|
||||
# this is really dummy
|
||||
self.parser = Parser(usage=usage, version="%prog " + pisi.__version__)
|
||||
#self.parser.allow_interspersed_args = False
|
||||
self.parser = commonopts(self.parser)
|
||||
|
||||
cmd = ""
|
||||
try:
|
||||
(options, args) = self.parser.parse_args()
|
||||
#if len(parser.rargs)==0:
|
||||
# self.die()
|
||||
cmd = args[0]
|
||||
except IndexError:
|
||||
self.die()
|
||||
except ParserError:
|
||||
# fully expected :) let's see if we got an argument
|
||||
if len(self.parser.rargs)==0:
|
||||
self.die()
|
||||
cmd = self.parser.rargs[0]
|
||||
|
||||
#print '*', cmd
|
||||
self.command = cmdObject(cmd)
|
||||
if not self.command:
|
||||
print "Unrecognized command: ", cmd
|
||||
self.die()
|
||||
|
||||
def die(self):
|
||||
print usage
|
||||
sys.exit(1)
|
||||
|
||||
def runCommand(self):
|
||||
self.command.run()
|
||||
|
||||
Reference in New Issue
Block a user