]> git.decadent.org.uk Git - dak.git/commitdiff
Add option to forbid source and/or binary uploads to a suite
authorAnsgar Burchardt <ansgar@debian.org>
Sat, 16 Jan 2016 14:23:39 +0000 (15:23 +0100)
committerAnsgar Burchardt <ansgar@debian.org>
Sat, 16 Jan 2016 15:18:25 +0000 (16:18 +0100)
This is intended to be used to forbid uploads to policy queues and build
queues which would result in confusing results.  While we already have a
"reject" option in the dak.conf's SuiteMappings, having the option in
the database means we don't have to edit dak.conf when configuring new
suites.

Another usecase will be the "unstable" suite for Debian Ports: here we
want to import the source packages (and arch:all) from the main archive
and only accept binary uploads.  Additional source packages must go into
the "unreleased-*" suites.  This was not possible via SuiteMappings.

Bug: https://bugs.debian.org/783115

dak/dakdb/update113.py [new file with mode: 0644]
daklib/archive.py
daklib/checks.py

diff --git a/dak/dakdb/update113.py b/dak/dakdb/update113.py
new file mode 100644 (file)
index 0000000..87e00e6
--- /dev/null
@@ -0,0 +1,63 @@
+#!/usr/bin/env python
+# coding=utf8
+
+"""
+Add accept_{source,binary}_uploads to suite
+
+@contact: Debian FTP Master <ftpmaster@debian.org>
+@copyright: 2016, Ansgar Burchardt <ansgar@debian.org>
+@license: GNU General Public License version 2 or later
+"""
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+################################################################################
+
+import psycopg2
+from daklib.dak_exceptions import DBUpdateError
+from daklib.config import Config
+
+statements = [
+"""
+ALTER TABLE suite
+  ADD COLUMN accept_source_uploads BOOLEAN DEFAULT TRUE,
+  ADD COLUMN accept_binary_uploads BOOLEAN DEFAULT TRUE
+""",
+"""
+UPDATE suite
+   SET accept_source_uploads = FALSE, accept_binary_uploads = FALSE
+ WHERE id IN (SELECT suite_id FROM policy_queue)
+    OR id IN (SELECT suite_id FROM build_queue)
+    OR id IN (SELECT debugsuite_id FROM suite)
+"""
+]
+
+################################################################################
+def do_update(self):
+    print __doc__
+    try:
+        cnf = Config()
+
+        c = self.db.cursor()
+
+        for stmt in statements:
+            c.execute(stmt)
+
+        c.execute("UPDATE config SET value = '113' WHERE name = 'db_revision'")
+        self.db.commit()
+
+    except psycopg2.ProgrammingError as msg:
+        self.db.rollback()
+        raise DBUpdateError('Unable to apply sick update 113, rollback issued. Error message: {0}'.format(msg))
index e4140a1266d403138cd0ff9de5a454682474d484..6577d3591f479e960a0ae23b213e1f5c75ccfef3 100644 (file)
@@ -972,6 +972,7 @@ class ArchiveUpload(object):
             self.final_suites = final_suites
 
             for chk in (
             self.final_suites = final_suites
 
             for chk in (
+                    checks.SuiteCheck,
                     checks.TransitionCheck,
                     checks.ACLCheck,
                     checks.NoSourceOnlyCheck,
                     checks.TransitionCheck,
                     checks.ACLCheck,
                     checks.NoSourceOnlyCheck,
index b187f0305997245bbe4b0bfb5262f8024c333d08..e17a191e39472b112e50f24a00442da161c65970 100644 (file)
@@ -799,6 +799,14 @@ class SourceFormatCheck(Check):
         if query.first() is None:
             raise Reject('source format {0} is not allowed in suite {1}'.format(source_format, suite.suite_name))
 
         if query.first() is None:
             raise Reject('source format {0} is not allowed in suite {1}'.format(source_format, suite.suite_name))
 
+class SuiteCheck(Check):
+    def per_suite_check(self, upload, suite):
+        if not suite.accept_source_uploads and upload.changes.source is not None:
+            raise Reject('The suite "{0}" does not accept source uploads.'.format(suite.suite_name))
+        if not suite.accept_binary_uploads and len(upload.changes.binaries) != 0:
+            raise Reject('The suite "{0}" does not accept binary uploads.'.format(suite.suite_name))
+        return True
+
 class SuiteArchitectureCheck(Check):
     def per_suite_check(self, upload, suite):
         session = upload.session
 class SuiteArchitectureCheck(Check):
     def per_suite_check(self, upload, suite):
         session = upload.session