]> git.decadent.org.uk Git - dak.git/commitdiff
Merge first version of Marks cleanup branch
authorJoerg Jaspert <joerg@debian.org>
Sat, 3 May 2008 19:50:37 +0000 (21:50 +0200)
committerJoerg Jaspert <joerg@debian.org>
Sat, 3 May 2008 19:50:37 +0000 (21:50 +0200)
1  2 
dak/examine_package.py
dak/show_new.py

diff --combined dak/examine_package.py
index b9ac9af3b1c2acc1b26cd71868ecfb69b2eeb645,47be7f654db3c0f27d08089fddacd300492ceef2..d452d71ca64359df7261fae40142c0798aa244df
mode 100644,100644..100755
@@@ -93,18 -93,13 +93,18 @@@ def html_escape(s)
  
  def escape_if_needed(s):
      if use_html:
 -        return re_html_escaping.sub(html_escaping.get, s)
 +        return re_html_escaping.sub(lambda x: html_escaping.get(x.group(0)), s)
      else:
          return s
  
 -def headline(s, level=2):
 +def headline(s, level=2, bodyelement=None):
      if use_html:
 -        print "<h%d>%s</h%d>" % (level, html_escape(s), level)
 +        if bodyelement:
 +            print """<thead>
 +                <tr><th colspan="2" class="title" onclick="toggle('%(bodyelement)s', 'table-row-group', 'table-row-group')">%(title)s <span class="toggle-msg">(click to toggle)</span></th></tr>
 +              </thead>"""%{"bodyelement":bodyelement,"title":html_escape(s)}
 +        else:
 +            print "<h%d>%s</h%d>" % (level, html_escape(s), level)
      else:
          print "---- %s ----" % (s)
  
@@@ -133,48 -128,17 +133,48 @@@ def colour_output(s, colour)
      else:
          return ("%s%s%s" % (ansi_colours[colour], s, ansi_colours['end']))
  
 -def print_escaped_text(s):
 +def escaped_text(s, strip=False):
 +    if use_html:
 +        if strip:
 +            s = s.strip()
 +        return "<pre>%s</pre>" % (s)
 +    else:
 +        return s
 +
 +def formatted_text(s, strip=False):
 +    if use_html:
 +        if strip:
 +            s = s.strip()
 +        return "<pre>%s</pre>" % (html_escape(s))
 +    else:
 +        return s
 +
 +def output_row(s):
      if use_html:
 -        print "<pre>%s</pre>" % (s)
 +        return """<tr><td>"""+s+"""</td></tr>"""
      else:
 -        print s
 +        return s
  
 -def print_formatted_text(s):
 +def format_field(k,v):
 +    if use_html:
 +        return """<tr><td class="key">%s:</td><td class="val">%s</td></tr>"""%(k,v)
 +    else:
 +        return "%s: %s"%(k,v)
 +
 +def foldable_output(title, elementnameprefix, content, norow=False):
 +    d = {'elementnameprefix':elementnameprefix}
 +    if use_html:
 +        print """<div id="%(elementnameprefix)s-wrap"><a name="%(elementnameprefix)s" />
 +                   <table class="infobox rfc822">"""%d
 +    headline(title, bodyelement="%(elementnameprefix)s-body"%d)
      if use_html:
 -        print "<pre>%s</pre>" % (html_escape(s))
 +        print """    <tbody id="%(elementnameprefix)s-body" class="infobody">"""%d
 +    if norow:
 +        print content
      else:
 -        print s
 +        print output_row(content)
 +    if use_html:
 +        print """</tbody></table></div>"""
  
  ################################################################################
  
