]> git.donarmstrong.com Git - dak.git/blobdiff - dak/admin.py
Improve dsc_in_suite function documentation
[dak.git] / dak / admin.py
index a4f5f4bb9788580ff92d770d76ec618fc4dc7288..43e20ecfe9209b6f87c2237e8a620f650740618a 100755 (executable)
@@ -23,6 +23,9 @@ import sys
 
 import apt_pkg
 
 
 import apt_pkg
 
+import daklib.archive
+import daklib.gpg
+
 from daklib import utils
 from daklib.dbconn import *
 from sqlalchemy.orm.exc import NoResultFound
 from daklib import utils
 from daklib.dbconn import *
 from sqlalchemy.orm.exc import NoResultFound
@@ -135,6 +138,14 @@ Perform administrative work on the dak database.
        where
          CHECK     is one of Enhances, MustBeNewerThan, MustBeOlderThan
         REFERENCE is another suite name
        where
          CHECK     is one of Enhances, MustBeNewerThan, MustBeOlderThan
         REFERENCE is another suite name
+
+  change-component:
+     change-component SUITE COMPONENT source SOURCE...
+     change-component SUITE COMPONENT binary BINARY...
+         Move source or binary packages to a different component by copying
+         associated files and changing the overrides.
+
+  forget-signature FILE:    forget that we saw FILE
 """
     sys.exit(exit_code)
 
 """
     sys.exit(exit_code)
 
@@ -435,20 +446,24 @@ def __suite_architecture_add(d, args):
     suite = get_suite(args[2].lower(), s)
     if suite is None: die("E: Can't find suite %s" % args[2].lower())
 
     suite = get_suite(args[2].lower(), s)
     if suite is None: die("E: Can't find suite %s" % args[2].lower())
 
-    arch = get_architecture(args[3].lower(), s)
-    if arch is None: die("E: Can't find architecture %s" % args[3].lower())
+    for arch_name in args[3:]:
+        arch = get_architecture(arch_name.lower(), s)
+        if arch is None: die("E: Can't find architecture %s" % args[3].lower())
 
 
-    if not dryrun:
         try:
             suite.architectures.append(arch)
         try:
             suite.architectures.append(arch)
-            s.commit()
+            s.flush()
         except IntegrityError as e:
         except IntegrityError as e:
-            die("E: Can't add suite-architecture entry (%s, %s) - probably already exists" % (args[2].lower(), args[3].lower()))
+            die("E: Can't add suite-architecture entry (%s, %s) - probably already exists" % (args[2].lower(), arch_name))
         except SQLAlchemyError as e:
         except SQLAlchemyError as e:
-            die("E: Can't add suite-architecture entry (%s, %s) - %s" % (args[2].lower(), args[3].lower(), e))
+            die("E: Can't add suite-architecture entry (%s, %s) - %s" % (args[2].lower(), arch_name, e))
+
+        print "Added suite-architecture entry for %s, %s" % (args[2].lower(), arch_name)
 
 
-    print "Added suite-architecture entry for %s, %s" % (args[2].lower(), args[3].lower())
+    if not dryrun:
+        s.commit()
 
 
+    s.close()
 
 def __suite_architecture_rm(d, args):
     if len(args) < 3:
 
 def __suite_architecture_rm(d, args):
     if len(args) < 3:
@@ -537,20 +552,23 @@ def __suite_component_add(d, args):
      suite = get_suite(args[2].lower(), s)
      if suite is None: die("E: Can't find suite %s" % args[2].lower())
 
      suite = get_suite(args[2].lower(), s)
      if suite is None: die("E: Can't find suite %s" % args[2].lower())
 
-     component = get_component(args[3].lower(), s)
-     if component is None: die("E: Can't find component %s" % args[3].lower())
+     for component_name in args[3:]:
+         component = get_component(component_name.lower(), s)
+         if component is None: die("E: Can't find component %s" % args[3].lower())
 
 
-     if not dryrun:
          try:
              suite.components.append(component)
          try:
              suite.components.append(component)
