Package backend :: Package server :: Package importlib :: Module debPackage
[hide private]
[frames] | no frames]

Source Code for Module backend.server.importlib.debPackage

  1  # 
  2  # Copyright (c) 2010--2016 Red Hat, Inc. 
  3  # 
  4  # This software is licensed to you under the GNU General Public License, 
  5  # version 2 (GPLv2). There is NO WARRANTY for this software, express or 
  6  # implied, including the implied warranties of MERCHANTABILITY or FITNESS 
  7  # FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2 
  8  # along with this software; if not, see 
  9  # http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. 
 10  # 
 11  # Red Hat trademarks are not licensed under GPLv2. No permission is 
 12  # granted to use or replicate Red Hat trademarks that are incorporated 
 13  # in this software or its documentation. 
 14  # 
 15  # 
 16  # Converts headers to the intermediate format 
 17  # 
 18   
 19  import headerSource 
 20  import time 
 21  from importLib import Channel 
 22  from backendLib import gmtime, localtime 
 23  from spacewalk.common.usix import IntType, UnicodeType 
 24  from spacewalk.common.stringutils import to_string 
 25   
 26   
27 -class debBinaryPackage(headerSource.rpmBinaryPackage):
28
29 - def __init__(self, header, size, checksum_type, checksum, path=None, org_id=None, 30 channels=[]):
31 32 headerSource.rpmBinaryPackage.__init__(self) 33 34 self.tagMap = headerSource.rpmBinaryPackage.tagMap.copy() 35 self.tagMap.update({ 36 'multi_arch': 'Multi-Arch', 37 }) 38 39 # Remove already-mapped tags 40 self._already_mapped = [ 41 'rpm_version', 'payload_size', 'payload_format', 42 'package_group', 'build_time', 'build_host' 43 ] 44 45 for t in self._already_mapped: 46 if t in self.tagMap: 47 del self.tagMap[t] 48 49 # XXX is seems to me that this is the place that 'source_rpm' is getting 50 # set 51 for f in self.keys(): 52 field = f 53 if f in self.tagMap: 54 field = self.tagMap[f] 55 if not field: 56 # Unsupported 57 continue 58 59 # get the db field value from the header 60 val = header[field] 61 if f == 'build_time': 62 if val is not None and isinstance(val, IntType): 63 # A UNIX timestamp 64 val = localtime(val) 65 elif val: 66 # Convert to strings 67 if isinstance(val, UnicodeType): 68 val = to_string(val) 69 else: 70 val = str(val) 71 elif val == []: 72 val = None 73 self[f] = val 74 75 self['package_size'] = size 76 self['checksum_type'] = checksum_type 77 self['checksum'] = checksum 78 self['path'] = path 79 self['org_id'] = org_id 80 self['header_start'] = None 81 self['header_end'] = None 82 self['last_modified'] = localtime(time.time()) 83 if self['sigmd5']: 84 self['sigchecksum_type'] = 'md5' 85 self['sigchecksum'] = self['sigmd5'] 86 del(self['sigmd5']) 87 88 # Fix some of the information up 89 vendor = self['vendor'] 90 if vendor is None: 91 self['vendor'] = 'Debian' 92 payloadFormat = self['payload_format'] 93 if payloadFormat is None: 94 self['payload_format'] = 'ar' 95 if self['payload_size'] is None: 96 self['payload_size'] = 0 97 98 # Populate file information 99 self._populateFiles(header) 100 # Populate dependency information 101 self._populateDependencyInformation(header) 102 # Populate changelogs 103 self._populateChangeLog(header) 104 # Channels 105 self._populateChannels(channels) 106 107 self['source_rpm'] = None 108 109 group = self.get('package_group', '') 110 if group == '' or group is None: 111 self['package_group'] = 'NoGroup'
112
113 - def _populateFiles(self, header):
114 files = [] 115 # for f in header.get('files', []): 116 # fc = headerSource.rpmFile() 117 # fc.populate(f) 118 # files.append(fc) 119 self['files'] = files
120
121 - def _populateDependencyInformation(self, header):
122 mapping = { 123 'provides': headerSource.rpmProvides, 124 'requires': headerSource.rpmRequires, 125 'conflicts': headerSource.rpmConflicts, 126 'obsoletes': headerSource.rpmObsoletes, 127 'suggests': headerSource.rpmSuggests, 128 'recommends': headerSource.rpmRecommends, 129 'breaks': headerSource.rpmBreaks, 130 'predepends': headerSource.rpmPredepends, 131 } 132 for k, dclass in mapping.items(): 133 l = [] 134 values = header[k] 135 if values is not None: 136 val = values.split(', ') # split packages 137 i = 0 138 for v in val: 139 relation = 0 140 version = '' 141 if '|' in v: 142 # TODO: store alternative-package-names semantically someday 143 name = v + '_' + str(i) 144 else: 145 nv = v.split('(') 146 name = nv[0] + '_' + str(i) 147 if (len(nv) > 1): 148 version = nv[1].rstrip(')') 149 if version: 150 while version.startswith(("<", ">", "=")): 151 if version.startswith("<"): 152 relation |= 2 153 if version.startswith(">"): 154 relation |= 4 155 if version.startswith("="): 156 relation |= 8 157 version = version[1:] 158 hash = {'name': name, 'version': version, 'flags': relation} 159 finst = dclass() 160 finst.populate(hash) 161 l.append(finst) 162 i += 1 163 self[k] = l
164
165 - def _populateChangeLog(self, header):
166 l = [] 167 # for cinfo in header.get('changelog', []): 168 # cinst = headerSource.rpmChangeLog() 169 # cinst.populate(cinfo) 170 # l.append(cinst) 171 self['changelog'] = l
172
173 - def _populateChannels(self, channels):
174 l = [] 175 for channel in channels: 176 dict = {'label': channel} 177 obj = Channel() 178 obj.populate(dict) 179 l.append(obj) 180 self['channels'] = l
181