]> git.decadent.org.uk Git - dak.git/blobdiff - daklib/utils.py
merge from master
[dak.git] / daklib / utils.py
index cb5df31ce30fd77e2c086c6266209720fbffec88..1b35feef2eb697e930152b85ca612b3f1ea9e29e 100755 (executable)
@@ -37,6 +37,7 @@ import stat
 import apt_pkg
 import database
 import time
+import tarfile
 import re
 import string
 import email as modemail
@@ -1500,3 +1501,53 @@ if which_conf_file() != default_config:
     apt_pkg.ReadConfigFileISC(Cnf,which_conf_file())
 
 ################################################################################
+
+def generate_contents_information(filename):
+    """
+    Generate a list of flies contained in a .deb
+
+    @type filename: string
+    @param filename: the path to a data.tar.gz or data.tar.bz2
+
+    @rtype: list
+    @return: a list of files in the data.tar.* portion of the .deb
+    """
+    cmd = "ar t %s" % (filename)
+    (result, output) = commands.getstatusoutput(cmd)
+    if result != 0:
+        reject("%s: 'ar t' invocation failed." % (filename))
+        reject(utils.prefix_multi_line_string(output, " [ar output:] "), "")
+
+    # Ugh ... this is ugly ... Code ripped from process_unchecked.py
+    chunks = output.split('\n')
+
+    contents = []
+    try:
+        cmd = "ar x %s %s" % (filename, chunks[2])
+        (result, output) = commands.getstatusoutput(cmd)
+        if result != 0:
+            reject("%s: '%s' invocation failed." % (filename, cmd))
+            reject(utils.prefix_multi_line_string(output, " [ar output:] "), "")
+
+        # Got deb tarballs, now lets go through and determine what bits
+        # and pieces the deb had ...
+        if chunks[2] == "data.tar.gz":
+            data = tarfile.open("data.tar.gz", "r:gz")
+        elif chunks[2] == "data.tar.bz2":
+            data = tarfile.open("data.tar.bz2", "r:bz2")
+        else:
+            os.remove(chunks[2])
+            reject("couldn't find data.tar.*")
+
+        for tarinfo in data:
+            if not tarinfo.isdir():
+                contents.append(tarinfo.name[2:])
+
+    finally:
+        if os.path.exists( chunks[2] ):
+            shutil.rmtree( chunks[2] )
+            os.remove( chunks[2] )
+
+    return contents
+
+###############################################################################