-             s.commit()
+             s.flush()
          except IntegrityError as e:
          except IntegrityError as e:
-             die("E: Can't add suite-component entry (%s, %s) - probably already exists" % (args[2].lower(), args[3].lower()))
+             die("E: Can't add suite-component entry (%s, %s) - probably already exists" % (args[2].lower(), component_name))
          except SQLAlchemyError as e:
          except SQLAlchemyError as e:
-             die("E: Can't add suite-component entry (%s, %s) - %s" % (args[2].lower(), args[3].lower(), e))
+             die("E: Can't add suite-component entry (%s, %s) - %s" % (args[2].lower(), component_name, e))
 
 
-     print "Added suite-component entry for %s, %s" % (args[2].lower(), args[3].lower())
+         print "Added suite-component entry for %s, %s" % (args[2].lower(), component_name)
 
 
+     if not dryrun:
+         s.commit()
+     s.close()
 
 def __suite_component_rm(d, args):
      if len(args) < 3:
 
 def __suite_component_rm(d, args):
      if len(args) < 3:
@@ -863,6 +881,75 @@ dispatch['k'] = keyring
 
 ################################################################################
 
 
 ################################################################################
 
+def change_component_source(transaction, suite, component, source_names):
+    session = transaction.session
+
+    overrides = session.query(Override).filter(Override.package.in_(source_names)).filter_by(suite=suite).join(OverrideType).filter_by(overridetype='dsc')
+    for override in overrides:
+        print "Changing override for {0}".format(override.package)
+        override.component = component
+    session.flush()
+
+    sources = session.query(DBSource).filter(DBSource.source.in_(source_names)).filter(DBSource.suites.contains(suite))
+    for source in sources:
+        print "Copying {0}={1}".format(source.source, source.version)
+        transaction.copy_source(source, suite, component)
+
+def change_component_binary(transaction, suite, component, binary_names):
+    session = transaction.session
+
+    overrides = session.query(Override).filter(Override.package.in_(binary_names)).filter_by(suite=suite).join(OverrideType).filter(OverrideType.overridetype.in_(['deb', 'udeb']))
+    for override in overrides:
+        print "Changing override for {0}".format(override.package)
+        override.component = component
+    session.flush()
+
+    binaries = session.query(DBBinary).filter(DBBinary.package.in_(binary_names)).filter(DBBinary.suites.contains(suite))
+    for binary in binaries:
+        print "Copying {0}={1} [{2}]".format(binary.package, binary.version, binary.architecture.arch_string)
+        transaction.copy_binary(binary, suite, component)
+    pass
+
+def change_component(args):
+    with daklib.archive.ArchiveTransaction() as transaction:
+        session = transaction.session
+
+        suite = session.query(Suite).filter_by(suite_name=args[1]).one()
+        component = session.query(Component).filter_by(component_name=args[2]).one()
+
+        if args[3] == 'source':
+            change_component_source(transaction, suite, component, args[4:])
+        elif args[3] == 'binary':
+            change_component_binary(transaction, suite, component, args[4:])
+        else:
+            raise Exception("Can only move source or binary, not {0}".format(args[3]))
+
+        transaction.commit()
+
+dispatch['change-component'] = change_component
+
+################################################################################
+
+def forget_signature(args):
+    filename = args[1]
+    with open(filename, 'r') as fh:
+        data = fh.read()
+
+    session = DBConn().session()
+    keyrings = [ k.keyring_name for k in session.query(Keyring).filter_by(active=True).order_by(Keyring.priority) ]
+    signed_file = daklib.gpg.SignedFile(data, keyrings)
+    history = SignatureHistory.from_signed_file(signed_file).query(session)
+    if history is not None:
+        session.delete(history)
+        session.commit()
+    else:
+        print "Signature was not known to dak."
+    session.rollback()
+
+dispatch['forget-signature'] = forget_signature
+
+################################################################################
+
 def main():
     """Perform administrative work on the dak database"""
     global dryrun
 def main():
     """Perform administrative work on the dak database"""
     global dryrun