]> git.decadent.org.uk Git - dak.git/commitdiff
merge ftpmaster branch
authorThomas Viehmann <tv@beamnet.de>
Sat, 3 May 2008 10:25:00 +0000 (10:25 +0000)
committerThomas Viehmann <tv@beamnet.de>
Sat, 3 May 2008 10:25:00 +0000 (10:25 +0000)
1  2 
dak/examine_package.py
dak/show_new.py

diff --combined dak/examine_package.py
index 626b9327c39fab2cfb9dd45eeed599bb8f4e5db9,5080d3482b3876e6f4de6297769a83f19aa6ccd6..182ed2d87ee19faf436db148917d43a7dd146970
mode 100755,100644..100644
@@@ -89,24 -89,19 +89,24 @@@ PACKAGE can be a .changes, .dsc, .deb o
  # probably xml.sax.saxutils would work as well
  
  def html_escape(s):
-   return re_html_escaping.sub(lambda x: html_escaping.get(x.group(0)), s)
+     return re_html_escaping.sub(lambda x: html_escaping.get(x.group(0)), s)
  
  def escape_if_needed(s):
-   if use_html:
-       return re_html_escaping.sub(lambda x: html_escaping.get(x.group(0)), s)
-   else:
-     return 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:
-     if bodyelement:
-       print """<thead>
-           <tr><th colspan="2" class="title" onclick="toggle('%(bodyelement)s', 'table-row-group', 'table-row-group')">%(title)s</th></tr>
-         </thead>"""%{"bodyelement":bodyelement,"title":html_escape(s)}
+     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</th></tr>
++              </thead>"""%{"bodyelement":bodyelement,"title":html_escape(s)}
++        else:
++            print "<h%d>%s</h%d>" % (level, html_escape(s), level)
      else:
-       print "<h%d>%s</h%d>" % (level, html_escape(s), level)
-   else:
-     print "---- %s ----" % (s)
+         print "---- %s ----" % (s)
  
  # Colour definitions, 'end' isn't really for use
  
@@@ -128,62 -123,31 +128,62 @@@ html_colours = 
    'maintainer': ('<span style="color: green">',"</span>")}
  
  def colour_output(s, colour):
-   if use_html:
-     return ("%s%s%s" % (html_colours[colour][0], html_escape(s), html_colours[colour][1]))
-   else:
-     return ("%s%s%s" % (ansi_colours[colour], s, ansi_colours['end']))
+     if use_html:
+         return ("%s%s%s" % (html_colours[colour][0], html_escape(s), html_colours[colour][1]))
+     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  
++    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
++    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:
 +        return """<tr><td>"""+s+"""</td></tr>"""
 +    else:
 +        return s
 +
 +def format_field(k,v):
      if use_html:
 -        print "<pre>%s</pre>" % (s)
 +        return """<tr><td class="key">%s:</td><td class="val">%s</td></tr>"""%(k,v)
      else:
 -        print s
 +        return "%s: %s"%(k,v)
  
 -def print_formatted_text(s):
 +def foldable_output(title, elementnameprefix, content, norow=False):
 +    d = {'elementnameprefix':elementnameprefix}
      if use_html:
 -        print "<pre>%s</pre>" % (html_escape(s))
 +        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 """    <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>"""
  
  ################################################################################
  
  def get_depends_parts(depend) :
      v_match = re_version.match(depend)
      if v_match:
-       d_parts = { 'name' : v_match.group(1), 'version' : v_match.group(2) }
+         d_parts = { 'name' : v_match.group(1), 'version' : v_match.group(2) }
      else :
-       d_parts = { 'name' : depend , 'version' : '' }
+         d_parts = { 'name' : depend , 'version' : '' }
      return d_parts
  
  def get_or_list(depend) :
@@@ -203,19 -167,19 +203,19 @@@ def split_depends (d_str) 
      dep_list = get_comma_list(d_str)
      d = 0
      while d < len(dep_list):
-       # put depends into their own list
-       depends_tree.append([dep_list[d]])
-       d += 1
+         # put depends into their own list
+         depends_tree.append([dep_list[d]])
+         d += 1
      d = 0
      while d < len(depends_tree):
-       k = 0
-       # split up Or'd depends into a multi-item list
-       depends_tree[d] = get_or_list(depends_tree[d][0])
-       while k < len(depends_tree[d]):
-           # split depends into {package, version relation}
-           depends_tree[d][k] = get_depends_parts(depends_tree[d][k])
-           k += 1
-       d += 1
+         k = 0
+         # split up Or'd depends into a multi-item list
+         depends_tree[d] = get_or_list(depends_tree[d][0])
+         while k < len(depends_tree[d]):
+             # split depends into {package, version relation}
+             depends_tree[d][k] = get_depends_parts(depends_tree[d][k])
+             k += 1
+         d += 1
      return depends_tree
  
  def read_control (filename):
  
      deb_file = daklib.utils.open_file(filename)
      try:
-       extracts = apt_inst.debExtractControl(deb_file)
-       control = apt_pkg.ParseSection(extracts)
+         extracts = apt_inst.debExtractControl(deb_file)
+         control = apt_pkg.ParseSection(extracts)
      except:
-       print formatted_text("can't parse control info")
 -        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()
  
      control_keys = control.keys()
  
      if control.has_key("Depends"):
-       depends_str = control.Find("Depends")
-       # create list of dependancy lists
-       depends = split_depends(depends_str)
+         depends_str = control.Find("Depends")
+         # create list of dependancy lists
+         depends = split_depends(depends_str)
  
      if control.has_key("Recommends"):
-       recommends_str = control.Find("Recommends")
-       recommends = split_depends(recommends_str)
+         recommends_str = control.Find("Recommends")
+         recommends = split_depends(recommends_str)
  
      if control.has_key("Section"):
-       section_str = control.Find("Section")
-       c_match = re_contrib.search(section_str)
-       nf_match = re_nonfree.search(section_str)
-       if c_match :
-           # contrib colour
-           section = colour_output(section_str, 'contrib')
-       elif nf_match :
-           # non-free colour
-           section = colour_output(section_str, 'nonfree')
-       else :
-           # main
-           section = colour_output(section_str, 'main')
+         section_str = control.Find("Section")
+         c_match = re_contrib.search(section_str)
+         nf_match = re_nonfree.search(section_str)
+         if c_match :
+             # contrib colour
+             section = colour_output(section_str, 'contrib')
+         elif nf_match :
+             # non-free colour
+             section = colour_output(section_str, 'nonfree')
+         else :
+             # main
+             section = colour_output(section_str, 'main')
      if control.has_key("Architecture"):
-       arch_str = control.Find("Architecture")
-       arch = colour_output(arch_str, 'arch')
+         arch_str = control.Find("Architecture")
+         arch = colour_output(arch_str, 'arch')
  
      if control.has_key("Maintainer"):
-       maintainer = control.Find("Maintainer")
-       localhost = re_localhost.search(maintainer)
-       if localhost:
-           #highlight bad email
-           maintainer = colour_output(maintainer, 'maintainer')
-       else:
-           maintainer = escape_if_needed(maintainer)
+         maintainer = control.Find("Maintainer")
+         localhost = re_localhost.search(maintainer)
+         if localhost:
+             #highlight bad email
+             maintainer = colour_output(maintainer, 'maintainer')
+         else:
+             maintainer = escape_if_needed(maintainer)
  
      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(filename)
 -        dsc = daklib.utils.parse_changes(dsc_filename)
++        dsc = daklib.utils.parse_changes(filename)
      except:
-       return formatted_text("can't parse .dsc control info")
 -        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):
      result = ""
      comma_count = 1
      for l in depends_tree:
-       if (comma_count >= 2):
-           result += ", "
-       or_count = 1
-       for d in l:
-           if (or_count >= 2 ):
-               result += " | "
-           # doesn't do version lookup yet.
-           q = projectB.query("SELECT DISTINCT(b.package), b.version, c.name, su.suite_name FROM  binaries b, files fi, location l, component c, bin_associations ba, suite su WHERE b.package='%s' AND b.file = fi.id AND fi.location = l.id AND l.component = c.id AND ba.bin=b.id AND ba.suite = su.id AND su.suite_name='%s' ORDER BY b.version desc" % (d['name'], suite))
-           ql = q.getresult()
-           if ql:
-               i = ql[0]
-               adepends = d['name']
-               if d['version'] != '' :
-                   adepends += " (%s)" % (d['version'])
-               
-               if i[2] == "contrib":
-                   result += colour_output(adepends, "contrib")
-               elif i[2] == "non-free":
-                   result += colour_output(adepends, "nonfree")
-               else :
-                   result += colour_output(adepends, "main")
-           else:
-               adepends = d['name']
-               if d['version'] != '' :
-                   adepends += " (%s)" % (d['version'])
-               result += colour_output(adepends, "bold")
-           or_count += 1
-       comma_count += 1
+         if (comma_count >= 2):
+             result += ", "
+         or_count = 1
+         for d in l:
+             if (or_count >= 2 ):
+                 result += " | "
+             # doesn't do version lookup yet.
+             q = projectB.query("SELECT DISTINCT(b.package), b.version, c.name, su.suite_name FROM  binaries b, files fi, location l, component c, bin_associations ba, suite su WHERE b.package='%s' AND b.file = fi.id AND fi.location = l.id AND l.component = c.id AND ba.bin=b.id AND ba.suite = su.id AND su.suite_name='%s' ORDER BY b.version desc" % (d['name'], suite))
+             ql = q.getresult()
+             if ql:
+                 i = ql[0]
+                 adepends = d['name']
+                 if d['version'] != '' :
+                     adepends += " (%s)" % (d['version'])
+                 if i[2] == "contrib":
+                     result += colour_output(adepends, "contrib")
+                 elif i[2] == "non-free":
+                     result += colour_output(adepends, "nonfree")
+                 else :
+                     result += colour_output(adepends, "main")
+             else:
+                 adepends = d['name']
+                 if d['version'] != '' :
+                     adepends += " (%s)" % (d['version'])
+                 result += colour_output(adepends, "bold")
+             or_count += 1
+         comma_count += 1
      return result
  
  def output_deb_info(filename):
      (control, control_keys, section, depends, recommends, arch, maintainer) = read_control(filename)
  
 -    to_print = ""
      if control == '':
-       return formatted_text("no control info")
 -        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':
 -                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)
++        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':
 +            desc = control.Find(key)
 +            desc = re_newlinespace.sub('\n ', desc)
 +            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]
  
      if copyright == "":
 -        print_formatted_text("WARNING: No copyright found, please check package manually.")
 -        return
 +        return formatted_text("WARNING: No copyright found, please check package manually.")
  
      doc_directory = re_doc_directory.sub(r'\1', copyright)
      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()
  
 +    res = ""
      if printed_copyrights.has_key(copyrightmd5) and printed_copyrights[copyrightmd5] != "%s (%s)" % (package, deb_filename):
 -        print_formatted_text( "NOTE: Copyright is the same as %s.\n" % \
 -                (printed_copyrights[copyrightmd5]))
 +        res += formatted_text( "NOTE: Copyright is the same as %s.\n\n" % \
 +                               (printed_copyrights[copyrightmd5]))
      else:
-       printed_copyrights[copyrightmd5] = "%s (%s)" % (package, deb_filename)
+         printed_copyrights[copyrightmd5] = "%s (%s)" % (package, deb_filename)
 -
 -    print_formatted_text(copyright)
 +    return res+formatted_text(copyright)
  
  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
+         is_a_udeb = 1
      else:
-       is_a_udeb = 0
+         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.
@@@ -475,13 -435,14 +475,13 @@@ def strip_pgp_signature (filename)
          if line.startswith("-----END PGP SIGNATURE"):
              inside_signature = 0
              continue
-       contents += line
+         contents += line
      file.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(".deb") or file.endswith(".udeb"):
+             check_deb(file)
          if file.endswith(".dsc"):
              check_dsc(file)
          # else: => byhand
@@@ -504,24 -465,24 +504,24 @@@ def main ()
                   ('H',"html-output","Examine-Package::Options::Html-Output"),
                  ]
      for i in [ "Help", "Html-Output", "partial-html" ]:
-       if not Cnf.has_key("Examine-Package::Options::%s" % (i)):
-           Cnf["Examine-Package::Options::%s" % (i)] = ""
+         if not Cnf.has_key("Examine-Package::Options::%s" % (i)):
+             Cnf["Examine-Package::Options::%s" % (i)] = ""
  
      args = apt_pkg.ParseCommandLine(Cnf,Arguments,sys.argv)
      Options = Cnf.SubTree("Examine-Package::Options")
  
      if Options["Help"]:
-       usage()
+         usage()
  
      stdout_fd = sys.stdout
  
      for file in args:
          try:
-           if not Options["Html-Output"]:
-               # Pipe output for each argument through less
-               less_fd = os.popen("less -R -", 'w', 0)
-               # -R added to display raw control chars for colour
-               sys.stdout = less_fd
+             if not Options["Html-Output"]:
+                 # Pipe output for each argument through less
+                 less_fd = os.popen("less -R -", 'w', 0)
+                 # -R added to display raw control chars for colour
+                 sys.stdout = less_fd
              try:
                  if file.endswith(".changes"):
                      check_changes(file)
                  else:
                      daklib.utils.fubar("Unrecognised file type: '%s'." % (file))
              finally:
-               if not Options["Html-Output"]:
-                   # Reset stdout here so future less invocations aren't FUBAR
-                   less_fd.close()
-                   sys.stdout = stdout_fd
+                 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':
                  daklib.utils.warn("[examine-package] Caught EPIPE; skipping.")
  
  if __name__ == '__main__':
      main()
diff --combined dak/show_new.py
index a35f4d65d4efa88b1c5d83fade12468293ef105e,19566881ca2d2bdbf6606d8bd1185d3423c0383d..34baba954940946f1184253da5e40a9cd40cf051
mode 100755,100644..100644
@@@ -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
  import daklib.utils
  
  # Globals
@@@ -44,98 -44,54 +44,98 @@@ 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>
 +    <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}
++        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>
 +"""
  
  ################################################################################
  
@@@ -159,23 -115,19 +159,23 @@@ def do_pkg(changes_file)
      # 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)
          examine_package.display_changes(Upload.pkg.changes_file)
  
 -        for pkg in new.keys():
 -            for file in new[pkg]["files"]:
 -                if ( files[file].has_key("new") and not
 -                     files[file]["type"] in [ "orig.tar.gz", "orig.tar.bz2", "tar.gz", "tar.bz2", "diff.gz", "diff.bz2"] ):
 -                    if file.endswith(".deb") or file.endswith(".udeb"):
 -                        examine_package.check_deb(file)
 -                    elif file.endswith(".dsc"):
 -                        examine_package.check_dsc(file)
 +        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)
  
@@@ -198,8 -149,7 +198,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)):
@@@ -233,7 -183,7 +233,7 @@@ 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))