def _create_db_entries(self, qa): """ Create entries in the Database for the package upload. """ def _package_description(raw): return raw[2:].replace(' - ', ' - ') log.debug('Creating database entries') # Parse component and section from field in changes component, section = parse_section(self.changes['files'][0]['section']) # Check whether package is already in the database package_query = meta.session.query(Package).filter_by(name=self.changes['Source']) if package_query.count() == 1: log.debug('Package %s already exists in the database' % self.changes['Source']) package = package_query.one() # Update description to make sure it reflects the latest upload package.description = _package_description(self.changes['Description']) else: log.debug('Package %s is new to the system' % self.changes['Source']) package = Package(name=self.changes['Source'], user=self.user) package.description = _package_description(self.changes['Description']) package.needs_sponsor = 0 meta.session.add(package) # No need to check whether there is the same source name and same version as an existing # entry in the database as the upload controller tested whether similar filenames existed # in the repository. The only way this would be wrong is if the filename had a different # version in than the Version field in changes.. try: closes = self.changes['Closes'] except KeyError: closes = None # TODO: fix these magic numbers if qa.stop(): qa_status = 1 else: qa_status = 0 maintainer_matches = re.compile(r'(.*) <(.*)>').match(self.changes['Changed-By']) maintainer = maintainer_matches.group(2) package_version = PackageVersion(package=package, version=self.changes['Version'], section=section, distribution=self.changes['Distribution'], qa_status=qa_status, component=component, priority=self.changes.get_priority(), closes=closes, uploaded=datetime.now(), maintainer=maintainer) meta.session.add(package_version) source_package = SourcePackage(package_version=package_version) meta.session.add(source_package) binary_package = None # Add PackageFile objects to the database for each uploaded file for file in self.files: filename = os.path.join(self.changes.get_pool_path(), file) # This exception should be never caught. # It implies something went wrong before, as we expect a file which does not exist try: sum = md5sum(os.path.join(pylons.config['debexpo.repository'], filename)) except AttributeError as e: self._fail("Could not calculate MD5 sum: %s" % (e)) size = os.stat(os.path.join(pylons.config['debexpo.repository'], filename))[ST_SIZE] # Check for binary or source package file if file.endswith('.deb'): # Only create a BinaryPackage if there actually binary package files if binary_package is None: binary_package = BinaryPackage(package_version=package_version, arch=file[:-4].split('_')[-1]) meta.session.add(binary_package) meta.session.add(PackageFile(filename=filename, binary_package=binary_package, size=size, md5sum=sum)) else: meta.session.add(PackageFile(filename=filename, source_package=source_package, size=size, md5sum=sum)) meta.session.commit() log.warning("Finished adding PackageFile objects.") # Add PackageInfo objects to the database for the package_version for result in qa.result: meta.session.add(PackageInfo(package_version=package_version, from_plugin=result.from_plugin, outcome=result.outcome, rich_data=result.data, severity=result.severity)) # Commit all changes to the database meta.session.commit() log.debug('Committed package data to the database') subscribers = meta.session.query(PackageSubscription).filter_by(package=self.changes['Source']).filter(\ PackageSubscription.level <= constants.SUBSCRIPTION_LEVEL_UPLOADS).all() if len(subscribers) > 0: email = Email('package_uploaded') self.send_email(email, [s.user.email for s in subscribers], package=self.changes['Source'], version=self.changes['Version'], user=self.user) log.debug('Sent out package subscription emails') # Send success email to uploader email = Email('successful_upload') dsc_url = pylons.config[ 'debexpo.server'] + '/debian/' + self.changes.get_pool_path() + '/' + self.changes.get_dsc() rfs_url = pylons.config['debexpo.server'] + url('rfs', packagename=self.changes['Source']) self.send_email(email, [self.user.email], package=self.changes['Source'], dsc_url=dsc_url, rfs_url=rfs_url)
def get_priority(self): """ Returns the priority of the package. """ return parse_section(self._data['Files'][0]['priority'])[1]
def get_component(self): """ Returns the component of the package. """ return parse_section(self._data['Files'][0]['section'])[0]
def _create_db_entries(self, qa): """ Create entries in the Database for the package upload. """ def _package_description(raw): return raw[2:].replace(' - ', ' - ') log.debug('Creating database entries') # Parse component and section from field in changes component, section = parse_section(self.changes['files'][0]['section']) # Check whether package is already in the database package_query = meta.session.query(Package).filter_by( name=self.changes['Source']) if package_query.count() == 1: log.debug('Package %s already exists in the database' % self.changes['Source']) package = package_query.one() # Update description to make sure it reflects the latest upload package.description = _package_description( self.changes['Description']) else: log.debug('Package %s is new to the system' % self.changes['Source']) package = Package(name=self.changes['Source'], user=self.user) package.description = _package_description( self.changes['Description']) package.needs_sponsor = 0 meta.session.add(package) # No need to check whether there is the same source name and same version as an existing # entry in the database as the upload controller tested whether similar filenames existed # in the repository. The only way this would be wrong is if the filename had a different # version in than the Version field in changes.. try: closes = self.changes['Closes'] except KeyError: closes = None # TODO: fix these magic numbers if qa.stop(): qa_status = 1 else: qa_status = 0 maintainer_matches = re.compile(r'(.*) <(.*)>').match( self.changes['Changed-By']) maintainer = maintainer_matches.group(2) package_version = PackageVersion( package=package, version=self.changes['Version'], section=section, distribution=self.changes['Distribution'], qa_status=qa_status, component=component, priority=self.changes.get_priority(), closes=closes, uploaded=datetime.now(), maintainer=maintainer) meta.session.add(package_version) source_package = SourcePackage(package_version=package_version) meta.session.add(source_package) binary_package = None # Add PackageFile objects to the database for each uploaded file for file in self.files: filename = os.path.join(self.changes.get_pool_path(), file) # This exception should be never caught. # It implies something went wrong before, as we expect a file which does not exist try: sum = md5sum( os.path.join(pylons.config['debexpo.repository'], filename)) except AttributeError as e: self._fail("Could not calculate MD5 sum: %s" % (e)) size = os.stat( os.path.join(pylons.config['debexpo.repository'], filename))[ST_SIZE] # Check for binary or source package file if file.endswith('.deb'): # Only create a BinaryPackage if there actually binary package files if binary_package is None: binary_package = BinaryPackage( package_version=package_version, arch=file[:-4].split('_')[-1]) meta.session.add(binary_package) meta.session.add( PackageFile(filename=filename, binary_package=binary_package, size=size, md5sum=sum)) else: meta.session.add( PackageFile(filename=filename, source_package=source_package, size=size, md5sum=sum)) meta.session.commit() log.warning("Finished adding PackageFile objects.") # Add PackageInfo objects to the database for the package_version for result in qa.result: meta.session.add( PackageInfo(package_version=package_version, from_plugin=result.from_plugin, outcome=result.outcome, rich_data=result.data, severity=result.severity)) # Commit all changes to the database meta.session.commit() log.debug('Committed package data to the database') subscribers = meta.session.query(PackageSubscription).filter_by(package=self.changes['Source']).filter(\ PackageSubscription.level <= constants.SUBSCRIPTION_LEVEL_UPLOADS).all() if len(subscribers) > 0: email = Email('package_uploaded') self.send_email(email, [s.user.email for s in subscribers], package=self.changes['Source'], version=self.changes['Version'], user=self.user) log.debug('Sent out package subscription emails') # Send success email to uploader email = Email('successful_upload') dsc_url = pylons.config[ 'debexpo.server'] + '/debian/' + self.changes.get_pool_path( ) + '/' + self.changes.get_dsc() rfs_url = pylons.config['debexpo.server'] + url( 'rfs', packagename=self.changes['Source']) self.send_email(email, [self.user.email], package=self.changes['Source'], dsc_url=dsc_url, rfs_url=rfs_url)