import shutil
import subprocess
from sqlalchemy.orm.exc import NoResultFound
+import sqlalchemy.exc
import tempfile
import traceback
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
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.
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)
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)
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.
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
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
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,
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