home *** CD-ROM | disk | FTP | other *** search
/ Clickx 115 / Clickx 115.iso / software / tools / windows / tails-i386-0.16.iso / live / filesystem.squashfs / usr / share / python / debpython / depends.py < prev    next >
Encoding:
Python Source  |  2012-05-04  |  6.8 KB  |  173 lines

  1. # -*- coding: UTF-8 -*-
  2. # Copyright ┬⌐ 2010 Piotr O┼╝arowski <piotr@debian.org>
  3. #
  4. # Permission is hereby granted, free of charge, to any person obtaining a copy
  5. # of this software and associated documentation files (the "Software"), to deal
  6. # in the Software without restriction, including without limitation the rights
  7. # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  8. # copies of the Software, and to permit persons to whom the Software is
  9. # furnished to do so, subject to the following conditions:
  10. #
  11. # The above copyright notice and this permission notice shall be included in
  12. # all copies or substantial portions of the Software.
  13. #
  14. # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  15. # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  16. # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  17. # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  18. # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  19. # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  20. # THE SOFTWARE.
  21.  
  22. import logging
  23. from debpython.pydist import parse_pydep, guess_dependency
  24. from debpython.version import SUPPORTED, DEFAULT, debsorted, vrepr, vrange_str
  25.  
  26. # minimum version required for pycompile/pyclean
  27. MINPYCDEP = 'python (>= 2.6.6-3+squeeze3~)'
  28.  
  29. log = logging.getLogger(__name__)
  30.  
  31.  
  32. class Dependencies(object):
  33.     """Store relations (dependencies, etc.) between packages."""
  34.  
  35.     def __init__(self, package, use_breaks=False):
  36.         self.package = package
  37.         self.use_breaks = use_breaks
  38.         self.depends = []
  39.         self.recommends = []
  40.         self.suggests = []
  41.         self.enhances = []
  42.         self.breaks = []
  43.         self.rtscripts = []
  44.  
  45.     def export_to(self, dh):
  46.         """Fill in debhelper's substvars."""
  47.         for i in self.depends:
  48.             dh.addsubstvar(self.package, 'python:Depends', i)
  49.         for i in self.recommends:
  50.             dh.addsubstvar(self.package, 'python:Recommends', i)
  51.         for i in self.suggests:
  52.             dh.addsubstvar(self.package, 'python:Suggests', i)
  53.         for i in self.enhances:
  54.             dh.addsubstvar(self.package, 'python:Enhances', i)
  55.         for i in self.breaks:
  56.             dh.addsubstvar(self.package, 'python:Breaks', i)
  57.         for i in self.rtscripts:
  58.             dh.add_rtupdate(self.package, i)
  59.  
  60.     def __str__(self):
  61.         return "D=%s; R=%s; S=%s; E=%s, B=%s; RT=%s" % (self.depends, \
  62.                 self.recommends, self.suggests, self.enhances, \
  63.                 self.breaks, self.rtscripts)
  64.  
  65.     def depend(self, value):
  66.         if value and value not in self.depends:
  67.             self.depends.append(value)
  68.  
  69.     def recommend(self, value):
  70.         if value and value not in self.recommends:
  71.             self.recommends.append(value)
  72.  
  73.     def suggest(self, value):
  74.         if value and value not in self.suggests:
  75.             self.suggests.append(value)
  76.  
  77.     def enhance(self, value):
  78.         if value and value not in self.enhances:
  79.             self.enhances.append(value)
  80.  
  81.     def break_(self, value):
  82.         if value and value not in self.breaks:
  83.             self.breaks.append(value)
  84.  
  85.     def rtscript(self, value):
  86.         if value not in self.rtscripts:
  87.             self.rtscripts.append(value)
  88.  
  89.     def parse(self, stats, options):
  90.         log.debug('generating dependencies for package %s', self.package)
  91.  
  92.         pub_vers = sorted(stats['public_vers'].union(stats['public_ext']))
  93.         if pub_vers:
  94.             dbgpkg = self.package.endswith('-dbg')
  95.             tpl = 'python-dbg' if dbgpkg else 'python'
  96.             supported = sorted(SUPPORTED)
  97.             min_supp = supported[0]
  98.             max_supp = supported[-1]
  99.             minv = pub_vers[0]
  100.             maxv = pub_vers[-1]
  101.             if dbgpkg:
  102.                 tpl2 = 'python%d.%d-dbg'
  103.             else:
  104.                 tpl2 = 'python%d.%d'
  105.             self.depend(' | '.join(tpl2 % i for i in debsorted(pub_vers)))
  106.  
  107.             # additional Breaks/Depends to block python package transitions
  108.             if self.use_breaks:
  109.                 if minv <= min_supp:
  110.                     self.break_("%s (<< %d.%d)" % \
  111.                                 (tpl, minv[0], minv[1]))
  112.                 if maxv >= max_supp:
  113.                     self.break_("%s (>= %d.%d)" % \
  114.                                 (tpl, maxv[0], maxv[1] + 1))
  115.             else:
  116.                 if minv <= DEFAULT:
  117.                     self.depend("%s (>= %d.%d)" % \
  118.                                 (tpl, minv[0], minv[1]))
  119.                 if maxv >= DEFAULT:
  120.                     self.depend("%s (<< %d.%d)" % \
  121.                                 (tpl, maxv[0], maxv[1] + 1))
  122.  
  123.         # make sure pycompile binary is available
  124.         if stats['compile']:
  125.             self.depend(MINPYCDEP)
  126.  
  127.         for interpreter, version in stats['shebangs']:
  128.             self.depend(interpreter)
  129.  
  130.         for private_dir, details in stats['private_dirs'].iteritems():
  131.             versions = list(v for i, v in details.get('shebangs', []) if v)
  132.             if len(versions) > 1:
  133.                 log.error('more than one Python dependency from shebangs'
  134.                           '(%s shebang versions: %s)', private_dir, versions)
  135.                 exit(13)
  136.             elif len(versions) == 1:  # one hardcoded version
  137.                 self.depend("python%d.%d" % versions[0])
  138.                 # TODO: if versions[0] not in requested_versions: FTBFS
  139.             elif details.get('compile', False):
  140.                 # no hardcoded versions, but there's something to compile
  141.                 self.depend(MINPYCDEP)
  142.                 args = ''
  143.                 vr = options.vrange
  144.                 if vr:
  145.                     args += "-V %s" % vrange_str(vr)
  146.                     if vr[0]:  # minimum version specified
  147.                         self.depend("python (>= %s)" % vrepr(vr[0]))
  148.                     if vr[1]:  # maximum version specified
  149.                         self.depend("python (<< %s)" % vrepr(vr[1]))
  150.  
  151.                 for pattern in options.regexpr or []:
  152.                     args += " -X '%s'" % pattern.replace("'", r"\'")
  153.                 self.rtscript((private_dir, args))
  154.  
  155.         if options.guess_deps:
  156.             for fn in stats['requires.txt']:
  157.                 # TODO: should options.recommends and options.suggests be
  158.                 # removed from requires.txt?
  159.                 for i in parse_pydep(fn):
  160.                     self.depend(i)
  161.  
  162.         # add dependencies from --depends
  163.         for item in options.depends or []:
  164.             self.depend(guess_dependency(item))
  165.         # add dependencies from --recommends
  166.         for item in options.recommends or []:
  167.             self.recommend(guess_dependency(item))
  168.         # add dependencies from --suggests
  169.         for item in options.suggests or []:
  170.             self.suggest(guess_dependency(item))
  171.  
  172.         log.debug(self)
  173.