@@@ -230,9 -194,9 +230,9 @@@ def read_control (filename)
          extracts = apt_inst.debExtractControl(deb_file)
          control = apt_pkg.ParseSection(extracts)
      except:
 -        print_formatted_text("can't parse control info")
 -        # TV-COMMENT: this will raise exceptions in two lines
 -        control = ''
 +        print formatted_text("can't parse control info")
 +        deb_file.close()
 +        raise
  
      deb_file.close()
  
  
      return (control, control_keys, section, depends, recommends, arch, maintainer)
  
 -def read_dsc (dsc_filename):
 +def read_changes_or_dsc (filename):
      dsc = {}
  
 -    dsc_file = daklib.utils.open_file(dsc_filename)
 +    dsc_file = daklib.utils.open_file(filename)
      try:
 -        dsc = daklib.utils.parse_changes(dsc_filename)
 +        dsc = daklib.utils.parse_changes(filename)
      except:
 -        print_formatted_text("can't parse control info")
 +        return formatted_text("can't parse .dsc control info")
      dsc_file.close()
  
 -    filecontents = escape_if_needed(strip_pgp_signature(dsc_filename))
 -
 -    if dsc.has_key("build-depends"):
 -        builddep = split_depends(dsc["build-depends"])
 -        builddepstr = create_depends_string(builddep)
 -        filecontents = re_builddep.sub("Build-Depends: "+builddepstr, filecontents)
 -
 -    if dsc.has_key("build-depends-indep"):
 -        builddepindstr = create_depends_string(split_depends(dsc["build-depends-indep"]))
 -        filecontents = re_builddepind.sub("Build-Depends-Indep: "+builddepindstr, filecontents)
 +    filecontents = strip_pgp_signature(filename)
 +    keysinorder = []
 +    for l in filecontents.split('\n'):
 +        m = re.match(r'([-a-zA-Z0-9]*):', l)
 +        if m:
 +            keysinorder.append(m.group(1))
 +
 +    for k in dsc.keys():
 +        if k in ("build-depends","build-depends-indep"):
 +            dsc[k] = create_depends_string(split_depends(dsc[k]))
 +        elif k == "architecture":
 +            if (dsc["architecture"] != "any"):
 +                dsc['architecture'] = colour_output(dsc["architecture"], 'arch')
 +        elif k in ("files","changes","description"):
 +            if use_html:
 +                dsc[k] = formatted_text(dsc[k], strip=True)
 +            else:
 +                dsc[k] = ('\n'+'\n'.join(map(lambda x: ' '+x, dsc[k].split('\n')))).rstrip()
 +        else:
 +            dsc[k] = escape_if_needed(dsc[k])
  
 -    if dsc.has_key("architecture") :
 -        if (dsc["architecture"] != "any"):
 -            newarch = colour_output(dsc["architecture"], 'arch')
 -            filecontents = re_arch.sub("Architecture: " + newarch, filecontents)
 +    keysinorder = filter(lambda x: not x.lower().startswith('checksums-'), keysinorder)
  
 +    filecontents = '\n'.join(map(lambda x: format_field(x,dsc[x.lower()]), keysinorder))+'\n'
      return filecontents
  
  def create_depends_string (depends_tree):
  def output_deb_info(filename):
      (control, control_keys, section, depends, recommends, arch, maintainer) = read_control(filename)
  
 -    to_print = ""
      if control == '':
 -        print_formatted_text("no control info")
 -    else:
 -        for key in control_keys :
 -            output = " " + key + ": "
 -            if key == 'Depends':
 -                output += create_depends_string(depends)
 -            elif key == 'Recommends':
 -                output += create_depends_string(recommends)
 -            elif key == 'Section':
 -                output += section
 -            elif key == 'Architecture':
 -                output += arch
 -            elif key == 'Maintainer':
 -                output += maintainer
 -            elif key == 'Description':
 +        return formatted_text("no control info")
 +    to_print = ""
 +    for key in control_keys :
 +        if key == 'Depends':
 +            field_value = create_depends_string(depends)
 +        elif key == 'Recommends':
 +            field_value = create_depends_string(recommends)
 +        elif key == 'Section':
 +            field_value = section
 +        elif key == 'Architecture':
 +            field_value = arch
 +        elif key == 'Maintainer':
 +            field_value = maintainer
 +        elif key == 'Description':
 +            if use_html:
 +                field_value = formatted_text(control.Find(key), strip=True)
 +            else:
                  desc = control.Find(key)
                  desc = re_newlinespace.sub('\n ', desc)
 -                output += escape_if_needed(desc)
 -            else:
 -                output += escape_if_needed(control.Find(key))
 -            to_print += output + '\n'
 -        print_escaped_text(to_print)
 +                field_value = escape_if_needed(desc)
 +        else:
 +            field_value = escape_if_needed(control.Find(key))
 +        to_print += " "+format_field(key,field_value)+'\n'
 +    return to_print
  
  def do_command (command, filename, escaped=0):
      o = os.popen("%s %s" % (command, filename))
      if escaped:
 -        print_escaped_text(o.read())
 +        return escaped_text(o.read())
      else:
 -        print_formatted_text(o.read())
 +        return formatted_text(o.read())
  
  def do_lintian (filename):
      if use_html:
 -        do_command("lintian --show-overrides --color html", filename, 1)
 +        return do_command("lintian --show-overrides --color html", filename, 1)
      else:
 -        do_command("lintian --show-overrides --color always", filename, 1)
 +        return do_command("lintian --show-overrides --color always", filename, 1)
  
 -def print_copyright (deb_filename):
 +def get_copyright (deb_filename):
      package = re_package.sub(r'\1', deb_filename)
      o = os.popen("dpkg-deb -c %s | egrep 'usr(/share)?/doc/[^/]*/copyright' | awk '{print $6}' | head -n 1" % (deb_filename))
