]> git.decadent.org.uk Git - dak.git/blobdiff - helena
* vars: external-overrides variable added* cron.daily: Update testing/unstable Task...
[dak.git] / helena
diff --git a/helena b/helena
index 60b655c85803f23756517105098f793502ae77bc..7337461013320e5e370a2169ea7735be131111f4 100755 (executable)
--- a/helena
+++ b/helena
@@ -1,8 +1,8 @@
 #!/usr/bin/env python
 
 # Produces a report on NEW and BYHAND packages
-# Copyright (C) 2001, 2002  James Troup <james@nocrew.org>
-# $Id: helena,v 1.1 2002-06-05 00:17:22 troup Exp $
+# Copyright (C) 2001, 2002, 2003  James Troup <james@nocrew.org>
+# $Id: helena,v 1.5 2003-07-15 17:29:26 troup Exp $
 
 # 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
@@ -35,7 +35,7 @@
 
 ################################################################################
 
-import copy, glob, os, stat, string, sys, time;
+import copy, glob, os, stat, sys, time;
 import apt_pkg;
 import katie, utils;
 
@@ -44,7 +44,16 @@ Katie = None;
 
 ################################################################################
 
-def plural (x):
+def usage(exit_code=0):
+    print """Usage: helena
+Prints a report of packages in queue directories (usually new and byhand).
+
+  -h, --help                show this help and exit."""
+    sys.exit(exit_code)
+
+################################################################################
+
+def plural(x):
     if x > 1:
         return "s";
     else:
@@ -56,23 +65,23 @@ def time_pp(x):
     if x < 60:
         unit="second";
     elif x < 3600:
-        x = x / 60;
+        x /= 60;
         unit="minute";
     elif x < 86400:
-        x = x / 3600;
+        x /= 3600;
         unit="hour";
     elif x < 604800:
-        x = x / 86400;
+        x /= 86400;
         unit="day";
     elif x < 2419200:
-        x = x / 604800;
+        x /= 604800;
         unit="week";
     elif x < 29030400:
-        x = x / 2419200;
+        x /= 2419200;
         unit="month";
     else:
-        x = x / 29030400;
-        unit="years";
+        x /= 29030400;
+        unit="year";
     x = int(x);
     return "%s %s%s" % (x, unit, plural(x));
 
@@ -126,7 +135,7 @@ def process_changes_files(changes_files, type):
             ctime = os.stat(d["filename"])[stat.ST_CTIME];
             if ctime < oldest:
                 oldest = ctime;
-            have_note = have_note + (d.has_key("lisa note"));
+            have_note += (d.has_key("lisa note"));
         per_source[source]["oldest"] = oldest;
         if not have_note:
             per_source[source]["note_state"] = 0; # none
@@ -136,31 +145,50 @@ def process_changes_files(changes_files, type):
             per_source[source]["note_state"] = 2; # all
     per_source_items = per_source.items();
     per_source_items.sort(sg_compare);
-    msg = "";
+
+    entries = [];
+    max_source_len = 0;
+    max_version_len = 0;
+    max_arch_len = 0;
     for i in per_source_items:
         last_modified = time.time()-i[1]["oldest"];
         source = i[1]["list"][0]["source"];
+        if len(source) > max_source_len:
+            max_source_len = len(source);
         arches = {};
         versions = {};
         for j in i[1]["list"]:
             for arch in j["architecture"].keys():
                 arches[arch] = "";
-            versions[j["version"]] = "";
-        arch_list = string.join(arches.keys(), ", ");
-        version_list = string.join(versions.keys(), ", ");
+            version = j["version"];
+            versions[version] = "";
+        arches_list = arches.keys();
+        arches_list.sort(utils.arch_compare_sw);
+        arch_list = " ".join(arches_list);
+        version_list = " ".join(versions.keys());
+        if len(version_list) > max_version_len:
+            max_version_len = len(version_list);
+        if len(arch_list) > max_arch_len:
+            max_arch_len = len(arch_list);
         if i[1]["note_state"]:
-            note = " | [note]";
+            note = " | [N]";
         else:
             note = "";
-        msg = msg + "%10s | %10s | %10s%s | %s old\n" % (source, version_list, arch_list, note, time_pp(last_modified));
+        entries.append([source, version_list, arch_list, note, time_pp(last_modified)]);
+
+    format="%%-%ds | %%-%ds | %%-%ds%%s | %%s old\n" % (max_source_len, max_version_len, max_arch_len)
+    msg = "";
+    for entry in entries:
+        (source, version_list, arch_list, note, last_modified) = entry;
+        msg += format % (source, version_list, arch_list, note, last_modified);
 
     if msg:
         total_count = len(changes_files);
         source_count = len(per_source_items);
-        print string.upper(type)
-        print "-"*len(type)
+        print type.upper();
+        print "-"*len(type);
         print
-        print msg
+        print msg;
         print "%s %s source package%s / %s %s package%s in total." % (source_count, type, plural(source_count), total_count, type, plural(total_count));
         print
 
@@ -170,13 +198,26 @@ def main():
     global Cnf, Katie;
 
     Cnf = utils.get_conf();
-    apt_pkg.ParseCommandLine(Cnf,[],sys.argv);
+    Arguments = [('h',"help","Helena::Options::Help")];
+    for i in [ "help" ]:
+       if not Cnf.has_key("Helena::Options::%s" % (i)):
+           Cnf["Helena::Options::%s" % (i)] = "";
+
+    apt_pkg.ParseCommandLine(Cnf, Arguments, sys.argv);
+
+    Options = Cnf.SubTree("Helena::Options")
+    if Options["Help"]:
+       usage();
+
     Katie = katie.Katie(Cnf);
 
-    changes_files = glob.glob("%s/*.changes" % (Cnf["Dir::Queue::Byhand"]));
-    process_changes_files(changes_files, "byhand");
-    changes_files = glob.glob("%s/*.changes" % (Cnf["Dir::Queue::New"]));
-    process_changes_files(changes_files, "new");
+    directories = Cnf.ValueList("Helena::Directories");
+    if not directories:
+        directories = [ "byhand", "new" ];
+
+    for directory in directories:
+        changes_files = glob.glob("%s/*.changes" % (Cnf["Dir::Queue::%s" % (directory)]));
+        process_changes_files(changes_files, directory);
 
 ################################################################################