]> git.decadent.org.uk Git - dak.git/blobdiff - dak/import_new_files.py
Pass compression methods to FileWriter.
[dak.git] / dak / import_new_files.py
index ff49e6c3567b96e5c378d632eb1f53c9fe19266b..7a29467a18be52a488ee2f2b00f272a83e2c0364 100755 (executable)
@@ -34,9 +34,10 @@ import logging
 import threading
 import glob
 import apt_pkg
-from daklib.dbconn import DBConn, get_dbchange, get_policy_queue, session_wrapper, ChangePendingFile
+from daklib.dbconn import DBConn, get_dbchange, get_policy_queue, session_wrapper, ChangePendingFile, get_location, check_poolfile
 from daklib.config import Config
 from daklib.queue import Upload
+from daklib.utils import poolify
 
 # where in dak.conf all of our configuration will be stowed
 options_prefix = "NewFiles"
@@ -63,6 +64,7 @@ OPTIONS
 class ImportNewFiles(object):
     @session_wrapper
     def __init__(self, session=None):
+        cnf = Config()
         try:
             newq = get_policy_queue('new', session)
             for changes_fn in glob.glob(newq.path + "/*.changes"):
@@ -72,6 +74,7 @@ class ImportNewFiles(object):
                 u = Upload()
                 success = u.load_changes(changes_fn)
                 u.pkg.changes_file = changes_bn
+                u.check_hashes()
 
                 if not chg:
                     chg = u.pkg.add_known_changes(newq.path, newq.policy_queue_id, session)
@@ -85,19 +88,62 @@ class ImportNewFiles(object):
 
                 files=[]
                 for chg_fn in u.pkg.files.keys():
-                    cpf = ChangePendingFile()
-                    cpf.filename = chg_fn
-                    cpf.size = u.pkg.files[chg_fn]['size']
-                    cpf.md5sum = u.pkg.files[chg_fn]['md5sum']
+                    try:
+                        f = open(os.path.join(newq.path, chg_fn))
+                        cpf = ChangePendingFile()
+                        cpf.filename = chg_fn
+                        cpf.size = u.pkg.files[chg_fn]['size']
+                        cpf.md5sum = u.pkg.files[chg_fn]['md5sum']
+
+                        if u.pkg.files[chg_fn].has_key('sha1sum'):
+                            cpf.sha1sum = u.pkg.files[chg_fn]['sha1sum']
+                        else:
+                            log.warning("Having to generate sha1sum for %s" % chg_fn)
+                            f.seek(0)
+                            cpf.sha1sum = apt_pkg.sha1sum(f)
+
+                        if u.pkg.files[chg_fn].has_key('sha256sum'):
+                            cpf.sha256sum = u.pkg.files[chg_fn]['sha256sum']
+                        else:
+                            log.warning("Having to generate sha256sum for %s" % chg_fn)
+                            f.seek(0)
+                            cpf.sha256sum = apt_pkg.sha256sum(f)
+
+                        session.add(cpf)
+                        files.append(cpf)
+                        f.close()
+                    except IOError:
+                        # Can't find the file, try to look it up in the pool
+                        poolname = poolify(u.pkg.changes["source"], u.pkg.files[chg_fn]["component"])
+                        l = get_location(cnf["Dir::Pool"], u.pkg.files[chg_fn]["component"], session=session)
+                        if not l:
+                            log.critical("ERROR: Can't find location for %s (component %s)" % (chg_fn, u.pkg.files[chg_fn]["component"]))
+
+                        found, poolfile = check_poolfile(os.path.join(poolname, chg_fn),
+                                                         u.pkg.files[chg_fn]['size'],
+                                                         u.pkg.files[chg_fn]["md5sum"],
+                                                         l.location_id,
+                                                         session=session)
+
+                        if found is None:
+                            log.critical("ERROR: Found multiple files for %s in pool" % chg_fn)
+                            sys.exit(1)
+                        elif found is False and poolfile is not None:
+                            log.critical("ERROR: md5sum / size mismatch for %s in pool" % chg_fn)
+                            sys.exit(1)
+                        else:
+                            if poolfile is None:
+                                log.critical("ERROR: Could not find %s in pool" % chg_fn)
+                                sys.exit(1)
+                            else:
+                                chg.poolfiles.append(poolfile)
 
-                    session.add(cpf)
-                    files.append(cpf)
 
                 chg.files = files
 
 
             session.commit()
-            
+
         except KeyboardInterrupt:
             print("Caught C-c; terminating.")
             utils.warn("Caught C-c; terminating.")
@@ -112,7 +158,7 @@ def main():
                  ('v',"verbose", "%s::%s" % (options_prefix,"Verbose")),
                 ]
 
-    args = apt_pkg.ParseCommandLine(cnf.Cnf, arguments,sys.argv)
+    args = apt_pkg.parse_commandline(cnf.Cnf, arguments,sys.argv)
 
     num_threads = 1