-     copyright = o.read()[:-1]
+     cright = o.read()[:-1]
  
-     if copyright == "":
-         return formatted_text("WARNING: No copyright found, please check package manually.")
+     if cright == "":
+         print_formatted_text("WARNING: No copyright found, please check package manually.")
+         return
  
-     doc_directory = re_doc_directory.sub(r'\1', copyright)
+     doc_directory = re_doc_directory.sub(r'\1', cright)
      if package != doc_directory:
 -        print_formatted_text("WARNING: wrong doc directory (expected %s, got %s)." % (package, doc_directory))
 -        return
 +        return formatted_text("WARNING: wrong doc directory (expected %s, got %s)." % (package, doc_directory))
  
-     o = os.popen("dpkg-deb --fsys-tarfile %s | tar xvOf - %s 2>/dev/null" % (deb_filename, copyright))
-     copyright = o.read()
-     copyrightmd5 = md5.md5(copyright).hexdigest()
+     o = os.popen("dpkg-deb --fsys-tarfile %s | tar xvOf - %s 2>/dev/null" % (deb_filename, cright))
+     cright = o.read()
+     crightmd5 = md5.md5(cright).hexdigest()
  
-     if printed_copyrights.has_key(copyrightmd5) and printed_copyrights[copyrightmd5] != "%s (%s)" % (package, deb_filename):
-         res += formatted_text( "NOTE: Copyright is the same as %s.\n\n" % \
-                                (printed_copyrights[copyrightmd5]))
 +    res = ""
 -        print_formatted_text( "NOTE: Copyright is the same as %s.\n" % \
+     if printed_copyrights.has_key(crightmd5) and printed_copyrights[crightmd5] != "%s (%s)" % (package, deb_filename):
++        res += formatted_text( "NOTE: Copyright is the same as %s.\n" % \
+                 (printed_copyrights[crightmd5]))
      else:
-         printed_copyrights[copyrightmd5] = "%s (%s)" % (package, deb_filename)
-     return res+formatted_text(copyright)
+         printed_copyrights[crightmd5] = "%s (%s)" % (package, deb_filename)
 -
 -    print_formatted_text(cright)
++    res += formatted_text(cright)
++    return res
  
  def check_dsc (dsc_filename):
 -    headline(".dsc file for %s" % (dsc_filename))
 -    (dsc) = read_dsc(dsc_filename)
 -    print_escaped_text(dsc)
 -    headline("lintian check for %s" % (dsc_filename))
 -    do_lintian(dsc_filename)
 +    (dsc) = read_changes_or_dsc(dsc_filename)
 +    foldable_output(dsc_filename, "dsc", dsc, norow=True)
 +    foldable_output("lintian check for %s" % dsc_filename, "source-lintian", do_lintian(dsc_filename))
  
  def check_deb (deb_filename):
      filename = os.path.basename(deb_filename)
 +    packagename = filename.split('_')[0]
  
      if filename.endswith(".udeb"):
          is_a_udeb = 1
      else:
          is_a_udeb = 0
  
 -    headline("control file for %s" % (filename))
 -    #do_command ("dpkg -I", deb_filename)
 -    output_deb_info(deb_filename)
 +
 +    foldable_output("control file for %s" % (filename), "binary-%s-control"%packagename,
 +                    output_deb_info(deb_filename), norow=True)
  
      if is_a_udeb:
 -        headline("skipping lintian check for udeb")
 -        print
 +        foldable_output("skipping lintian check for udeb", "binary-%s-lintian"%packagename,
 +                        "")
      else:
 -        headline("lintian check for %s" % (filename))
 -        do_lintian(deb_filename)
 +        foldable_output("lintian check for %s" % (filename), "binary-%s-lintian"%packagename,
 +                        do_lintian(deb_filename))
  
 -    headline("contents of %s" % (filename))
 -    do_command ("dpkg -c", deb_filename)
 +    foldable_output("contents of %s" % (filename), "binary-%s-contents"%packagename,
 +                    do_command("dpkg -c", deb_filename))
  
      if is_a_udeb:
 -        headline("skipping copyright for udeb")
 +        foldable_output("skipping copyright for udeb", "binary-%s-copyright"%packagename,
 +                        "")
      else:
 -        headline("copyright of %s" % (filename))
 -        print_copyright(deb_filename)
 +        foldable_output("copyright of %s" % (filename), "binary-%s-copyright"%packagename,
 +                        get_copyright(deb_filename))
  
 -    headline("file listing of %s" % (filename))
 -    do_command ("ls -l", deb_filename)
 +    foldable_output("file listing of %s" % (filename),  "binary-%s-file-listing"%packagename,
 +                    do_command("ls -l", deb_filename))
  
  # Read a file, strip the signature and return the modified contents as
  # a string.
  def strip_pgp_signature (filename):
-     file = daklib.utils.open_file (filename)
+     f = daklib.utils.open_file (filename)
      contents = ""
      inside_signature = 0
      skip_next = 0
-     for line in file.readlines():
+     for line in f.readlines():
          if line[:-1] == "":
              continue
          if inside_signature:
              inside_signature = 0
              continue
          contents += line
-     file.close()
+     f.close()
      return contents
  
 -# Display the .changes [without the signature]
 -def display_changes (changes_filename):
 -    headline(".changes file for %s" % (changes_filename))
 -    print_formatted_text(strip_pgp_signature(changes_filename))
 +def display_changes(changes_filename):
 +    changes = read_changes_or_dsc(changes_filename)
 +    foldable_output(changes_filename, "changes", changes, norow=True)
  
  def check_changes (changes_filename):
      display_changes(changes_filename)
  
      changes = daklib.utils.parse_changes (changes_filename)
      files = daklib.utils.build_file_list(changes)
-     for file in files.keys():
-         if file.endswith(".deb") or file.endswith(".udeb"):
-             check_deb(file)
-         if file.endswith(".dsc"):
-             check_dsc(file)
+     for f in files.keys():
+         if f.endswith(".deb") or f.endswith(".udeb"):
+             check_deb(f)
+         if f.endswith(".dsc"):
+             check_dsc(f)
          # else: => byhand
  
  def main ():
  
      stdout_fd = sys.stdout
  
-     for file in args:
+     for f in args:
          try:
              if not Options["Html-Output"]:
                  # Pipe output for each argument through less
                  # -R added to display raw control chars for colour
                  sys.stdout = less_fd
              try:
-                 if file.endswith(".changes"):
-                     check_changes(file)
-                 elif file.endswith(".deb") or file.endswith(".udeb"):
-                     check_deb(file)
-                 elif file.endswith(".dsc"):
-                     check_dsc(file)
+                 if f.endswith(".changes"):
+                     check_changes(f)
+                 elif f.endswith(".deb") or f.endswith(".udeb"):
+                     check_deb(f)
+                 elif f.endswith(".dsc"):
+                     check_dsc(f)
                  else:
-                     daklib.utils.fubar("Unrecognised file type: '%s'." % (file))
+                     daklib.utils.fubar("Unrecognised file type: '%s'." % (f))
              finally:
                  if not Options["Html-Output"]:
                      # Reset stdout here so future less invocations aren't FUBAR
                      less_fd.close()
                      sys.stdout = stdout_fd
          except IOError, e:
-             if errno.errorcode[e.errno] == 'EPIPE':
+             if e.errno == errno.EPIPE:
                  daklib.utils.warn("[examine-package] Caught EPIPE; skipping.")
                  pass
              else:
diff --combined dak/show_new.py
index 2596f864670cba26a96920802524fbdad9241220,f64027131d3430173c5b2425038340f93eb95266..a18847cc96d0f76bdc88bdad8cfc2d0f0eacb6ff
mode 100644,100644..100755
@@@ -29,7 -29,7 +29,7 @@@ import copy, os, sys, tim
  import apt_pkg
  import examine_package
  import daklib.database
- import daklib.queue
+ import daklib.queue as queue
  import daklib.utils
  
  # Globals
@@@ -44,97 -44,54 +44,97 @@@ sources = set(
  ################################################################################
  ################################################################################
  
 -def html_header(name):
 +def html_header(name, filestoexamine):
      if name.endswith('.changes'):
          name = ' '.join(name.split('_')[:2])
 -    print """<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 -        <html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8">"""
 -    print "<title>%s - Debian NEW package overview</title>" % (name)
 -    print """<link type="text/css" rel="stylesheet" href="/style.css">
 -        <link rel="shortcut icon" href="http://www.debian.org/favicon.ico">
 -        </head>
 -        <body>
 -        <div align="center">
 -        <a href="http://www.debian.org/">
 -     <img src="http://www.debian.org/logos/openlogo-nd-50.png" border="0" hspace="0" vspace="0" alt=""></a>
 -        <a href="http://www.debian.org/">
 -     <img src="http://www.debian.org/Pics/debian.png" border="0" hspace="0" vspace="0" alt="Debian Project"></a>
 -        </div>
 -        <br />
 -        <table class="reddy" width="100%">
 -        <tr>
 -        <td class="reddy">
 -    <img src="http://www.debian.org/Pics/red-upperleft.png" align="left" border="0" hspace="0" vspace="0"
 -     alt="" width="15" height="16"></td>"""
 -    print """<td rowspan="2" class="reddy">Debian NEW package overview for %s</td>""" % (name)
 -    print """<td class="reddy">
 -    <img src="http://www.debian.org/Pics/red-upperright.png" align="right" border="0" hspace="0" vspace="0"
 -     alt="" width="16" height="16"></td>
 -        </tr>
 -        <tr>
 -        <td class="reddy">
 -    <img src="http://www.debian.org/Pics/red-lowerleft.png" align="left" border="0" hspace="0" vspace="0"
 -     alt="" width="16" height="16"></td>
 -        <td class="reddy">
 -    <img src="http://www.debian.org/Pics/red-lowerright.png" align="right" border="0" hspace="0" vspace="0"
 -     alt="" width="15" height="16"></td>
 -        </tr>
 -        </table>
 -        """
 +    print """<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
 +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de">
 +  <head>
 +    <meta http-equiv="content-type" content="text/xhtml+xml; charset=utf-8"
 +    />
 +    <title>%(name)s - Debian NEW package overview</title>
 +    <link type="text/css" rel="stylesheet" href="/style.css" />
 +    <link rel="shortcut icon" href="http://www.debian.org/favicon.ico" />
 +    <script type="text/javascript">
 +      //<![CDATA[
 +      <!--
 +      function toggle(id, initial, display) {
 +        var o = document.getElementById(id);
 +        toggleObj(o, initial, display);
 +      }
 +      function show(id, display) {
 +        var o = document.getElementById(id);
 +        o.style.display = 'table-row-group';
 +      }
 +      function toggleObj(o, initial, display) {
 +        if(! o.style.display)
 +          o.style.display = initial;
 +        if(o.style.display == display) {
 +          o.style.display = "none";
 +        } else {
 +          o.style.display = display;
 +        }
 +      }
 +      //-->
 +      //]]>
 +    </script>
 +  </head>
 +  <body id="NEW-details-page">
 +    <div id="logo">
 +      <a href="http://www.debian.org/">
 +        <img src="http://www.debian.org/logos/openlogo-nd-50.png"
 +        alt="debian logo" /></a>
 +      <a href="http://www.debian.org/">
 +        <img src="http://www.debian.org/Pics/debian.png"
 +        alt="Debian Project" /></a>
 +    </div>
 +    <div id="titleblock">
 +      <img src="http://www.debian.org/Pics/red-upperleft.png"
 +      id="red-upperleft" alt="corner image"/>
 +      <img src="http://www.debian.org/Pics/red-lowerleft.png"
 +      id="red-lowerleft" alt="corner image"/>
 +      <img src="http://www.debian.org/Pics/red-upperright.png"
 +      id="red-upperright" alt="corner image"/>
 +      <img src="http://www.debian.org/Pics/red-lowerright.png"
 +      id="red-lowerright" alt="corner image"/>
 +      <span class="title">
 +        Debian NEW package overview for %(name)s
 +      </span>
 +    </div>
 +    """%{"name":name}
 +
 +    # we assume only one source (.dsc) per changes here
 +    print """
 +    <div id="menu">
 +      <p class="title">Navigation</p>
 +      <p><a href="#changes" onclick="show('changes-body')">.changes</a></p>
 +      <p><a href="#dsc" onclick="show('dsc-body')">.dsc</a></p>
 +      <p><a href="#source-lintian" onclick="show('source-lintian-body')">source lintian</a></p>
 +      """
 +    for fn in filter(lambda x: x.endswith('.deb') or x.endswith('.udeb'),filestoexamine):
 +        packagename = fn.split('_')[0]
 +        print """
 +        <p class="subtitle">%(pkg)s</p>
 +        <p><a href="#binary-%(pkg)s-control" onclick="show('binary-%(pkg)s-control-body')">control file</a></p>
 +        <p><a href="#binary-%(pkg)s-lintian" onclick="show('binary-%(pkg)s-lintian-body')">binary lintian</a></p>
 +        <p><a href="#binary-%(pkg)s-contents" onclick="show('binary-%(pkg)s-contents-body')">.deb contents</a></p>
 +        <p><a href="#binary-%(pkg)s-copyright" onclick="show('binary-%(pkg)s-copyright-body')">copyright</a></p>
 +        <p><a href="#binary-%(pkg)s-file-listing" onclick="show('binary-%(pkg)s-file-listing-body')">file listing</a></p>
 +        """%{"pkg":packagename}
 +    print "    </div>"
  
  def html_footer():
 -    print "<p class=\"validate\">Timestamp: %s (UTC)</p>" % (time.strftime("%d.%m.%Y / %H:%M:%S", time.gmtime()))
 -    print """<a href="http://validator.w3.org/check?uri=referer">
 -    <img border="0" src="http://www.w3.org/Icons/valid-html401" alt="Valid HTML 4.01!" height="31" width="88"></a>
 -        <a href="http://jigsaw.w3.org/css-validator/check/referer">
 -    <img border="0" src="http://jigsaw.w3.org/css-validator/images/vcss" alt="Valid CSS!"
 -     height="31" width="88"></a>
 -    """
 -    print "</body></html>"
 -
 +    print """    <p class="validate">Timestamp: %s (UTC)</p>"""% (time.strftime("%d.%m.%Y / %H:%M:%S", time.gmtime()))
 +    print """    <p><a href="http://validator.w3.org/check?uri=referer">
 +      <img src="http://www.w3.org/Icons/valid-html401" alt="Valid HTML 4.01!"
 +      style="border: none; height: 31px; width: 88px" /></a>
 +    <a href="http://jigsaw.w3.org/css-validator/check/referer">
 +      <img src="http://jigsaw.w3.org/css-validator/images/vcss"
 +      alt="Valid CSS!" style="border: none; height: 31px; width: 88px" /></a>
 +    </p>
 +  </body>
 +</html>
 +"""
  
  ################################################################################
  
@@@ -149,7 -106,7 +149,7 @@@ def do_pkg(changes_file)
      changes["suite"] = copy.copy(changes["distribution"])
  
      # Find out what's new
-     new = daklib.queue.determine_new(changes, files, projectB, 0)
+     new = queue.determine_new(changes, files, projectB, 0)
  
      stdout_fd = sys.stdout
  
      # do not generate html output if that source/version already has one.
      if not os.path.exists(os.path.join(Cnf["Show-New::HTMLPath"],htmlname)):
          sys.stdout = open(os.path.join(Cnf["Show-New::HTMLPath"],htmlname),"w")
 -        html_header(changes["source"])
 +
 +        filestoexamine = []
 +        for pkg in new.keys():
 +            for fn in new[pkg]["files"]:
 +                if ( files[fn].has_key("new") and not
 +                     files[fn]["type"] in [ "orig.tar.gz", "orig.tar.bz2", "tar.gz", "tar.bz2", "diff.gz", "diff.bz2"] ):
 +                    filestoexamine.append(fn)
 +
 +        html_header(changes["source"], filestoexamine)
  
-         daklib.queue.check_valid(new)
+         queue.check_valid(new)
          examine_package.display_changes(Upload.pkg.changes_file)
  
 -        for pkg in new.keys():
 -            for f in new[pkg]["files"]:
 -                if ( files[f].has_key("new") and not
 -                     files[f]["type"] in [ "orig.tar.gz", "orig.tar.bz2", "tar.gz", "tar.bz2", "diff.gz", "diff.bz2"] ):
 -                    if f.endswith(".deb") or f.endswith(".udeb"):
 -                        examine_package.check_deb(f)
 -                    elif f.endswith(".dsc"):
 -                        examine_package.check_dsc(f)
 +        for fn in filter(lambda fn: fn.endswith(".dsc"), filestoexamine):
 +            examine_package.check_dsc(fn)
 +        for fn in filter(lambda fn: fn.endswith(".deb") or fn.endswith(".udeb"), filestoexamine):
 +            examine_package.check_deb(fn)
  
          html_footer()
          if sys.stdout != stdout_fd:
  def usage (exit_code=0):
      print """Usage: dak show-new [OPTION]... [CHANGES]...
    -h, --help                show this help and exit.
 +  -p, --html-path [path]    override output directory.
    """
      sys.exit(exit_code)
  
@@@ -197,8 -149,7 +197,8 @@@ def init()
  
      Cnf = daklib.utils.get_conf()
  
 -    Arguments = [('h',"help","Show-New::Options::Help")]
 +    Arguments = [('h',"help","Show-New::Options::Help"),
 +                 ("p","html-path","Show-New::HTMLPath","HasArg")]
  
      for i in ["help"]:
          if not Cnf.has_key("Show-New::Options::%s" % (i)):
      if Options["help"]:
          usage()
  
-     Upload = daklib.queue.Upload(Cnf)
+     Upload = queue.Upload(Cnf)
  
      projectB = Upload.projectB
  
@@@ -232,9 -183,9 +232,9 @@@ def main()
          print "\n" + changes_file
          do_pkg (changes_file)
      files = set(os.listdir(Cnf["Show-New::HTMLPath"]))
 -    to_delete = files.difference(sources)
 +    to_delete = filter(lambda x: x.endswith(".html"), files.difference(sources))
-     for file in to_delete:
-         os.remove(os.path.join(Cnf["Show-New::HTMLPath"],file))
+     for f in to_delete:
+         os.remove(os.path.join(Cnf["Show-New::HTMLPath"],f))
  
  ################################################################################