[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

[dak/master] Implement package changelog exporting



Signed-off-by: Luca Falavigna <dktrkranz@debian.org>
---
 config/debian/dak.conf |    1 +
 dak/make_changelog.py  |   95 ++++++++++++++++++++++++++++++++++++++++++++++--
 2 files changed, 93 insertions(+), 3 deletions(-)

diff --git a/config/debian/dak.conf b/config/debian/dak.conf
index 2ceefa8..febc172 100644
--- a/config/debian/dak.conf
+++ b/config/debian/dak.conf
@@ -780,4 +780,5 @@ Changelogs
 {
   Testing "/srv/release.debian.org/tools/trille/current-testing";
   Britney "/srv/ftp-master.debian.org/ftp/dists/testing/ChangeLog";
+  Export "/srv/ftp.debian.org/rsync/export/changelogs";
 }
diff --git a/dak/make_changelog.py b/dak/make_changelog.py
index 0c08a44..3170a9c 100755
--- a/dak/make_changelog.py
+++ b/dak/make_changelog.py
@@ -49,8 +49,13 @@ Generate changelog entry between two suites
 
 ################################################################################
 
+import os
 import sys
 import apt_pkg
+from commands import getstatusoutput
+from glob import glob
+from re import split
+from shutil import rmtree
 from daklib.dbconn import *
 from daklib import utils
 
@@ -61,6 +66,7 @@ def usage (exit_code=0):
 
        Usage:
        make-changelog -s <suite> -b <base_suite> [OPTION]...
+       make-changelog -e
        make-changelog -T
 
 Options:
@@ -69,6 +75,9 @@ Options:
   -s, --suite               suite providing packages to compare
   -b, --base-suite          suite to be taken as reference for comparison
   -n, --binnmu              display binNMUs uploads instead of source ones
+
+  -e, --export              export interesting files from source packages
+
   -T, --testing             display changes entering testing"""
 
     sys.exit(exit_code)
@@ -173,15 +182,92 @@ def display_changes(uploads, index):
         print upload[index]
         prev_upload = upload[0]
 
+def export_files(session, pool, clpool):
+    """
+    Export interesting files from source packages.
+    """
+
+    sources = {}
+    query = """SELECT s.source, su.suite_name AS suite, s.version, f.filename
+               FROM source s
+               JOIN src_associations sa ON sa.source = s.id
+               JOIN suite su ON su.id = sa.suite
+               JOIN files f ON f.id = s.file
+               ORDER BY s.source, suite"""
+
+    for p in session.execute(query):
+        if not sources.has_key(p[0]):
+            sources[p[0]] = {}
+        sources[p[0]][p[1]] = (p[2], p[3])
+
+    tempdir = utils.temp_dirname()
+    os.rmdir(tempdir)
+
+    for p in sources.keys():
+        for s in sources[p].keys():
+            files = (('changelog', True),
+                     ('copyright', True),
+                     ('NEWS.Debian', False),
+                     ('README.Debian', False))
+            path = os.path.join(clpool, sources[p][s][1].split('/')[0], \
+                                split('(^lib\S|^\S)', p)[1], p)
+            if not os.path.exists(path):
+                os.makedirs(path)
+            for file in files:
+                for f in glob(os.path.join(path, s + '.*')):
+                    os.unlink(f)
+            try:
+                for file in files:
+                    t = os.path.join(path, '%s_%s.*%s' % (p, sources[p][s][0], file[0]))
+                    if file[1] and not glob(t):
+                        raise OSError
+                    else:
+                        for f in glob(t):
+                            os.link(f, os.path.join(path, '%s.%s' % \
+                                    (s, os.path.basename(f).split('%s_%s.' \
+                                    % (p, sources[p][s][0]))[1])))
+            except OSError:
+                cmd = 'dpkg-source --no-check --no-copy -x %s %s' \
+                      % (os.path.join(pool, sources[p][s][1]), tempdir)
+                (result, output) = getstatusoutput(cmd)
+                if not result:
+                    for file in files:
+                        try:
+                            for f in glob(os.path.join(tempdir, 'debian', '*' + file[0])):
+                                for dest in os.path.join(path, '%s_%s.%s' \
+                                            % (p, sources[p][s][0], os.path.basename(f))), \
+                                            os.path.join(path, '%s.%s' % (s, os.path.basename(f))):
+                                    if not os.path.exists(dest):
+                                        os.link(f, dest)
+                        except:
+                            print 'make-changelog: unable to extract %s for %s_%s' \
+                                   % (os.path.basename(f), p, sources[p][s][0])
+                else:
+                    print 'make-changelog: unable to unpack %s_%s' % (p, sources[p][s][0])
+                    continue
+
+                rmtree(tempdir)
+
+    for root, dirs, files in os.walk(clpool):
+        if len(files):
+            if root.split('/')[-1] not in sources.keys():
+                if os.path.exists(root):
+                    rmtree(root)
+            for file in files:
+                if os.path.exists(os.path.join(root, file)):
+                    if os.stat(os.path.join(root, file)).st_nlink ==  1:
+                        os.unlink(os.path.join(root, file))
+
 def main():
     Cnf = utils.get_conf()
     Arguments = [('h','help','Make-Changelog::Options::Help'),
                  ('s','suite','Make-Changelog::Options::Suite','HasArg'),
                  ('b','base-suite','Make-Changelog::Options::Base-Suite','HasArg'),
                  ('n','binnmu','Make-Changelog::Options::binNMU'),
+                 ('e','export','Make-Changelog::Options::export'),
                  ('T', 'testing','Make-Changelog::Options::Testing')]
 
-    for i in ['help', 'suite', 'base-suite', 'binnmu', 'testing']:
+    for i in ['help', 'suite', 'base-suite', 'binnmu', 'export', 'testing']:
         if not Cnf.has_key('Make-Changelog::Options::%s' % (i)):
             Cnf['Make-Changelog::Options::%s' % (i)] = ''
 
@@ -190,19 +276,22 @@ def main():
     suite = Cnf['Make-Changelog::Options::Suite']
     base_suite = Cnf['Make-Changelog::Options::Base-Suite']
     binnmu = Cnf['Make-Changelog::Options::binNMU']
+    export = Cnf['Make-Changelog::Options::export']
     testing = Cnf['Make-Changelog::Options::Testing']
 
-    if Options['help'] or not (suite and base_suite) and not testing:
+    if Options['help'] or not (suite and base_suite) and not testing and not export:
         usage()
 
     for s in suite, base_suite:
-        if not testing and not get_suite(s):
+        if not testing and not export and not get_suite(s):
             utils.fubar('Invalid suite "%s"' % s)
 
     session = DBConn().session()
 
     if testing:
         display_changes(testing_summary(Cnf['Changelogs::Testing'], session), 1)
+    elif export:
+        export_files(session, Cnf['Dir::Pool'], Cnf['Changelogs::Export'])
     elif binnmu:
         display_changes(get_binary_uploads(suite, base_suite, session), 3)
     else:
-- 
1.5.6.5


Reply to: