X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=daklib%2Farchive.py;h=ecd5932494d14a88ea761a094bbb37ff6e613acd;hb=a1605d90114be9fdf8b6942ae4e3a8c376e808fd;hp=7243f31a884f36684044a767f19369a06b263a2e;hpb=1934d926546cb051b6be97a7d1de53b1473ec962;p=dak.git diff --git a/daklib/archive.py b/daklib/archive.py index 7243f31a..ecd59324 100644 --- a/daklib/archive.py +++ b/daklib/archive.py @@ -33,6 +33,7 @@ import os import shutil import subprocess from sqlalchemy.orm.exc import NoResultFound +import sqlalchemy.exc import tempfile import traceback @@ -85,7 +86,7 @@ class ArchiveTransaction(object): Will not give an error when the file is already present. @rtype: L{daklib.dbconn.PoolFile} - @return: batabase object for the new file + @return: database object for the new file """ session = self.session @@ -335,6 +336,8 @@ class ArchiveTransaction(object): db_source.suites.append(suite) if not created: + for f in db_source.srcfiles: + self._copy_file(f.poolfile, archive, component, allow_tainted=allow_tainted) return db_source ### Now add remaining files and copy them to the archive. @@ -633,8 +636,9 @@ class ArchiveUpload(object): cnf = Config() session = self.transaction.session + group = cnf.get('Dinstall::UnprivGroup') or None self.directory = utils.temp_dirname(parent=cnf.get('Dir::TempPath'), - mode=0o2750, group=cnf.unprivgroup) + mode=0o2750, group=group) with FilesystemTransaction() as fs: src = os.path.join(self.original_directory, self.original_changes.filename) dst = os.path.join(self.directory, self.original_changes.filename) @@ -649,7 +653,13 @@ class ArchiveUpload(object): continue fs.copy(src, dst, mode=0o640) - source = self.changes.source + source = None + try: + source = self.changes.source + except Exception: + # Do not raise an exception here if the .dsc is invalid. + pass + if source is not None: for f in source.files.itervalues(): src = os.path.join(self.original_directory, f.filename) @@ -658,7 +668,7 @@ class ArchiveUpload(object): try: db_file = self.transaction.get_file(f, source.dsc['Source'], check_hashes=False) db_archive_file = session.query(ArchiveFile).filter_by(file=db_file).first() - fs.copy(db_archive_file.path, dst, symlink=True) + fs.copy(db_archive_file.path, dst, mode=0o640) except KeyError: # Ignore if get_file could not find it. Upload will # probably be rejected later. @@ -708,7 +718,7 @@ class ArchiveUpload(object): elif rtype == "reject": rejected = fields[1] if suite_name == rejected: - self.reject_reasons.append('Uploads to {0} are not accepted.'.format(suite)) + raise checks.Reject('Uploads to {0} are not accepted.'.format(rejected)) ## XXX: propup-version and map-unreleased not yet implemented return suite_name @@ -752,7 +762,7 @@ class ArchiveUpload(object): if self.changes.source is not None: override = self._source_override(suite, self.changes.source) if override is None: - self.warnings.append('source:{0} is NEW.'.format(self.changes.source.control['Source'])) + self.warnings.append('source:{0} is NEW.'.format(self.changes.source.dsc['Source'])) new = True # Check if we reference a file only in a tainted archive @@ -878,9 +888,8 @@ class ArchiveUpload(object): try: # Validate signatures and hashes before we do any real work: for chk in ( - checks.SignatureCheck, + checks.SignatureAndHashesCheck, checks.ChangesCheck, - checks.HashesCheck, checks.ExternalHashesCheck, checks.SourceCheck, checks.BinaryCheck, @@ -1002,8 +1011,11 @@ class ArchiveUpload(object): db_changes.changelog_id = changelog_id db_changes.closes = self.changes.closed_bugs - self.transaction.session.add(db_changes) - self.transaction.session.flush() + try: + self.transaction.session.add(db_changes) + self.transaction.session.flush() + except sqlalchemy.exc.IntegrityError: + raise ArchiveException('{0} is already known.'.format(self.changes.filename)) return db_changes