home *** CD-ROM | disk | FTP | other *** search
/ PC World 2002 May / PCWorld_2002-05_cd.bin / Software / TemaCD / activepython / ActivePython-2.1.1.msi / Python21_PPM___init__.py < prev    next >
Encoding:
Python Source  |  2001-07-26  |  30.3 KB  |  799 lines

  1. # Copyright 2001 (C) ActiveState Tool Corp., All Rights Reserved.
  2. #
  3. __version__ = '0.1.0.0'
  4.  
  5. import string, sys, cmd, os, getopt, re, time
  6. from  PPM import ppmconfig
  7. import xml.dom.minidom
  8. import soaptalk
  9. import soaplib
  10.  
  11. #XXX 
  12. #XXX 
  13.  
  14. from types import *
  15. # exceptions, errorreporter objects are imported from this module
  16. from ppmerrors import *  # XXX 
  17. from installer import isurl, isfile, isdir
  18. from errormsg import *                  # the error messages are defined here
  19.  
  20. def CheckPackage(pacname, packages):
  21.     if isurl(pacname) or isfile(pacname):
  22.         pacname = pacname[string.rfind(pacname,'/')+1:]
  23.     for package in packages:
  24.         if package.name.lower() == pacname.lower() or\
  25.            package.primname.lower() == pacname.lower():
  26.             version = package.version
  27.             version = string.replace(version,',','.')
  28.             errorreporter.Error("Version %s of %s is already installed. " \
  29.                   "Use 'verify --upgrade %s (with or without --force).\n" % (version ,
  30. package.name, package.name))
  31.             return 1
  32.     return 0
  33.  
  34. def getMaxAttrLength(PacList,Attr):
  35.     maxNameLength =  0
  36.     for pac in PacList:
  37.         Ln = len(getattr(pac,Attr)) 
  38.         if Ln > maxNameLength:
  39.             maxNameLength = Ln
  40.     return maxNameLength
  41.  
  42. def AnalyzeArgs(args,cnfs):
  43.     if type(args) is StringType:
  44.         args = args.split()
  45.     opts, args = getopt.getopt(args,'', ['case','nocase','abstract','author'])
  46.     pattern = string.join(args,' ')
  47.     if not pattern or pattern=='*':
  48.         pattern = '.*'
  49.     search = ''
  50.     if hasattr(cnfs.options, 'ignorecase'):
  51.         case = int(cnfs.options['ignorecase'])
  52.     else:
  53.         case = 0
  54.     for o,v in opts:
  55.         if o == '--case':
  56.             case = 1
  57.         if o == '--nocase':
  58.             case = 0
  59.         if o == '--author':
  60.             search = 'auth'
  61.         if o == '--abstract':
  62.             search = 'abs'
  63.     try:
  64.         if case:
  65.             compiled_patt = re.compile(pattern)
  66.         else:
  67.             compiled_patt = re.compile(pattern, re.IGNORECASE)
  68.     except re.error:
  69.         raise InvalidRegx(pattern)
  70.  
  71.     return search, pattern, case
  72.  
  73. def AnalyzeSetArgs(args,options):
  74.     if type(args) is StringType:
  75.         args = args.split()
  76.     optins = []
  77.     shortopts = []
  78.     result = {}
  79.     L = options.keys()
  80.     L.sort()
  81.     for x in L:
  82.         optins.append(x+'=')
  83.         if not x[0]+':' in shortopts:
  84.             shortopts.append(x[0]+':')
  85.     optins.append('save')
  86.     shortopts.append('s')              # short option for save
  87.     shortopts.append('a:')              # short option for tracefile
  88.     shortopts.append('o:')              # short option for confirm
  89.     shortopts = string.join(shortopts)
  90.     opts , ars = getopt.getopt(args,shortopts,optins)
  91.     for i in range(len(optins)):
  92.         if optins[i][-1] == '=':
  93.             optins[i]=optins[i][:-1]
  94.     FirstLetters = map((lambda x: x[0]), optins)
  95.     for o,v in opts:
  96.         if o[2:] in optins:
  97.             result[optins[optins.index(o[2:])]] = v
  98.         elif o[1:] == 's':
  99.             result['save']=''
  100.         elif o[1:] == 'a':
  101.             result['tracefile'] = v
  102.         elif o[1:] == 'o':
  103.             result['confirm'] = v
  104.         elif o[1:] in FirstLetters:
  105.             result[optins[FirstLetters.index(o[1:])]] = v
  106.     return result
  107.  
  108. def ServerSearch(rep,pattern='.*',tag='',case=0):
  109.     s = soaptalk.soaptalk(rep.uri,rep.namespace)
  110.     if os.name =='posix' and string.find(sys.platform,'sun')>=0:
  111.         archname = 'sun4-solaris'
  112.     elif os.name =='posix' and string.find(sys.platform,'linux')>=0:
  113.         archname = 'i686-linux'
  114.     elif os.name =='nt' or os.name=='dos':
  115.         archname = 'MSWin32'
  116.     if not case:
  117.         pattern = '(?i)'+pattern
  118.     return s.search_ppds(archname,pattern,tag)
  119.  
  120. def GetMePackages(PPDs):
  121.     if type(PPDs) is TupleType:
  122.         raise BadPPD(str(PPDs))
  123.     if not PPDs:
  124.         errorreporter.Error("package not found!")
  125.         raise PackageNotFound
  126.     elif string.find(PPDs,'404')>=0 or \
  127.          string.find(PPDs,'Not Found')>=0:
  128.         raise PackageNotFound
  129.     else:
  130.         PPDs = str(PPDs)
  131.     try:
  132.         domdom = xml.dom.minidom.parseString(PPDs)
  133.     except Exception, e:
  134.         raise BadPPD(e)
  135.     #try:
  136.     softpkgs = [ppmconfig.Package(x) for x in 
  137.                        domdom.getElementsByTagName("SOFTPKG")]
  138.     #    raise FailInstall("Defective PPD")
  139.     domdom.unlink()
  140.     return softpkgs
  141.  
  142. def DoWeHaveIt(pacname,packages,ignore_case=1):
  143.     if isurl(pacname) or isfile(pacname):
  144.         pacname = pacname[string.rfind(pacname,'/')+1:]
  145.     for package in packages:
  146.         if ignore_case:
  147.             if package.name.lower() == pacname.lower() or\
  148.                package.primname.lower() == pacname.lower():
  149.                 return 1
  150.         else:
  151.             if package.name== pacname or\
  152.                package.primname == pacname:
  153.                 return 1
  154.     return 0
  155.  
  156. # it is possible to pass a URL(or a file) as part of the
  157. # package name(e.g., http://www.something/pacname).
  158. # the following function extract the URL from the
  159. # package name if there is one.
  160. def ExtractLocation(pacname):
  161.     if isurl(pacname) or isfile(pacname):
  162.         return pacname[:string.rfind(pacname,'/')]
  163.     else:
  164.         return ''
  165.  
  166. def GetPPD(location,pac,install):
  167.     def fetchPPD(loco,pac,install):
  168.         ppd = install.fetch_ppd(loco,pac)
  169.         return ppd
  170.         
  171.     if not location:
  172.         return ''
  173.     if type(location) is StringType:
  174.         # attemp to verify packages from this location
  175.         if location:
  176.             if location[-1]!='/':
  177.                 location += '/'
  178.             errorreporter.Msg('Fetching package PPDs from: %s' % location)
  179.             return fetchPPD('',location+pac,install)
  180.     elif type(location) is ListType:
  181.         for loco in location:
  182.             return fetchPPD(loco,pac,install)
  183.     
  184. # compare software version numbers
  185. # if v1 if greater than v2 returns 1, if v2 is greater
  186. # returns -1 and else returns 0
  187. def Compare(v1,v2):
  188.     v1 = string.split(v1,'.')
  189.     v2 = string.split(v2,'.')
  190.     l1 = len(v1)
  191.     l2 = len(v2)
  192.     if l1>l2: length = l2
  193.     else: length = l1
  194.     # version is supposed to be n1.n2.n3.n4 where n(i) belongs to int
  195.     # if version has alphabetic values(alpha, beta) it is substituted
  196.     # for 0
  197.     for v in (v1,v2):
  198.         for i in range(len(v)):
  199.             v[i] = str(v[i])
  200.             try:
  201.                 v[i] = int(v[i])
  202.             except ValueError:
  203.                 v[i] = 0
  204.     for i in range(l1-1,0,-1):
  205.         if v1[i]>v2[i]:
  206.             return 1
  207.         elif v2[i]>v1[i]:
  208.             return -1
  209.     return 0
  210.  
  211. def GetVerifyOpts(args):
  212.     if type(args) is StringType:
  213.         args = args.split()
  214.     opts, packages = getopt.getopt(args,'ful:', ['location=','upgrade','force'])
  215.     location = ''
  216.     force = 0
  217.     upgrade = 0
  218.     for o, v in opts:
  219.         if o in ('--location' , '-l'):
  220.             location = v
  221.         if o in ('--force', '-f'):
  222.             force = 1
  223.         if o in ('--upgrade', '-u'):
  224.             upgrade = 1
  225.     return location, force, upgrade, packages
  226.         
  227. def UpGrade(pkg,rmPkg,location,cnfs,install):
  228.     errorreporter.Msg("Upgrading package '%s'..." % pkg.name)
  229.     if location and type(location) is StringType:
  230.         try:
  231.             install.InstallPackage(pkg.ppd,cnfs,cnfs.options['clean'],\
  232.                                     upgrade=1)
  233.             cnfs.remove_package(rmPkg)
  234.             if location:
  235.                 cnfs.add_package(install.softpkg,location)
  236.             else:
  237.                 cnfs.add_package(install.softpkg,pac)
  238.         except FailInstall , e:
  239.             errorreporter.Error(e)
  240.             return 0
  241.         except PackageNotFound:
  242.             errorreporter.Error('Package (or PPD) not found at %s location.' % location)
  243.             return 0
  244.         except BadPPD, e:
  245.             errorreporter.Error('An error occured during installation: %s' % e)
  246.             return 0
  247.         except AlreadyInstalled, e:
  248.             errorreporter.Error(e)
  249.             return 0
  250.     else:
  251.         locations = cnfs.get_repository_info()
  252.         l = len(locations)
  253.         for loco in locations:
  254.             try:
  255.                 install.InstallPackage(pkg.ppd,cnfs,cnfs.options['clean'],\
  256.                                         upgrade=1)
  257.                 cnfs.remove_package(rmPkg)
  258.                 cnfs.add_package(install.softpkg,loco)
  259.                 return
  260.             except FailInstall, e:
  261.                 errorreporter.Error(e)
  262.                 return 0
  263.             except BadPPD, e:
  264.                 errorreporter.Error(e)
  265.                 return 0
  266.             except PackageNotFound:
  267.                 errorreporter.Error('Package %s not found in the repository %s: %s' % \
  268.                       (pkg.name,loco.name,loco.uri))
  269.                 if l>1 :
  270.                     errorreporter.Msg('Trying the next repository...')
  271.                     l -=1
  272.                     continue
  273.             except BadPPD, e:
  274.                 errorreporter.Error('An error occured during installation: %s' % e)
  275.                 return 0
  276.             except AlreadyInstalled, e:
  277.                 errorreporter.Error(e)
  278.                 return 0
  279. def doMore():
  280.     try:
  281.         answer = raw_input("[press 'q' to quit or 'Enter' to continue...']")
  282.     except EOFError:
  283.         answer = 'q'
  284.     if answer!='q':
  285.         print
  286.         return 0
  287.     else:
  288.         return 1
  289.  
  290. class PyPPM:
  291.         def __init__(self, largs):
  292.             def doit(*arguments):
  293.                 if arguments:
  294.                     return ppmconfig.PPMConfig(arguments[0])
  295.                 else:
  296.                     return ppmconfig.PPMConfig()
  297.                         
  298.             self.interactive = 0
  299.             #checks to see if we should be interactive or not
  300.             if largs:
  301.                 index = 0
  302.                 while index<=len(largs)-1:
  303.                     dd = largs[index]
  304.                     if dd != sys.argv[0] and dd:
  305.                         if dd=='-db':
  306.                             db_index = largs.index(dd)
  307.                             try:
  308.                                 self.cnfs = doit(largs[db_index+1])
  309.                             except IndexError:
  310.                                 errorreporter.Error("You have to specify an argument to -db option."\
  311.                                       " Example: pyppm -db database_name")
  312.                                 self.exit(1) #XXX
  313.                             except BadConfigFile, e:
  314.                                 errorreporter.Error(e)
  315.                                 self.exit(1) #XXX
  316.                             if len(largs)>db_index+2:
  317.                                 largs[db_index:db_index+2] = []
  318.                                 continue
  319.                             else:
  320.                                 largs[db_index:]
  321.                                 break
  322.                         try:
  323.                             getattr(self,'cnfs')
  324.                         except AttributeError:
  325.                             self.cnfs = doit()
  326.                         try:
  327.                             func=getattr(self, 'do_'+str(dd))
  328.                         except AttributeError, e:
  329.                             errorreporter.Error("No such command!: '%s'. "\
  330.                                   "Try 'pyppm help'." % dd)
  331.                             return 0
  332.                         else:
  333.                             if len(largs)>1:
  334.                                 if str(dd)!= 'help': 
  335.                                     funcargs = largs[1:]
  336.                                 elif str(dd)== 'help': 
  337.                                     funcargs = largs[1:][0]
  338.                             elif len(largs)>0:
  339.                                 if str(dd)== 'help':
  340.                                     funcargs = "help"
  341.                                 else:
  342.                                     funcargs = largs[1:]
  343.                         # XXX all of the arg parsing should be
  344.                         # XXX centralized here.
  345.                         rc = func(funcargs)
  346.                         # remember DOS/Unix convention is 0 is success
  347.                         if rc in (1, None):
  348.                             self.exit(0)
  349.                         elif rc==0:
  350.                             self.exit(1)
  351.                         else:
  352.                             raise TypeError("Unknown return code %s" % rc)
  353.                                 
  354.                     else:
  355.                         index += 1
  356.             
  357.             if not hasattr(self, 'cnfs'):
  358.                 self.cnfs = doit()
  359.  
  360.             self.interactive = 1
  361.             errorreporter.formatter.interactive = 1
  362.  
  363.         #XXX we do not have this in this version. There is
  364.         #no standard way of removing python packages
  365.         #def do_remove(self,args):
  366.            # remove a module
  367.            #pass
  368.  
  369.         def do_version(self,args):
  370.             self.page_text(__version__)
  371.  
  372.         def do_querydb(self,args):
  373.           "prints the path to the configuration file."
  374.           self.page_text(os.path.abspath(self.cnfs.config_file_name))
  375.           
  376.         def do_verify(self,args):
  377.           "verify the version of the packages installed."
  378.           try:
  379.               location, force, upgrade, packages = GetVerifyOpts(args)
  380.           except getopt.GetoptError, e:
  381.                 errorreporter.Error(e)
  382.                 return 0
  383.           return self.real_verify(location, force, upgrade, packages)
  384.  
  385.         def real_verify(self, location, force, upgrade, packages):
  386.           """location: string, 
  387.             force: boolean, 
  388.             upgrades: boolean, 
  389.             packages: string"""
  390.           PacObj =  self.cnfs.get_installed_packages() 
  391.           if packages:
  392.               for pac in packages:
  393.                   if not DoWeHaveIt(pac,PacObj,ignore_case=self.cnfs.options['ignorecase']):
  394.                       errorreporter.Error("package %s is not installed. Try 'install' command." % pac)
  395.                       return
  396.           self.cnfs.get_repository_info()
  397.           verbose = self.cnfs.options['verbose']
  398.           install = installer.Installer(verbose, self.page_text)
  399.           if self.cnfs.options['ignorecase']:
  400.               pkgs = map((lambda x: x.name.lower()),PacObj)
  401.           else:
  402.               pkgs = map((lambda x: x.name),PacObj)
  403.           versions = map((lambda x: x.version),PacObj)
  404.           PkgTable= {}
  405.           UpGradeable = []
  406.           for i in range(len(pkgs)):
  407.               PkgTable[pkgs[i]] = str(versions[i]) 
  408.           if len(packages)==0:
  409.               packages = pkgs 
  410.           if not location:
  411.               location = self.cnfs.get_repository_info()
  412.           if self.cnfs.options['ignorecase']:
  413.               packages = map(string.lower,packages)
  414.           for pac in packages:
  415.               ppd = GetPPD(location, pac, install)
  416.               try:
  417.                   pkg = GetMePackages(ppd)[0]
  418.               except Exception, e:
  419.                   errorreporter.Error('did not get a valid response for package %s: %s' % (pac,e))
  420.                   return 0
  421.               if force:
  422.                   UpGradeable.append(pkg)
  423.               elif Compare(PkgTable[pac],pkg.version):
  424.                   UpGradeable.append(pkg)  
  425.                   self.page_text("An upgrade is available for %s." % pkg.name)
  426.               else:
  427.                   self.page_text("%s is up to date." % pkg.name)
  428.           answer = 'y'
  429.           if len(UpGradeable)>0:
  430.               if upgrade and self.interactive \
  431.                  and self.cnfs.options['confirm']==1:
  432.                   arguments = ''
  433.                   for p in UpGradeable:
  434.                       arguments += p.name+ ' '
  435.                   if len(UpGradeable)>0:
  436.                       answer = raw_input("Upgrade package %s? (Y/n): " % arguments)
  437.                       if not answer:
  438.                           answer = 'y'
  439.                   else:
  440.                       answer = raw_input("Upgrade packages? (Y/n): ")
  441.                       if not answer:
  442.                           answer='y'
  443.               if answer.lower()=='y' and upgrade:
  444.                   def FindMyFavoritePackage(pacname,PacObjs):
  445.                       for p in PacObjs:
  446.                           if p.name == pacname:
  447.                               return p
  448.                       return None
  449.                   for p in UpGradeable:
  450.                       rmPkg = FindMyFavoritePackage(p.name , PacObj)
  451.                       try:
  452.                           UpGrade(p,rmPkg,location,self.cnfs,install)
  453.                       except Exception, e:
  454.                           errorreporter.Error('An error occured during installation: %s' % e)
  455.          
  456.         def do_search(self,args):
  457.             #searchs for the requested package
  458.             try:
  459.                 search, pattern, case = AnalyzeArgs(args,self.cnfs)
  460.             except getopt.GetoptError, e:
  461.                 errorreporter.Error(invalid_args % e)
  462.                 return 0
  463.             except InvalidRegx, e:
  464.                 errorreporter.Error(invalid_regular_exp % e)
  465.                 return 0
  466.  
  467.             return self.real_search(search, pattern, case)
  468.  
  469.         def real_search(self, s, p, c):
  470.             """search: repository URL
  471.                pattern: regular expresion
  472.                case: case sensitive (1) or not (0)"""
  473.             
  474.             self.cnfs.get_repository_info()
  475.             for loco in self.cnfs.get_repository_info():
  476.                 errorreporter.Msg('searching %s repository -- URL= %s' % (loco.name , loco.uri))
  477.                 tag = ''
  478.                 if s=='abs':tag = 'ABSTRACT'
  479.                 elif s=='auth':tag = 'AUTHOR'
  480.                 try:
  481.                     PPD = ServerSearch(loco,pattern=p,case=c,tag=tag)
  482.                 except Exception, e:
  483.                     errorreporter.Error(e)
  484.                     return
  485.                 except soaplib.ProtocolError, e:
  486.                     errorreporter.Error('can not access server: ' % e)
  487.                     return
  488.                 try:
  489.                     PacList = GetMePackages(PPD)
  490.                 except Exception, e:
  491.                     errorreporter.Error(e)
  492.                     return
  493.                 errorreporter.formatter.maxname = getMaxAttrLength(PacList,'name')
  494.                 errorreporter.formatter.maxversion = getMaxAttrLength(PacList,'version')
  495.                 errorreporter.formatter.TotalLines = 0
  496.                 self.page_text([repr(pac) for pac in PacList])
  497.  
  498.         def page_text(self, lines):
  499.             if type(lines)==ListType:
  500.                 data = "\n".join(lines)
  501.             else:
  502.                 data = lines
  503.             if self.interactive:
  504.                 import pydoc
  505.         if sys.platform.startswith('win'):
  506.                     pydoc.pager(data)
  507.         else:
  508.             pydoc.ttypager(data)
  509.             else:
  510.                 sys.stdout.write(data.rstrip()+"\n")
  511.  
  512.                         
  513.         def do_query(self,args):
  514.           # query installed packages
  515.           try:
  516.               search, pattern, case = AnalyzeArgs(args,self.cnfs)
  517.           except getopt.GetoptError, e:
  518.               errorreporter.Error(invalid_args % e)
  519.               return
  520.           except InvalidRegx, e:
  521.               errorreporter.Error(invalid_regular_exp % e)
  522.               return
  523.  
  524.           return self.real_query(search, pattern, case)
  525.  
  526.         def real_query(self, search, pattern, case):
  527.           if case:
  528.               compiled_patt = re.compile(pattern)
  529.           else:
  530.               compiled_patt = re.compile(pattern, re.IGNORECASE)
  531.                   
  532.           installed_packages = self.cnfs.get_installed_packages()
  533.           errorreporter.formatter.maxname = getMaxAttrLength(installed_packages,'name')
  534.           errorreporter.formatter.maxversion = getMaxAttrLength(installed_packages,'version')
  535.           errorreporter.formatter.TotalLines = 0
  536.           lines = []
  537.           for p in installed_packages:
  538.                 if search == 'abs':
  539.                     if compiled_patt.search(p.abstract):
  540.                         lines.append(repr(p))
  541.                 elif search == 'auth':
  542.                     if compiled_patt.search(p.author):
  543.                         lines.append(repr(p))
  544.                 else:
  545.                     if compiled_patt.search(p.name):
  546.                         lines.append(repr(p))
  547.  
  548.           self.page_text(lines)
  549.         
  550.         def do_genconfig(self, args):
  551.           # regenerates the configuration file
  552.           import PyPMHelps
  553.           if os.name=='nt':
  554.               OSVALUE='MSWin32'
  555.               tempvar='%TEMP%'
  556.           else:
  557.               OSVALUE=os.name
  558.               tempvar = '$TEMP'
  559.           try:
  560.               self.page_text(PyPMHelps.configstr % (os.name ,
  561.                                     os.environ['TEMP'] , ''))
  562.           except KeyError:
  563.               self.page_text(PyPMHelps.configstr % (os.name , tempvar , ''))
  564.         
  565.         def do_set(self,args):
  566.             # manipulates PPM options
  567.             self.cnfs.get_repository_info()
  568.             if not args:
  569.                 errorreporter.formatter.formatOptions(self.cnfs.options, self.page_text)
  570.                 errorreporter.formatter.formatOptions(self.cnfs.get_repository_info(), self.page_text)
  571.                 return
  572.             try:
  573.                 opts = AnalyzeSetArgs(args,self.cnfs.options)
  574.             except getopt.GetoptError, e:
  575.                 errorreporter.Error(e)
  576.                 return
  577.  
  578.             return self.real_set(opts)
  579.  
  580.         def real_set(self, result):
  581.             """result is a dictionary"""
  582.             SaveIt = 0
  583.             for key in result.keys():
  584.                 if key in self.cnfs.options.keys():
  585.                     errorreporter.Msg('Setting the ''%s'' option...' % key)
  586.                     if type(self.cnfs.options[key]) is IntType:
  587.                         try:
  588.                             self.cnfs.options[key] = int(result[key])
  589.                         except (AttributeError, ValueError):
  590.                             pass # XXX should report options that are
  591.                                  # not integers
  592.                     elif type(self.cnfs.options[key]) is StringType:
  593.                         if result.has_key(key):
  594.                             self.cnfs.options[key] = str(result[key])
  595.                 elif key == 'save':
  596.                     SaveIt = 1
  597.             # reflecting changes on the tracer object
  598.             errorreporter.tracer.verbose = self.cnfs.options['verbose']
  599.             if SaveIt:
  600.                 errorreporter.Msg('Saving the options to config file...')
  601.                 try:
  602.                     self.cnfs.save_options()
  603.                 except Exception, e:
  604.                     errorreporter.Error('An error occured while saving the configuration to the file.') 
  605.             
  606.         def do_exit(self,args):
  607.           sys.exit(0)   
  608.  
  609.         def do_quit(self,args):
  610.           self.do_exit(args)
  611.  
  612.         def do_EOF(self,args):
  613.           self.do_exit(args)
  614.  
  615.     def exit(self,code):
  616.       if self.pause: raw_input('Press any key to continue ...')
  617.       sys.exit(code)
  618.  
  619.         #XXX 
  620.         def do_install(self,args):
  621.           # installs a module
  622.           location = ''
  623.           if type(args) is StringType:
  624.               args = args.split()
  625.           try:
  626.               opts, packages = getopt.getopt(args,'', ['location='])
  627.           except getopt.GetoptError, e:
  628.               errorreporter.Error(e)
  629.               return 
  630.           for o,v in opts:
  631.               if o=='--location':
  632.                   location = v
  633.               else:
  634.                   errorreporter.Error('unrecognized option to install command: %s' % v)
  635.                   return
  636.           if not packages:
  637.               errorreporter.Error("No package was specified. Try 'help install'.")
  638.               return
  639.           if location:
  640.               if location[-1]!='/': location += '/'
  641.  
  642.           return self.real_install(location, packages)
  643.           # def do_install
  644.  
  645.         def real_install(self, location, packages):
  646.           """location of PPDs
  647.              packages: list of packages"""
  648.           self.cnfs.get_installed_packages()
  649.           install = installer.Installer(self.cnfs.options['verbose'],
  650.                 self.page_text)
  651.  
  652.           for pac in packages:
  653.               dont_install = CheckPackage(pac, self.cnfs.InstPackages)
  654.               answer = 'y'
  655.               if dont_install:
  656.                   success = 0
  657.                   continue
  658.               success = 1
  659.               if self.interactive and self.cnfs.options['confirm']==1 and \
  660.                  dont_install==0:
  661.                   answer = raw_input("Install package %s? (Y/n): " % pac)
  662.                   if not answer:
  663.                       answer = 'y'
  664.               elif dont_install==0:
  665.                   answer = 'y'
  666.               if answer.lower() == 'y':
  667.                   self.page_text("Installing package '%s'..." % pac)
  668.                   if location or isurl(pac) or isfile(pac):
  669.                       try:
  670.                           ppd = install.fetch_ppd('',location+pac)
  671.                       except ProtocolError , e:
  672.                           errorreporter.Error(e)
  673.                           return 0
  674.                       except soaplib.ProtocolError, e:
  675.                           errorreporter.Error('can not reach the server: ' % e)
  676.                           return 0
  677.                       except Exception, e: 
  678.                           errorreporter.Error(e)
  679.                           return 0
  680.                       try:
  681.                           install.InstallPackage(ppd,self.cnfs,self.cnfs.options['clean'])
  682.                           if location:
  683.                               self.cnfs.add_package(install.softpkg,location)
  684.                           else:
  685.                               self.cnfs.add_package(install.softpkg,pac)
  686.                       except FailInstall , e:
  687.                           errorreporter.Error(e)
  688.                           return 0
  689.                       except PackageNotFound:
  690.                           errorreporter.Error('Package (or PPD) not found at %s location.' % location)
  691.                           return 0
  692.                       except BadPPD, e:
  693.                           errorreporter.Error('Bad PPD file: %s' % e)
  694.                           return 0
  695.                       except AlreadyInstalled, e:
  696.                           errorreporter.Error(e)
  697.                           return 0
  698.                   else:
  699.                       l = len(self.cnfs.get_repository_info())
  700.                       for loco in self.cnfs.get_repository_info():
  701.                           errorreporter.Msg('Connecting to SOAP server %s...' % loco.name)
  702.                           try:
  703.                               ppd = install.fetch_ppd(loco,pac)
  704.                           except ProtocolError , e:
  705.                               errorreporter.Error(e)
  706.                               return 0
  707.                           except soaplib.ProtocolError, e:
  708.                               errorreporter.Error('can not reach the server: ' % e)
  709.                               return 0
  710.                           except Exception, e: 
  711.                               errorreporter.Error(e)
  712.                               return 0
  713.                           try:
  714.                               install.InstallPackage(ppd,self.cnfs,self.cnfs.options['clean'])
  715.                               self.cnfs.add_package(install.softpkg,loco)
  716.                               break
  717.                           except FailInstall, e:
  718.                               errorreporter.Error(e)
  719.                               return 0
  720.                           except BadPPD, e:
  721.                               errorreporter.Error(e)
  722.                               return 0
  723.                           except PackageNotFound:
  724.                               errorreporter.Error('Package %s not found in the repository %s: %s' % \
  725.                                     (pac,loco.name,loco.uri))
  726.                               if l>1 :
  727.                                   errorreporter.Msg('Trying the next repository...')
  728.                                   l -=1
  729.                               success = 0
  730.                               continue
  731.                           except BadPPD, e:
  732.                               errorreporter.Error('Bad PPD file: %s' % e)
  733.                               return 0
  734.                           except AlreadyInstalled, e:
  735.                               errorreporter.Error(e)
  736.                               return 0
  737.           return 0
  738.  
  739.         def help_querydb(self):
  740.             self.page_text(PyPMHelps.helpquerydb)
  741.  
  742.         def help_install(self):
  743.             self.page_text(PyPMHelps.helpinstall)
  744.  
  745.         def help_query(self):
  746.             self.page_text(PyPMHelps.helpquery)
  747.  
  748.         def help_search(self):
  749.             self.page_text(PyPMHelps.helpsearch)
  750.  
  751.         def help_set(self):
  752.             self.page_text(PyPMHelps.helpset)
  753.  
  754.         def help_version(self):
  755.             self.page_text(PyPMHelps.helpversion)
  756.  
  757.         def help_genconfig(self):
  758.             self.page_text(PyPMHelps.helpgenconfig)
  759.  
  760.         def help_help(self):
  761.             self.page_text(PyPMHelps.helphelp)
  762.  
  763.         def help_verify(self):
  764.             self.page_text(PyPMHelps.helpverify)
  765.  
  766.  
  767.  
  768.  
  769. class Pyshell(cmd.Cmd , PyPPM):
  770.         def __init__(self, args, pause):
  771.         self.pause = pause
  772.                 self.prompt = 'PPM>'
  773.                 cmds = [
  774.                         'genconfig',
  775.                         'help',
  776.                         'install',
  777.                         'query',
  778.                         'remove',
  779.                         'search',
  780.                         'set',
  781.                         'verify',
  782.                         'version',
  783.                         'getconfig',
  784.                         ]
  785.                 if len(args)>0 and type(args) is ListType:
  786.                     PyPPM.__init__(self,args)
  787.                 else:
  788.                     PyPPM.__init__(self, [])
  789.                 cmd.Cmd.__init__(self)
  790.  
  791.         def emptyline(self):
  792.             pass
  793.  
  794.         def preloop(self):
  795.                 self.page_text("""
  796. Copyright (C) 2000-2001 ActiveState Tool Corp., All rights reserved.
  797. ActivePython PPM interactive shell (%s). Type 'help' for available commands.""" % (self.cnfs.version))
  798.  
  799.