+@try_or_reject
+def comment_accept(upload, srcqueue, comments, transaction):
+ for byhand in upload.byhand:
+ path = os.path.join(srcqueue.path, byhand.filename)
+ if os.path.exists(path):
+ raise Exception('E: cannot ACCEPT upload with unprocessed byhand file {0}'.format(byhand.filename))
+
+ cnf = Config()
+
+ fs = transaction.fs
+ session = transaction.session
+ changesname = upload.changes.changesname
+ allow_tainted = srcqueue.suite.archive.tainted
+
+ # We need overrides to get the target component
+ overridesuite = upload.target_suite
+ if overridesuite.overridesuite is not None:
+ overridesuite = session.query(Suite).filter_by(suite_name=overridesuite.overridesuite).one()
+
+ def binary_component_func(db_binary):
+ section = db_binary.proxy['Section']
+ component_name = 'main'
+ if section.find('/') != -1:
+ component_name = section.split('/', 1)[0]
+ return get_mapped_component(component_name, session=session)
+
+ def is_debug_binary(db_binary):
+ return daklib.utils.is_in_debug_section(db_binary.proxy)
+
+ def has_debug_binaries(upload):
+ return any((is_debug_binary(x) for x in upload.binaries))
+
+ def source_component_func(db_source):
+ package_list = PackageList(db_source.proxy)
+ component = source_component_from_package_list(package_list, upload.target_suite)
+ if component is not None:
+ return get_mapped_component(component.component_name, session=session)
+
+ # Fallback for packages without Package-List field
+ query = session.query(Override).filter_by(suite=overridesuite, package=db_source.source) \
+ .join(OverrideType).filter(OverrideType.overridetype == 'dsc') \
+ .join(Component)
+ return query.one().component
+
+ all_target_suites = [upload.target_suite]
+ all_target_suites.extend([q.suite for q in upload.target_suite.copy_queues])
+
+ for suite in all_target_suites:
+ debug_suite = suite.debug_suite
+
+ if upload.source is not None:
+ # If we have Source in this upload, let's include it into
+ # upload suite.
+ transaction.copy_source(
+ upload.source,
+ suite,
+ source_component_func(upload.source),
+ allow_tainted=allow_tainted,
+ )
+
+ if debug_suite is not None and has_debug_binaries(upload):
+ # If we're handing a debug package, we also need to include the
+ # source in the debug suite as well.
+ transaction.copy_source(
+ upload.source,
+ debug_suite,
+ source_component_func(upload.source),
+ allow_tainted=allow_tainted,
+ )
+
+ for db_binary in upload.binaries:
+ # Now, let's work out where to copy this guy to -- if it's
+ # a debug binary, and the suite has a debug suite, let's go
+ # ahead and target the debug suite rather then the stock
+ # suite.
+ copy_to_suite = suite
+ if debug_suite is not None and is_debug_binary(db_binary):
+ copy_to_suite = debug_suite
+
+ # build queues may miss the source package if this is a
+ # binary-only upload.
+ if suite != upload.target_suite:
+ transaction.copy_source(
+ db_binary.source,
+ copy_to_suite,
+ source_component_func(db_binary.source),
+ allow_tainted=allow_tainted,
+ )
+
+ transaction.copy_binary(
+ db_binary,
+ copy_to_suite,
+ binary_component_func(db_binary),
+ allow_tainted=allow_tainted,
+ extra_archives=[upload.target_suite.archive],
+ )
+
+ # Copy .changes if needed
+ if upload.target_suite.copychanges:
+ src = os.path.join(upload.policy_queue.path, upload.changes.changesname)
+ dst = os.path.join(upload.target_suite.path, upload.changes.changesname)
+ fs.copy(src, dst, mode=upload.target_suite.archive.mode)
+
+ # Copy upload to Process-Policy::CopyDir
+ # Used on security.d.o to sync accepted packages to ftp-master, but this
+ # should eventually be replaced by something else.
+ copydir = cnf.get('Process-Policy::CopyDir') or None
+ if copydir is not None:
+ mode = upload.target_suite.archive.mode
+ if upload.source is not None:
+ for f in [ df.poolfile for df in upload.source.srcfiles ]:
+ dst = os.path.join(copydir, f.basename)
+ if not os.path.exists(dst):
+ fs.copy(f.fullpath, dst, mode=mode)
+
+ for db_binary in upload.binaries:
+ f = db_binary.poolfile
+ dst = os.path.join(copydir, f.basename)
+ if not os.path.exists(dst):
+ fs.copy(f.fullpath, dst, mode=mode)
+
+ src = os.path.join(upload.policy_queue.path, upload.changes.changesname)
+ dst = os.path.join(copydir, upload.changes.changesname)
+ if not os.path.exists(dst):
+ fs.copy(src, dst, mode=mode)
+
+ if upload.source is not None and not Options['No-Action']:
+ urgency = upload.changes.urgency
+ if urgency not in cnf.value_list('Urgency::Valid'):
+ urgency = cnf['Urgency::Default']
+ UrgencyLog().log(upload.source.source, upload.source.version, urgency)
+
+ print " ACCEPT"
+ if not Options['No-Action']:
+ Logger.log(["Policy Queue ACCEPT", srcqueue.queue_name, changesname])
+
+ pu = get_processed_upload(upload)
+ daklib.announce.announce_accept(pu)
+
+ # TODO: code duplication. Similar code is in process-upload.
+ # Move .changes to done
+ src = os.path.join(upload.policy_queue.path, upload.changes.changesname)
+ now = datetime.datetime.now()
+ donedir = os.path.join(cnf['Dir::Done'], now.strftime('%Y/%m/%d'))
+ dst = os.path.join(donedir, upload.changes.changesname)
+ dst = utils.find_next_free(dst)
+ fs.copy(src, dst, mode=0o644)
+
+ remove_upload(upload, transaction)
+
+################################################################################