[med-svn] [Git][med-team/seqan][master] 4 commits: Skip some broken tests

Michael R. Crusoe gitlab at salsa.debian.org
Mon Mar 2 13:53:20 GMT 2020



Michael R. Crusoe pushed to branch master at Debian Med / seqan


Commits:
a58fd357 by Michael R. Crusoe at 2020-03-02T14:47:13+01:00
Skip some broken tests

- - - - -
fe1baf8b by Michael R. Crusoe at 2020-03-02T14:47:41+01:00
tweak python

- - - - -
6b0f6cd5 by Michael R. Crusoe at 2020-03-02T14:47:43+01:00
Mark seqan-dev as Multi-Arch: foreign

- - - - -
dd0c3c68 by Michael R. Crusoe at 2020-03-02T14:51:08+01:00
release 1.4.2+dfsg-4

- - - - -


5 changed files:

- debian/changelog
- debian/control
- debian/patches/2to3.patch
- debian/patches/series
- + debian/patches/skip_broken_tests


Changes:

=====================================
debian/changelog
=====================================
@@ -1,9 +1,11 @@
-seqan (1.4.2+dfsg-4) UNRELEASED; urgency=medium
+seqan (1.4.2+dfsg-4) unstable; urgency=medium
 
+  * Team upload.
+
+  [ Andreas Tille ]
   * Use 2to3 to port from Python2 to Python3
     Closes: #943260
   * debhelper-compat 12
-  * Standards-Version: 4.4.1
   * Respect DEB_BUILD_OPTIONS in override_dh_auto_test target
   * Remove trailing whitespace in debian/changelog
   * Remove trailing whitespace in debian/copyright
@@ -11,61 +13,13 @@ seqan (1.4.2+dfsg-4) UNRELEASED; urgency=medium
   * Remove obsolete fields Contact, Name from debian/upstream/metadata.
   * Rely on pre-initialized dpkg-architecture variables.
 
-  TODO:
-    52% tests passed, 46 tests failed out of 95
-    
-    Total Test time (real) =   9.49 sec
-
-    The following tests FAILED:
-          1 - test_demo_align_align (Failed)
-          2 - test_demo_align_compute_alignment_stats (Failed)
-          3 - test_demo_align_gaps_example (Failed)
-          4 - test_demo_align_global_alignment_banded (Failed)
-          5 - test_demo_align_global_alignment_unbanded (Failed)
-          6 - test_demo_align_integrate_align (Failed)
-          7 - test_demo_bam_io_bam_stream (Failed)
-          8 - test_demo_find_finder_index (Failed)
-          9 - test_demo_find_finder_online (Failed)
-         10 - test_demo_graph_graph_algo_dijkstra (Failed)
-         11 - test_demo_graph_algorithms_all_pairs_shortest_path (Failed)
-         12 - test_demo_graph_algorithms_bellman_ford_algorithm (Failed)
-         13 - test_demo_graph_algorithms_breadth_first_search (Failed)
-         14 - test_demo_graph_algorithms_dag_shortest_path (Failed)
-         15 - test_demo_graph_algorithms_depth_first_search (Failed)
-         16 - test_demo_graph_algorithms_dijkstra (Failed)
-         17 - test_demo_graph_algorithms_floyd_warshall_algorithm (Failed)
-         18 - test_demo_graph_algorithms_ford_fulkerson_algorithm (Failed)
-         19 - test_demo_graph_algorithms_kruskals_algorithm (Failed)
-         20 - test_demo_graph_algorithms_prims_algorithm (Failed)
-         21 - test_demo_graph_algorithms_strongly_connected_components (Failed)
-         22 - test_demo_graph_algorithms_topological_sort (Failed)
-         23 - test_demo_graph_algorithms_transitive_closure (Failed)
-         24 - test_demo_index_index_begin_atEnd_representative (Failed)
-         25 - test_demo_index_index_counting (Failed)
-         26 - test_demo_index_index_finder (Failed)
-         27 - test_demo_index_index_getOccurrences_getFrequency_range_getFibre (Failed)
-         28 - test_demo_index_index_iterator (Failed)
-         29 - test_demo_index_index_iterator_short (Failed)
-         30 - test_demo_index_index_length_countSequences (Failed)
-         31 - test_demo_index_index_mummy (Failed)
-         32 - test_demo_index_index_open_save (Failed)
-         33 - test_demo_index_index_textAt_indexText_saAt_indexRequire (Failed)
-         34 - test_demo_input_output_record_reader (Failed)
-         35 - test_demo_misc_enumerate_strings (Failed)
-         36 - test_demo_modifier_modified_string (Failed)
-         37 - test_demo_modifier_modified_string_mod_view (Failed)
-         38 - test_demo_modifier_modified_string_nested (Failed)
-         39 - test_demo_score_score (Failed)
-         40 - test_demo_seeds_seeds_extension (Failed)
-         41 - test_demo_seq_io_fai_index_example (Failed)
-         42 - test_demo_seq_io_sequence_stream_read (Failed)
-         43 - test_demo_sequence_string2 (Failed)
-         44 - test_demo_sequence_stringset (Failed)
-         78 - test_test_index_fm (SEGFAULT)
-         79 - test_test_index_stree_iterators (SEGFAULT)
-    Errors while running CTest
-
- -- Andreas Tille <tille at debian.org>  Mon, 16 Dec 2019 17:19:24 +0100
+  [ Michael R. Crusoe ]
+  * Skip some broken tests (Closes: #952203)
+  * Finished the Python3 conversion for demo_checker.py
+  * Mark seqan-dev as Multi-Arch: foreign
+  * Standards-Version: 4.5.0
+
+ -- Michael R. Crusoe <michael.crusoe at gmail.com>  Mon, 02 Mar 2020 14:48:29 +0100
 
 seqan (1.4.2+dfsg-3) unstable; urgency=medium
 


=====================================
debian/control
=====================================
@@ -12,14 +12,15 @@ Build-Depends: debhelper-compat (= 12),
                libboost-dev,
                dh-exec,
                help2man,
-               python
-Standards-Version: 4.4.1
+               python3
+Standards-Version: 4.5.0
 Vcs-Browser: https://salsa.debian.org/med-team/seqan
 Vcs-Git: https://salsa.debian.org/med-team/seqan.git
 Homepage: http://www.seqan.de/
 
 Package: seqan-dev
 Architecture: all
+Multi-Arch: foreign
 Section: libdevel
 Depends: ${shlibs:Depends},
          ${misc:Depends}


=====================================
debian/patches/2to3.patch
=====================================
@@ -3,9 +3,15 @@ Bug-Debian: https://bugs.debian.org/943260
 Author: Andreas Tille <tille at debian.org>
 Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
 
---- a/misc/add_include.py
-+++ b/misc/add_include.py
-@@ -12,7 +12,7 @@ Note that the ddoc search is purely heur
+--- seqan.orig/misc/add_include.py
++++ seqan/misc/add_include.py
+@@ -1,4 +1,4 @@
+-#!/usr/bin/env python2.5
++#!/usr/bin/python3
+ """DDDoc Helper Script -- add includes.
+ 
+ Called the path to the SeqAn checkout, this tool will search for all
+@@ -12,7 +12,7 @@
  first line containing "*/" to find the end of a comment.
  """
  
@@ -14,7 +20,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
  
  import os
  import os.path
-@@ -28,7 +28,7 @@ USAGE: add_include.py PATH_TO_SEQAN.
+@@ -28,7 +28,7 @@
  def processHeaderFile(base_path, relative_path):
    """Process the header and insert the .include line if it is not already there."""
    full_path = os.path.join(base_path, relative_path)
@@ -23,7 +29,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
    # Read file.
    with open(full_path, 'r') as f:
      contents = f.readlines()
-@@ -91,8 +91,8 @@ def collectHeaderFilenames(base_path):
+@@ -91,8 +91,8 @@
  
  def main():
    if len(sys.argv) != 2:
@@ -34,7 +40,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
      return 1
  
    base_path = sys.argv[1]
-@@ -101,7 +101,7 @@ def main():
+@@ -101,7 +101,7 @@
    header_rel_paths = collectHeaderFilenames(base_path)
  
    for header_rel_path in header_rel_paths:
@@ -43,9 +49,9 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
      processHeaderFile(base_path, header_rel_path)
  
  if __name__ == '__main__':
---- a/misc/adjust_linebreaks.py
-+++ b/misc/adjust_linebreaks.py
-@@ -15,7 +15,7 @@ def main(search_path):
+--- seqan.orig/misc/adjust_linebreaks.py
++++ seqan/misc/adjust_linebreaks.py
+@@ -15,7 +15,7 @@
                  if parseFile(path): counter += 1
          if 'CVS' in dirs:
              dirs.remove('CVS')
@@ -54,7 +60,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
  
  def testFileType(filename):
      pos = filename.rfind(".")
-@@ -66,9 +66,9 @@ def parseFile(path):
+@@ -66,9 +66,9 @@
          f = open(path, "wb")
          f.write(s)
          f.close()
@@ -66,9 +72,15 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
  
      return corrupt
          
---- a/misc/iorev_tagger.py
-+++ b/misc/iorev_tagger.py
-@@ -274,7 +274,7 @@ def preprocess(lines, filename):
+--- seqan.orig/misc/iorev_tagger.py
++++ seqan/misc/iorev_tagger.py
+@@ -1,4 +1,4 @@
+-#!/usr/bin/env python2.5
++#!/usr/bin/env3
+ """SeqAn IO-Revision code tagger step1
+ 
+ Usage: build_forwards.py BASE_PATH [all]
+@@ -274,7 +274,7 @@
                      elif len(namespaces) > 0:
                          namespaces = namespaces[:len(namespaces)-1]
                      else:
@@ -77,7 +89,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
                          
                  elif (pos6 >= 0):
                      if curlyCount == 0:
-@@ -497,7 +497,7 @@ def getTypedefName(sig):
+@@ -497,7 +497,7 @@
  
  
  def printOutFilesAndLines():
@@ -86,7 +98,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
      #TODO further processing
  
  
-@@ -516,7 +516,7 @@ def addTags():
+@@ -516,7 +516,7 @@
                  if (lines_typedef != ""):
                      cmd += " -v lines_t=" + lines_typedef
                  cmd += " " + lastfilename + " > " + lastfilename + ".new"
@@ -95,7 +107,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
                  #if (lastfilename.find("file") >= 0):
                  os.system(cmd)
                  shutil.move(lastfilename, lastfilename + ".old")
-@@ -536,7 +536,7 @@ def addTags():
+@@ -536,7 +536,7 @@
      if (lines_typedef != ""):
          cmd += " -v lines_t=" + lines_typedef
      cmd += " " + lastfilename + " > " + lastfilename + ".new"
@@ -104,7 +116,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
      #if (lastfilename.find("file") >= 0):
      os.system(cmd)
      shutil.move(lastfilename, lastfilename + ".old")
-@@ -548,19 +548,19 @@ def display(order="ntfl"):
+@@ -548,19 +548,19 @@
  
      if order == "fltn": # file line type name
          for i in sorted(FILTERED_SIGS, key=lambda x:(x[0],x[1],x[2],x[3])):
@@ -129,7 +141,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
  
      
  
-@@ -614,8 +614,8 @@ def buildAllForwards(project_path, force
+@@ -614,8 +614,8 @@
  def main():
    """Main entry point for the forwards generator."""
    if len(sys.argv) < 2: 
@@ -140,9 +152,15 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
      return 1
  
    force_rebuild = 1
---- a/misc/mat2cpp.py
-+++ b/misc/mat2cpp.py
-@@ -30,10 +30,10 @@ def main():
+--- seqan.orig/misc/mat2cpp.py
++++ seqan/misc/mat2cpp.py
+@@ -1,4 +1,4 @@
+-#!/usr/bin/env python2.5
++#!/usr/bin/python3
+ """Simple converter for matrix files to C++ fragments.
+ 
+ A matrix file is read from stdin and appropriate C++ code for
+@@ -30,10 +30,10 @@
      data_lines.append(INDENT + ', '.join(formatted_data) + ',')
      
  
@@ -157,8 +175,8 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
    return 0
  
  
---- a/misc/profile2pdf.py
-+++ b/misc/profile2pdf.py
+--- seqan.orig/misc/profile2pdf.py
++++ seqan/misc/profile2pdf.py
 @@ -1,10 +1,10 @@
 -#!/usr/bin/env python
 +#!/usr/bin/python3
@@ -172,7 +190,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
  
  __author__ = 'Manuel Holtgrewe <manuel.holtgrewe at fu-berlin.de>'
  
-@@ -38,11 +38,11 @@ def htmlColorToRgb(colorstring):
+@@ -38,11 +38,11 @@
      colorstring = colorstring.strip()
      if colorstring[0] == '#': colorstring = colorstring[1:]
      if len(colorstring) != 6:
@@ -186,7 +204,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
  
  class Meta(object):
    def __init__(self, beginTimestamp, endTimestamp):
-@@ -61,7 +61,7 @@ class JobType(object):
+@@ -61,7 +61,7 @@
    def fromString(klass, s):
      columns = s.split('\t')
      if columns[0] != '@EVENT':
@@ -195,7 +213,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
        sys.exit(1)
      identifier = int(columns[1])
      shortName = columns[2]
-@@ -88,7 +88,7 @@ class Event(object):
+@@ -88,7 +88,7 @@
      columns = s.split('\t')
      threadId = int(columns[0])
      if columns[1] not in ['BEGIN', 'END']:
@@ -204,7 +222,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
        sys.exit(1)
      isBegin = columns[1] == 'BEGIN'
      jobType = int(columns[2])
-@@ -130,7 +130,7 @@ def buildSections(events):
+@@ -130,7 +130,7 @@
  
  def printSection(section, jobTypes, offset, level=0):
    span = section.endTime - section.beginTime
@@ -213,7 +231,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
    for s in section.children:
      printSection(s, jobTypes, offset, level+1)
  
-@@ -138,13 +138,13 @@ def loadFile(path):
+@@ -138,13 +138,13 @@
    with open(path, 'r') as f:
      line = f.readline()
      if line.strip() != '@SQN:PROFILE':
@@ -230,7 +248,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
      # Load job types.
      jobTypes = []
      while True:
-@@ -248,12 +248,12 @@ def breakDownTimesHelper(counter, sectio
+@@ -248,12 +248,12 @@
  
  def breakDownTimes(jobTypes, forests):
    for threadId in sorted(forests.keys()):
@@ -245,7 +263,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
  
  def createDiagram(meta, jobTypes, forests, path):
    totalBegin = meta.beginTimestamp
-@@ -266,7 +266,7 @@ def createDiagram(meta, jobTypes, forest
+@@ -266,7 +266,7 @@
    cs = cairo.PDFSurface(path, width, height)
    cr = cairo.Context(cs)
    
@@ -254,7 +272,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
      for section in forest:
        drawBoxesForSection(cr, jobTypes, section, totalBegin, threadId)
    drawKey(cr, jobTypes, len(forests))
-@@ -276,21 +276,21 @@ def createDiagram(meta, jobTypes, forest
+@@ -276,21 +276,21 @@
  
  def main(args):
    if len(args) != 3:
@@ -281,7 +299,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
    forests = {}
    sections = {}
    for threadId in sorted(eventsForThread.keys()):
-@@ -303,12 +303,12 @@ def main(args):
+@@ -303,12 +303,12 @@
      #  printSection(x, jobTypes, s[0].beginTime)
  
    # Build diagram.
@@ -296,15 +314,15 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
    
    return 0
  
---- a/misc/record_resources.py
-+++ b/misc/record_resources.py
+--- seqan.orig/misc/record_resources.py
++++ seqan/misc/record_resources.py
 @@ -1,4 +1,4 @@
 -#!/usr/bin/env python
 +#!/usr/bin/python3
  
  import os.path
  import sys
-@@ -14,16 +14,16 @@ USAGE = 'USAGE: record_usage TARGET_FILE
+@@ -14,16 +14,16 @@
  
  def main(args):
      if len(args) <= 2:
@@ -325,15 +343,15 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
  
      c.Task(commands=[c.Command(binary, arguments)], result=target_file).execute()
  
---- a/misc/renaming/invalid_identifiers.py
-+++ b/misc/renaming/invalid_identifiers.py
+--- seqan.orig/misc/renaming/invalid_identifiers.py
++++ seqan/misc/renaming/invalid_identifiers.py
 @@ -1,4 +1,4 @@
 -#!/usr/bin/env python
 +#!/usr/bin/python3
  import sys
  import re
  
-@@ -20,9 +20,7 @@ INVALID_IDENTIFIER = re.compile(r'\b_[A-
+@@ -20,9 +20,7 @@
  REPLACEMENT_ID = re.compile(r'\b(__?)(\w*)\b')
  # The following IDs are exempted from replacement since they are either defined
  # by some compiler (-specific library) or are solely used within a string.
@@ -344,7 +362,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
            '^__$',
            '_N',
            '_L',
-@@ -144,7 +142,7 @@ VALID_IDENTIFIERS = map(
+@@ -144,7 +142,7 @@
            '__SUNPRO_C',
            '__DECC',
            '__IBMC__',
@@ -353,7 +371,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
  
  def valid(id):
      """
-@@ -183,8 +181,8 @@ def generate_replacements(ids):
+@@ -183,8 +181,8 @@
  
  def main():
      if len(sys.argv) != 2:
@@ -364,7 +382,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
          return 1
  
      results = {}
-@@ -194,13 +192,13 @@ def main():
+@@ -194,13 +192,13 @@
          results[file] = set(find_all(file))
  
      all_ids = set()
@@ -380,15 +398,15 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
  
      #for file in sorted(results.keys()):
      #    for id in results[file]:
---- a/misc/renaming/replace_identifiers.py
-+++ b/misc/renaming/replace_identifiers.py
+--- seqan.orig/misc/renaming/replace_identifiers.py
++++ seqan/misc/renaming/replace_identifiers.py
 @@ -1,4 +1,4 @@
 -#!/usr/bin/env python
 +#!/usr/bin/python3
  
  import sys
  import re
-@@ -22,7 +22,7 @@ def replace_all(text, subst):
+@@ -22,7 +22,7 @@
      """
      Perform the substitutions given by the dictionary ``subst`` on ``text``.
      """
@@ -397,7 +415,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
          text = old.sub(subst[old], text)
  
      return text
-@@ -67,12 +67,12 @@ def main():
+@@ -67,12 +67,12 @@
      # Windows, just assume good faith if the file name isn't given.
      use_stdin = len(sys.argv) == 2
      if not (len(sys.argv) == 3 or use_stdin):
@@ -413,9 +431,9 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
  
      project_path = sys.argv[1]
      replacements_file = sys.stdin if use_stdin else open(sys.argv[2], 'r')
---- a/misc/swig/example.py
-+++ b/misc/swig/example.py
-@@ -6,9 +6,9 @@ alignObject,alignScore=align.alignDna("A
+--- seqan.orig/misc/swig/example.py
++++ seqan/misc/swig/example.py
+@@ -6,9 +6,9 @@
  print(alignScore);
  
  dnaList=align.printDnaAlignment(alignObject);
@@ -428,7 +446,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
  
  
  scoreMatrix=align.getAminoAcidScoreMatrix("Blosum30");
-@@ -17,8 +17,8 @@ alignObject,alignScore=align.alignAmino(
+@@ -17,8 +17,8 @@
  
  aminoList=align.printAminoAcidAlignment(alignObject);
  print(alignScore)
@@ -440,9 +458,9 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
 +print((aminoList[2]));
  
  
---- a/misc/trac_plugins/DocLinks/doc_links/macro.py
-+++ b/misc/trac_plugins/DocLinks/doc_links/macro.py
-@@ -19,7 +19,7 @@ Use something like this to test the plug
+--- seqan.orig/misc/trac_plugins/DocLinks/doc_links/macro.py
++++ seqan/misc/trac_plugins/DocLinks/doc_links/macro.py
+@@ -19,7 +19,7 @@
    * {{{seqan:"Concept.Simple Type"}}} seqan:"Concept.Simple Type"
    * {{{seqan:"Spec.Chunk Pool Allocator}}} seqan:"Spec.Chunk Pool Allocator"
  """
@@ -451,9 +469,9 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
  import sys
  
  from trac.core import *
---- a/misc/trac_plugins/FoldOut/FoldOutMacro.py
-+++ b/misc/trac_plugins/FoldOut/FoldOutMacro.py
-@@ -23,10 +23,10 @@ import trac.wiki.macros
+--- seqan.orig/misc/trac_plugins/FoldOut/FoldOutMacro.py
++++ seqan/misc/trac_plugins/FoldOut/FoldOutMacro.py
+@@ -23,10 +23,10 @@
  from genshi.builder import tag
  import genshi.core
  import uuid
@@ -467,7 +485,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
  
  class FoldOutMacro(trac.wiki.macros.WikiMacroBase):
    def expand_macro(self, formatter, name, args):
-@@ -48,13 +48,13 @@ class FoldOutMacro(trac.wiki.macros.Wiki
+@@ -48,13 +48,13 @@
      body_html = self.format_wiki(formatter, '\n'.join(body))
      hidden = tag.div(genshi.core.Markup(body_html), id=hidden_id, style='display:none;')
      toggle_class = uuid.uuid4()
@@ -483,8 +501,8 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
 +    out = io.StringIO()
      trac.wiki.Formatter(self.env, formatter.context).format(wiki_string, out)
      return out.getvalue()
---- a/misc/trac_plugins/IncludeMacro/includemacro/macros.py
-+++ b/misc/trac_plugins/IncludeMacro/includemacro/macros.py
+--- seqan.orig/misc/trac_plugins/IncludeMacro/includemacro/macros.py
++++ seqan/misc/trac_plugins/IncludeMacro/includemacro/macros.py
 @@ -1,7 +1,7 @@
  # TracIncludeMacro macros
  import re
@@ -495,7 +513,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
  
  from trac.core import *
  from trac.wiki.macros import WikiMacroBase
-@@ -74,11 +74,11 @@ class IncludeMacro(WikiMacroBase):
+@@ -74,11 +74,11 @@
                  self.log.info('IncludeMacro: Blocking attempt by %s to include URL %s on page %s', req.authname, source, req.path_info)
                  return ''
              try:
@@ -510,17 +528,17 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
                  return system_message('Error while previewing', str(e))
              ctxt = Context.from_request(req)
          elif source_format == 'wiki':
---- a/misc/trac_plugins/IncludeMacro/setup.py
-+++ b/misc/trac_plugins/IncludeMacro/setup.py
+--- seqan.orig/misc/trac_plugins/IncludeMacro/setup.py
++++ seqan/misc/trac_plugins/IncludeMacro/setup.py
 @@ -1,4 +1,4 @@
 -#!/usr/bin/env python
 +#!/usr/bin/python3
  # -*- coding: iso-8859-1 -*-
  import os.path
  
---- a/misc/trac_plugins/TextBoxes/text_boxes/macro.py
-+++ b/misc/trac_plugins/TextBoxes/text_boxes/macro.py
-@@ -21,7 +21,7 @@ Success!
+--- seqan.orig/misc/trac_plugins/TextBoxes/text_boxes/macro.py
++++ seqan/misc/trac_plugins/TextBoxes/text_boxes/macro.py
+@@ -21,7 +21,7 @@
  
  import itertools
  import operator
@@ -529,7 +547,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
  
  from pkg_resources import resource_filename
  
-@@ -84,7 +84,7 @@ class TextBoxMacro(WikiMacroBase):
+@@ -84,7 +84,7 @@
                  return None
              result = tag.span(args[0][0], class_='menu_item')
              for text in args[0][1:]:
@@ -538,7 +556,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
                  result += tag.span(text, class_='menu_item')
              return tag.span(result, class_='menu_trace')
          elif name in ['WarningBox', 'InfoBox', 'ImportantBox', 'AssignmentBox']:
-@@ -95,7 +95,7 @@ class TextBoxMacro(WikiMacroBase):
+@@ -95,7 +95,7 @@
  
      def format_wiki(self, formatter, wiki_string):
          """Format the given string wiki_string to HTML."""
@@ -547,17 +565,23 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
          trac.wiki.Formatter(self.env, formatter.context).format(wiki_string, out)
          return out.getvalue()
  
---- a/util/bin/auto_build.py
-+++ b/util/bin/auto_build.py
+--- seqan.orig/util/bin/auto_build.py
++++ seqan/util/bin/auto_build.py
 @@ -1,4 +1,4 @@
 -#!/usr/bin/env python
 +#!/usr/bin/python3
  """SeqAn Automatic Build System."""
  
  import os.path
---- a/util/bin/build_forwards.py
-+++ b/util/bin/build_forwards.py
-@@ -42,7 +42,7 @@ def buildProject(project_path, target_pa
+--- seqan.orig/util/bin/build_forwards.py
++++ seqan/util/bin/build_forwards.py
+@@ -1,4 +1,4 @@
+-#!/usr/bin/env python2.5
++#!/usr/bin/python3
+ """SeqAn Automatic Forwards Generator.
+ 
+ Usage: build_forwards.py BASE_PATH [TARGET_PATH] [all]
+@@ -42,7 +42,7 @@
      if not os.path.exists(project_path):
          return
  
@@ -566,7 +590,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
  
      global FUNCS
      FUNCS = {}
-@@ -79,7 +79,7 @@ def buildProject(project_path, target_pa
+@@ -79,7 +79,7 @@
  #    if FUNCS != {}:        
      outAll(target_path, project)
          
@@ -575,7 +599,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
  
  
  def forwardFilename(module):
-@@ -102,10 +102,10 @@ def parseFile(filename):
+@@ -102,10 +102,10 @@
      
      for line in lines:
          if (line.find("SEQAN_NO_GENERATED_FORWARDS") >= 0):
@@ -588,7 +612,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
  
      sigs = preprocess(lines, filename);
      
-@@ -220,7 +220,7 @@ def preprocess(lines, filename):
+@@ -220,7 +220,7 @@
                      elif len(namespaces) > 0:
                          namespaces = namespaces[:len(namespaces)-1]
                      else:
@@ -597,7 +621,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
                          
                  elif (pos6 >= 0):
                      if curlyCount == 0:
-@@ -350,7 +350,7 @@ def deleteDefaultArguments(str, start_de
+@@ -350,7 +350,7 @@
          if pos2 >= 0:
              str = str[pos2:]
          else:
@@ -606,7 +630,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
              break
              
      return ret
-@@ -366,8 +366,8 @@ def findCharOutsideBrackets(str, start_p
+@@ -366,8 +366,8 @@
      edge_count = 0
      while pos < len(str):
          if verbose: 
@@ -617,7 +641,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
          
          p1 = str.find(char, pos)
          p2 = str.find("<", pos)
-@@ -414,7 +414,7 @@ def getSortKey(name, namespaces):
+@@ -414,7 +414,7 @@
  def addEntry(arr, name, entry, namespaces):
      """Adds a signature to FUNCS or CLASSES."""
      key = getSortKey(name, namespaces)
@@ -626,7 +650,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
          arr[key] = []
      arr[key] += [[name, entry, namespaces]]
      
-@@ -530,7 +530,7 @@ def outAll(path, project):
+@@ -530,7 +530,7 @@
      fl.close()
  
  def outList(lst):
@@ -635,7 +659,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
      keys.sort()
      
      namespaces = []
-@@ -626,8 +626,8 @@ def buildAllForwards(project_path, targe
+@@ -626,8 +626,8 @@
  def main():
    """Main entry point for the forwards generator."""
    if len(sys.argv) < 2: 
@@ -646,23 +670,41 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
      return 1
  
    force_rebuild = sys.argv[-1] == 'all'
---- a/util/bin/dddoc.py
-+++ b/util/bin/dddoc.py
+--- seqan.orig/util/bin/dddoc.py
++++ seqan/util/bin/dddoc.py
 @@ -1,4 +1,4 @@
 -#!/usr/bin/env python
 +#!/usr/bin/python3
  """SeqAn Documentation System DDDoc."""
  
  import os.path
---- a/util/bin/demo_checker.py
-+++ b/util/bin/demo_checker.py
+--- seqan.orig/util/bin/demo_checker.py
++++ seqan/util/bin/demo_checker.py
 @@ -1,4 +1,4 @@
 -#!/usr/bin/env python
 +#!/usr/bin/python3
  """Demo checker script.
  
  Given a demo .cpp file PATH.cpp we can make it a small test if there is a file
-@@ -58,32 +58,32 @@ def main():
+@@ -23,7 +23,7 @@
+ 
+ def t(s):
+     """Force Windows line endings to Unix line endings."""
+-    return s.replace("\r\n", "\n")
++    return s #.replace("\r\n", "\n")
+ 
+ 
+ def loadExpected(args):
+@@ -40,7 +40,7 @@
+ 
+ def runDemo(args):
+     cmd = [args.binary_path]
+-    p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
++    p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
+     p.wait()
+     return t(p.stdout.read()), t(p.stderr.read()), p.returncode
+ 
+@@ -58,32 +58,32 @@
                          default=None)
      args = parser.parse_args()
  
@@ -705,55 +747,55 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
  
      return not (expected_out == expected_out and expected_err == actual_err)
  
---- a/util/bin/dox.py
-+++ b/util/bin/dox.py
+--- seqan.orig/util/bin/dox.py
++++ seqan/util/bin/dox.py
 @@ -1,4 +1,4 @@
 -#!/usr/bin/env python
 +#!/usr/bin/python3
  """SeqAn doxygen-style documentation system."""
  
  import os.path
---- a/util/bin/fixgcov.py
-+++ b/util/bin/fixgcov.py
+--- seqan.orig/util/bin/fixgcov.py
++++ seqan/util/bin/fixgcov.py
 @@ -1,4 +1,4 @@
 -#!/usr/bin/env python
 +#!/usr/bin/python3
  """Fix gcov output.
  
  Fix gcov output with templates.  This is done by first parsing in the .cpp files
---- a/util/bin/pyclangcheck.py
-+++ b/util/bin/pyclangcheck.py
+--- seqan.orig/util/bin/pyclangcheck.py
++++ seqan/util/bin/pyclangcheck.py
 @@ -1,4 +1,4 @@
 -#!/usr/bin/env python
 +#!/usr/bin/python3
  """llvm-clang based style checker."""
  
  __author__ = 'Manuel Holtgrewe <manuel.holtgrewe at fu-berlin.de>'
---- a/util/bin/release_page.py
-+++ b/util/bin/release_page.py
+--- seqan.orig/util/bin/release_page.py
++++ seqan/util/bin/release_page.py
 @@ -1,4 +1,4 @@
 -#!/usr/bin/env python
 +#!/usr/bin/python3
  """Build SeqAn Release Page."""
  
  import os.path
---- a/util/bin/skel.py
-+++ b/util/bin/skel.py
+--- seqan.orig/util/bin/skel.py
++++ seqan/util/bin/skel.py
 @@ -1,4 +1,4 @@
 -#!/usr/bin/env python
 +#!/usr/bin/python3
  """SeqAn Skelleton Creation."""
  
  import os.path
---- a/util/ctd2galaxy.py
-+++ b/util/ctd2galaxy.py
+--- seqan.orig/util/ctd2galaxy.py
++++ seqan/util/ctd2galaxy.py
 @@ -1,4 +1,4 @@
 -#!/usr/bin/env python
 +#!/usr/bin/python3
  
  import argparse
  import sys
-@@ -182,10 +182,10 @@ def main():
+@@ -182,10 +182,10 @@
  
      ctd_parser = CTDParser()
      tool = ctd_parser.parse(args.in_file)
@@ -767,9 +809,9 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
          
  
  if __name__ == '__main__':
---- a/util/py_lib/clang/cindex.py
-+++ b/util/py_lib/clang/cindex.py
-@@ -276,7 +276,7 @@ class CursorKind(object):
+--- seqan.orig/util/py_lib/clang/cindex.py
++++ seqan/util/py_lib/clang/cindex.py
+@@ -276,7 +276,7 @@
          if value >= len(CursorKind._kinds):
              CursorKind._kinds += [None] * (value - len(CursorKind._kinds) + 1)
          if CursorKind._kinds[value] is not None:
@@ -778,7 +820,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
          self.value = value
          CursorKind._kinds[value] = self
          CursorKind._name_map = None
-@@ -289,7 +289,7 @@ class CursorKind(object):
+@@ -289,7 +289,7 @@
          """Get the enumeration name of this cursor kind."""
          if self._name_map is None:
              self._name_map = {}
@@ -787,7 +829,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
                  if isinstance(value,CursorKind):
                      self._name_map[value] = key
          return self._name_map[self]
-@@ -297,13 +297,13 @@ class CursorKind(object):
+@@ -297,13 +297,13 @@
      @staticmethod
      def from_id(id):
          if id >= len(CursorKind._kinds) or CursorKind._kinds[id] is None:
@@ -803,7 +845,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
  
      def is_declaration(self):
          """Test if this is a declaration kind."""
-@@ -948,7 +948,7 @@ class TypeKind(object):
+@@ -948,7 +948,7 @@
          if value >= len(TypeKind._kinds):
              TypeKind._kinds += [None] * (value - len(TypeKind._kinds) + 1)
          if TypeKind._kinds[value] is not None:
@@ -812,7 +854,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
          self.value = value
          TypeKind._kinds[value] = self
          TypeKind._name_map = None
-@@ -961,7 +961,7 @@ class TypeKind(object):
+@@ -961,7 +961,7 @@
          """Get the enumeration name of this cursor kind."""
          if self._name_map is None:
              self._name_map = {}
@@ -821,7 +863,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
                  if isinstance(value,TypeKind):
                      self._name_map[value] = key
          return self._name_map[self]
-@@ -969,7 +969,7 @@ class TypeKind(object):
+@@ -969,7 +969,7 @@
      @staticmethod
      def from_id(id):
          if id >= len(TypeKind._kinds) or TypeKind._kinds[id] is None:
@@ -830,7 +872,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
          return TypeKind._kinds[id]
  
      def __repr__(self):
-@@ -1374,9 +1374,9 @@ class Index(ClangObject):
+@@ -1374,9 +1374,9 @@
                      # FIXME: It would be great to support an efficient version
                      # of this, one day.
                      value = value.read()
@@ -842,7 +884,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
                  unsaved_files_array[i].name = name
                  unsaved_files_array[i].contents = value
                  unsaved_files_array[i].length = len(value)
-@@ -1465,9 +1465,9 @@ class TranslationUnit(ClangObject):
+@@ -1465,9 +1465,9 @@
                      # FIXME: It would be great to support an efficient version
                      # of this, one day.
                      value = value.read()
@@ -854,7 +896,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
                  unsaved_files_array[i].name = name
                  unsaved_files_array[i].contents = value
                  unsaved_files_array[i].length = len(value)
-@@ -1491,9 +1491,9 @@ class TranslationUnit(ClangObject):
+@@ -1491,9 +1491,9 @@
                      # FIXME: It would be great to support an efficient version
                      # of this, one day.
                      value = value.read()
@@ -866,15 +908,15 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
                  unsaved_files_array[i].name = name
                  unsaved_files_array[i].contents = value
                  unsaved_files_array[i].length = len(value)
---- a/util/py_lib/pyratemp.py
-+++ b/util/py_lib/pyratemp.py
+--- seqan.orig/util/py_lib/pyratemp.py
++++ seqan/util/py_lib/pyratemp.py
 @@ -1,4 +1,4 @@
 -#!/usr/bin/env python
 +#!/usr/bin/python3
  # -*- coding: utf-8 -*-
  """
  Small, simple and powerful template-engine for python.
-@@ -179,7 +179,7 @@ IN THE SOFTWARE."""
+@@ -179,7 +179,7 @@
  
  #=========================================
  
@@ -883,7 +925,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
  import re
  
  #=========================================
-@@ -224,7 +224,7 @@ def dictkeyclean(d):
+@@ -224,7 +224,7 @@
      """Convert all keys of the dict `d` to strings.
      """
      new_d = {}
@@ -892,7 +934,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
          new_d[str(k)] = v
      return new_d
  
-@@ -247,7 +247,7 @@ def dummy_raise(exception, value):
+@@ -247,7 +247,7 @@
  #=========================================
  # escaping
  
@@ -901,7 +943,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
  ESCAPE_SUPPORTED = {"NONE":None, "HTML":HTML, "LATEX":LATEX} #for error-/parameter-checking
  
  def escape(s, format=HTML):
-@@ -277,25 +277,25 @@ def escape(s, format=HTML):
+@@ -277,25 +277,25 @@
      if format is None or format == NONE:
          pass
      elif format == HTML:
@@ -941,7 +983,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
  
  #=========================================
  
-@@ -349,10 +349,10 @@ class LoaderString:
+@@ -349,10 +349,10 @@
      def load(self, string):
          """Return template-string as unicode.
          """
@@ -954,7 +996,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
          return u
  
  class LoaderFile:
-@@ -397,7 +397,7 @@ class LoaderFile:
+@@ -397,7 +397,7 @@
          string = f.read()
          f.close()
  
@@ -963,7 +1005,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
  
          return u
  
-@@ -504,11 +504,11 @@ class Parser(object):
+@@ -504,11 +504,11 @@
          else:
              try:    # test if testexpr() works
                  testexpr("i==1")
@@ -977,7 +1019,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
              raise ValueError("Unsupported 'escape' (%s)." %(escape))
          self.escape = escape
          self._includestack = []
-@@ -536,7 +536,7 @@ class Parser(object):
+@@ -536,7 +536,7 @@
          """Test a template-expression to detect errors."""
          try:
              self._testexprfunc(expr)
@@ -986,7 +1028,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
              raise TemplateSyntaxError(err, self._errpos(fpos))
  
      def _parse_sub(self, parsetree, text, fpos=0):
-@@ -707,7 +707,7 @@ class Parser(object):
+@@ -707,7 +707,7 @@
                      block_type = 'include'
                      try:
                          u = self._load(content.strip())
@@ -995,7 +1037,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
                          raise TemplateIncludeError(err, self._errpos(pos__))
                      self._includestack.append((content.strip(), u))  # current filename/template for error-msg.
                      p = self._parse(u)
-@@ -773,42 +773,42 @@ class EvalPseudoSandbox:
+@@ -773,42 +773,42 @@
      """
  
      safe_builtins = {
@@ -1074,7 +1116,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
      }
  
      def __init__(self):
-@@ -991,7 +991,7 @@ class TemplateBase:
+@@ -991,7 +991,7 @@
          """
          self.current_data = self.data.copy()
          self.current_data.update(override)
@@ -1083,7 +1125,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
          self.current_data = self.data       # restore current_data
          return _dontescape(u)               # (see class _dontescape)
  
-@@ -1005,7 +1005,7 @@ class TemplateBase:
+@@ -1005,7 +1005,7 @@
  #-----------------------------------------
  # Renderer
  
@@ -1092,7 +1134,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
      """Unicode-string which should not be escaped.
  
      If ``isinstance(object,_dontescape)``, then don't escape the object in
-@@ -1042,7 +1042,7 @@ class Renderer(object):
+@@ -1042,7 +1042,7 @@
          try:
              return self.evalfunc(expr, data)
          #TODO: any other errors to catch here?
@@ -1101,7 +1143,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
              raise TemplateRenderError("Cannot eval expression '%s'. (%s: %s)" %(expr, err.__class__.__name__, err))
  
      def render(self, parsetree, data):
-@@ -1065,31 +1065,31 @@ class Renderer(object):
+@@ -1065,31 +1065,31 @@
              if   "str"   == elem[0]:
                  output.append(elem[1])
              elif "sub"   == elem[0]:
@@ -1142,15 +1184,15 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
                      output.extend(self.render(elem[3], data))
              elif "if"    == elem[0]:
                  do_else = True
---- a/util/py_lib/seqan/app_tests.py
-+++ b/util/py_lib/seqan/app_tests.py
+--- seqan.orig/util/py_lib/seqan/app_tests.py
++++ seqan/util/py_lib/seqan/app_tests.py
 @@ -1,4 +1,4 @@
 -#!/usr/bin/env python
 +#!/usr/bin/python3
  """Helper code for app tests.
  
  This module contains helper functions and classes for making app tests easy.
-@@ -18,7 +18,7 @@ Classes/Functions:
+@@ -18,7 +18,7 @@
                                 directory.
  """
  
@@ -1159,7 +1201,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
  
  __author__ = 'Manuel Holtgrewe <manuel.holtgrewe at fu-berlin.de>'
  
-@@ -165,7 +165,7 @@ class TestPathHelper(object):
+@@ -165,7 +165,7 @@
  
      def deleteTempDir(self):
          """Remove the temporary directory created earlier and all files below."""
@@ -1168,7 +1210,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
          if self.temp_dir:
              shutil.rmtree(self.temp_dir)
  
-@@ -242,20 +242,20 @@ def runTest(test_conf):
+@@ -242,20 +242,20 @@
          logging.debug('  return code is %d', retcode)
          if retcode != 0:
              fmt = 'Return code of command "%s" was %d.'
@@ -1197,7 +1239,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
          # Print traceback.
          import traceback
          exc_type, exc_value, exc_traceback = sys.exc_info()
-@@ -263,28 +263,28 @@ def runTest(test_conf):
+@@ -263,28 +263,28 @@
          fmt = 'ERROR (when executing "%s"): %s'
          if stdout_file is not subprocess.PIPE:
              stdout_file.close()
@@ -1237,7 +1279,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
      # Close standard out file if necessary.
      if stdout_file is not subprocess.PIPE:
          stdout_file.close()
-@@ -310,7 +310,7 @@ def runTest(test_conf):
+@@ -310,7 +310,7 @@
                      continue
                  else:
                      tpl = (expected_path, expected_md5, result_md5, result_path)
@@ -1246,7 +1288,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
                      result = False
              else:
                  with open(expected_path, 'rb') as f:
-@@ -324,25 +324,25 @@ def runTest(test_conf):
+@@ -324,25 +324,25 @@
                  if expected_str == result_str:
                      continue
                  fmt = 'Comparing %s against %s'
@@ -1280,15 +1322,15 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
              result = False
      return result
  
---- a/util/py_lib/seqan/auto_build.py
-+++ b/util/py_lib/seqan/auto_build.py
+--- seqan.orig/util/py_lib/seqan/auto_build.py
++++ seqan/util/py_lib/seqan/auto_build.py
 @@ -1,4 +1,4 @@
 -#!/usr/bin/env python
 +#!/usr/bin/python3
  """
  Automatic building of SeqAn apps and releases.
  """
-@@ -29,12 +29,12 @@ class MinisculeSvnWrapper(object):
+@@ -29,12 +29,12 @@
  
      def ls(self, url):
          """Execute 'svn ls ${url}'."""
@@ -1303,7 +1345,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
              return 1
          lines = out_data.splitlines()
          revs_tags = [(int(line.split()[0]), line.split()[-1]) for line in lines]
-@@ -48,7 +48,7 @@ class MinisculeSvnWrapper(object):
+@@ -48,7 +48,7 @@
  
      def co(self, url, dest_dir):
          """Execute 'svn co ${url} ${dest_dir}'."""
@@ -1312,7 +1354,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
          popen = subprocess.Popen([SVN_BINARY, 'co', url, dest_dir])
          popen.wait()
          return popen.returncode
-@@ -117,10 +117,10 @@ class BuildStep(object):
+@@ -117,10 +117,10 @@
                  package_path = package_path.replace('Darwin', 'Mac')
              if not os.path.exists(package_path):
                  if self.options.verbosity >= 1:
@@ -1325,7 +1367,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
          return False
  
      def copyArchives(self, build_dir):
-@@ -131,7 +131,7 @@ class BuildStep(object):
+@@ -131,7 +131,7 @@
                  to = os.path.join(self.base_path, p.name, os.path.basename(from_))
                  if not os.path.exists(os.path.dirname(to)):  # Create directory if necessary.
                      os.makedirs(os.path.dirname(to))
@@ -1334,7 +1376,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
                  if 'x86' in to and 'x86_64' not in to:  # fix processor name
                      to = to.replace('x86', 'x86_64')
                  if 'win32' in to or 'win64' in to:  # fix OS name
-@@ -140,7 +140,7 @@ class BuildStep(object):
+@@ -140,7 +140,7 @@
                      to = to.replace('Darwin', 'Mac')
                  shutil.copyfile(from_, to)
              else:
@@ -1343,7 +1385,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
  
      def buildSeqAnRelease(self, checkout_dir, build_dir):
          """Build SeqAn release: Apps and library build."""
-@@ -148,7 +148,7 @@ class BuildStep(object):
+@@ -148,7 +148,7 @@
          #
          # Create build directory.
          if not os.path.exists(build_dir):
@@ -1352,7 +1394,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
              os.mkdir(build_dir)
          # Execute CMake.
          cmake_args = [CMAKE_BINARY, checkout_dir,
-@@ -165,76 +165,76 @@ class BuildStep(object):
+@@ -165,76 +165,76 @@
              cmake_args.append('-DSEQAN_SYSTEM_PROCESSOR=x86_64')
              if self.os == 'Windows':
                  cmake_args += ['-G', 'Visual Studio 10 Win64']
@@ -1453,7 +1495,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
          if not os.path.exists(build_dir):
              os.mkdir(build_dir)
          # Execute CMake.
-@@ -254,37 +254,37 @@ class BuildStep(object):
+@@ -254,37 +254,37 @@
              cmake_args.append('-DSEQAN_SYSTEM_PROCESSOR=x86_64')
              if self.os == 'Windows':
                  cmake_args += ['-G', 'Visual Studio 10 Win64']
@@ -1501,7 +1543,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
        if self.tmp_dir:
          if not os.path.exists(self.tmp_dir):
            os.makedirs(self.tmp_dir)
-@@ -296,17 +296,17 @@ class BuildStep(object):
+@@ -296,17 +296,17 @@
          """Execute build step."""
          # Create temporary directory.
          tmp_dir = self.tmpDir()
@@ -1522,7 +1564,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
            shutil.rmtree(build_dir)
          # Perform the build.  We have to separate between app and whole SeqAn releases.
          if self.name == 'seqan':
-@@ -314,12 +314,12 @@ class BuildStep(object):
+@@ -314,12 +314,12 @@
          else:
              self.buildApp(checkout_dir, build_dir)
          if not self.options.keep_co_dir:
@@ -1537,7 +1579,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
              shutil.rmtree(tmp_dir)
  
  
-@@ -331,8 +331,8 @@ def workTags(options):
+@@ -331,8 +331,8 @@
                   if rev >= options.start_revision and
                      '-' in tag]
      # Enumerate all package names that we could enumerate.
@@ -1548,7 +1590,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
      for rev, tag in revs_tags:
          name, version = tag.rsplit('-', 1)
          for word_size in options.word_sizes.split(','):
-@@ -355,8 +355,8 @@ def workTrunk(options):
+@@ -355,8 +355,8 @@
      # Get the revisions and tag names.
      svn = MinisculeSvnWrapper()
      # Enumerate all package names that we could enumerate.
@@ -1559,7 +1601,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
      name, version = options.build_trunk_as.rsplit('-', 1)
      for word_size in options.word_sizes.split(','):
          # Create build step for this package name.
-@@ -393,7 +393,7 @@ def workSrcTar(options):
+@@ -393,7 +393,7 @@
          dest = os.path.join(options.package_db, '%s-src' % name, file_name)
          # Check whether we need to rebuild.
          if os.path.exists(dest):
@@ -1568,7 +1610,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
            continue
          # Create temporary directory.
          if options.tmp_dir:
-@@ -402,31 +402,31 @@ def workSrcTar(options):
+@@ -402,31 +402,31 @@
            tmp_dir = options.tmp_dir
          else:
            tmp_dir = tempfile.mkdtemp()
@@ -1606,15 +1648,15 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
              shutil.rmtree(tmp_dir)
      return 0
  
-@@ -489,5 +489,5 @@ def main():
+@@ -489,5 +489,5 @@
          return 1
  
      # Fire up work.
 -    print >>sys.stderr, 'Running SeqAn Auto Builder'
 +    print('Running SeqAn Auto Builder', file=sys.stderr)
      return work(options)
---- a/util/py_lib/seqan/dddoc/__init__.py
-+++ b/util/py_lib/seqan/dddoc/__init__.py
+--- seqan.orig/util/py_lib/seqan/dddoc/__init__.py
++++ seqan/util/py_lib/seqan/dddoc/__init__.py
 @@ -1,6 +1,6 @@
 -#!/usr/bin/env python
 +#!/usr/bin/python3
@@ -1624,15 +1666,15 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
  import sys
  
  def main():
---- a/util/py_lib/seqan/dddoc/core.py
-+++ b/util/py_lib/seqan/dddoc/core.py
+--- seqan.orig/util/py_lib/seqan/dddoc/core.py
++++ seqan/util/py_lib/seqan/dddoc/core.py
 @@ -1,4 +1,4 @@
 -#!/usr/bin/env python
 +#!/usr/bin/python3
  
  import copy
  import operator
-@@ -7,6 +7,7 @@ import os.path
+@@ -7,6 +7,7 @@
  import pickle
  import string
  import sys
@@ -1640,7 +1682,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
  
  # Constant for C++ files.
  FILETYPE_CPP = 2
-@@ -178,9 +179,9 @@ class FileCache(object):
+@@ -178,9 +179,9 @@
              with open(self.path, 'rb') as f:
                  self.content = pickle.load(f)
          except:
@@ -1652,7 +1694,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
          return True
  
      def flush(self):
-@@ -189,14 +190,14 @@ class FileCache(object):
+@@ -189,14 +190,14 @@
              with open(self.path, 'wb') as f:
                  pickle.dump(self.content, f)
          except:
@@ -1670,7 +1712,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
  
      def isFresh(self, filename):
          """Returns True if the cache is fresh.
-@@ -204,7 +205,7 @@ class FileCache(object):
+@@ -204,7 +205,7 @@
          The cache is fresh if the file at the given path is not newer than the
          data in the cache.
          """
@@ -1679,7 +1721,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
              return False
          mtime = os.stat(filename).st_mtime
          return mtime >= self.content[filename][0]
-@@ -256,9 +257,9 @@ def splitKeys(text, delimiters, limit=No
+@@ -256,9 +257,9 @@
          >>> splitKeys('.Adaption.\'std::string\'.summary')
          ['', 'Adaption', '\'std::string\'', 'summary']
      """
@@ -1692,7 +1734,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
          return _cache[(text, delimiters)]
      count = 0
      current = []
-@@ -299,7 +300,7 @@ def cleanPath(path_arr):
+@@ -299,7 +300,7 @@
      """
      def _cleanPathElement(x):
          return x.strip().replace('\'', '').replace('"', '')
@@ -1701,7 +1743,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
  
  
  class FileLoader(object):
-@@ -522,7 +523,7 @@ class FileLoader(object):
+@@ -522,7 +523,7 @@
              ## print '  empty_count', empty_count
              if empty_count <= len(stack):
                  stack = stack[:empty_count]
@@ -1710,7 +1752,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
              stack.append(path[empty_count:])
              stack_len_sum += len(stack[-1])
              path = reduce(operator.add, stack, [])
-@@ -600,14 +601,14 @@ class DddocTreeNode(object):
+@@ -600,14 +601,14 @@
              if prefix:
                  prefix = prefix + ' --> '
              res = '%s %sDddocTreeNode(key=%s, texts=%s)' % (space, prefix, repr(node.key), repr(node.texts))
@@ -1727,7 +1769,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
  
  
  class DddocTree(object):
-@@ -642,12 +643,12 @@ class DddocTree(object):
+@@ -642,12 +643,12 @@
          Enables caching and builds some indices.
          """
          self._enableFindCache()
@@ -1743,7 +1785,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
  
      def _buildSubtree(self, path, begin_index, end_index, level):
          # First, identify the entries belonging to each node (entry.path[i] are
-@@ -705,7 +706,7 @@ class DddocTree(object):
+@@ -705,7 +706,7 @@
                  key = '.'.join(path)
              else:
                  key = path
@@ -1752,7 +1794,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
                  return self.cache[key]
          # Split path if is string, ignore leading dot if any.
          if type(path) is str:
-@@ -717,7 +718,7 @@ class DddocTree(object):
+@@ -717,7 +718,7 @@
              """Helper function that searches for the node with given path."""
              if not path:
                  return node
@@ -1761,7 +1803,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
                  return None
              return findRecurse(node.children[path[0]], path[1:])
          res = findRecurse(self.root, path)
-@@ -754,10 +755,10 @@ def _matchTreesInNode(tree, node, path,
+@@ -754,10 +755,10 @@
      ## print '  ' * level, '_matchTreesInNode(tree', node.path, path, func, level, ')'
      if path:
          if path[0] == '*':
@@ -1774,7 +1816,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
                  _matchTreesInNode(tree, node.children[path[0]], path[1:], func, block_paths, level+1)
      else:
          for block_path in block_paths:
-@@ -800,7 +801,7 @@ def processInlineSummaries(tree, paths):
+@@ -800,7 +801,7 @@
  
  def generateAutomaticReferences(tree):
      """Interpret the globals.relations entries."""
@@ -1783,7 +1825,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
      relations_node = tree.find('globals.relations')
      if not relations_node:
          return  # Empty, do nothing.
-@@ -816,7 +817,7 @@ def generateAutomaticReferences(tree):
+@@ -816,7 +817,7 @@
              if not res:
                  continue  # Not found, Skip  # TODO(holtgrew): Warning?
              additions.append((res.path + [key], '.'.join(node.path[:2])))
@@ -1792,7 +1834,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
          ## print 'GENERATE', key, node
          for txt in node.texts:
              path = splitKeys(txt, '.')
-@@ -837,7 +838,7 @@ def generateAutomaticReferences(tree):
+@@ -837,7 +838,7 @@
  
  def generateInheritedElements(tree):
      """Push through inheritances."""
@@ -1801,7 +1843,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
      inherit_node = tree.find('globals.inherit')
      # Contains children: $TARGET_FIELD:$THROUGH_FIELD.$SOURCE_FIELD
  
-@@ -846,7 +847,7 @@ def generateInheritedElements(tree):
+@@ -846,7 +847,7 @@
      inheritance_rules = []
  
      # First build a dependency graph.
@@ -1810,7 +1852,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
          for txt in child.texts:
              arr = splitKeys(txt, '.')
              through_field = arr[0]
-@@ -885,8 +886,8 @@ def generateInheritedElements(tree):
+@@ -885,8 +886,8 @@
                      if not source_field in source_node.children:
                          continue  # Skip if no source field.
                      for path in source_node.children[source_field].texts:
@@ -1821,7 +1863,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
                          # If necessary then create child in target node.
                          if not target_field in target_node.children:
                              target_node.children[target_field] = DddocTreeNode(tree, target_field, target_node.path + [target_field], source_node.children[source_field].entry)
-@@ -909,7 +910,7 @@ def generateInheritedElements(tree):
+@@ -909,7 +910,7 @@
  def removeDuplicateTexts(tree):
      """Remove duplicates from texts members.
  
@@ -1830,7 +1872,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
      and strings with these suffixes are preferred.
      """
      ##print 'remove duplicates'
-@@ -918,20 +919,20 @@ def removeDuplicateTexts(tree):
+@@ -918,20 +919,20 @@
          cleaned = []
          for txt in node.texts:
              clean = txt
@@ -1855,7 +1897,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
          recurse(child)
  
  
-@@ -946,15 +947,15 @@ def buildByTypeAndCatIndex(tree):
+@@ -946,15 +947,15 @@
      def recurse(result, path, node):
          ## print path, node.path
          if len(path) == 2:
@@ -1874,7 +1916,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
          recurse(result, [key], child)
      ## for k1, v1 in result.iteritems():
      ##     for k2, v2 in v1.iteritems():
-@@ -968,11 +969,11 @@ class ErrorLogger(object):
+@@ -968,11 +969,11 @@
      def invalidReference(self, txt, locations):
          self.error_count += 1
          if not locations:
@@ -1889,15 +1931,15 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
  
  
  class App(object):
---- a/util/py_lib/seqan/dddoc/dddoc.py
-+++ b/util/py_lib/seqan/dddoc/dddoc.py
+--- seqan.orig/util/py_lib/seqan/dddoc/dddoc.py
++++ seqan/util/py_lib/seqan/dddoc/dddoc.py
 @@ -1,4 +1,4 @@
 -#!/usr/bin/env python
 +#!/usr/bin/python3
  
  import os
  import os.path
-@@ -37,9 +37,9 @@ class DddocCache(object):
+@@ -37,9 +37,9 @@
              with open(self.path, 'rb') as f:
                  self.content = pickle.load(f)
          except:
@@ -1909,7 +1951,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
          return True
  
      def flush(self):
-@@ -47,16 +47,16 @@ class DddocCache(object):
+@@ -47,16 +47,16 @@
              with open(self.path, 'wb') as f:
                  pickle.dump(self.content, f)
          except:
@@ -1930,7 +1972,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
              return False
          mtime = os.stat(filename).st_mtime
          return mtime >= self.content[filename][0]
-@@ -173,7 +173,7 @@ class Data:
+@@ -173,7 +173,7 @@
            Data object with the lines below the given path.
          """
          # If possible, return from cache.
@@ -1939,7 +1981,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
              return self.cache[str]
          
          arr = splitName(str)
-@@ -274,7 +274,7 @@ class Data:
+@@ -274,7 +274,7 @@
              if len(line.nodes) > self.level + level:
                  dict[line.nodes[self.level + level]] = 1
                  
@@ -1948,7 +1990,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
          arr.sort()
          return arr
              
-@@ -283,14 +283,14 @@ class Data:
+@@ -283,14 +283,14 @@
          for line in self.lines:
              if len(line.nodes) > self.level + level:
                  key = line.nodes[self.level + level]
@@ -1965,15 +2007,15 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
          arr2.sort()
          
          arr = []
---- a/util/py_lib/seqan/dddoc/html.py
-+++ b/util/py_lib/seqan/dddoc/html.py
+--- seqan.orig/util/py_lib/seqan/dddoc/html.py
++++ seqan/util/py_lib/seqan/dddoc/html.py
 @@ -1,4 +1,4 @@
 -#!/usr/bin/env python
 +#!/usr/bin/python3
  
  import sys
  import os
-@@ -6,7 +6,7 @@ import os.path
+@@ -6,7 +6,7 @@
  import shutil
  import json
  import string
@@ -1982,7 +2024,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
  import re
  import datetime
  import time
-@@ -14,7 +14,7 @@ import time
+@@ -14,7 +14,7 @@
  import pyratemp
  import json
  
@@ -1991,7 +2033,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
  
  # TODO(holtgrew): Take this from dddoc tree ;)
  TPL_FILES = [
-@@ -258,7 +258,7 @@ class TplDocsCreator(object):
+@@ -258,7 +258,7 @@
  
          The files in TPL_FILE are copied verbatimly.
          """
@@ -2000,7 +2042,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
          for path in TPL_FILES:
              # Get target path name.
              targetPath = os.path.join(self.out_path, os.path.dirname(path))
-@@ -267,7 +267,7 @@ class TplDocsCreator(object):
+@@ -267,7 +267,7 @@
              # Copy file.
              srcPath = os.path.join(self.tpl_path, path)
              destPath = os.path.join(self.out_path, path)
@@ -2009,7 +2051,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
              shutil.copyfile(srcPath, destPath)
  
      def createRootIndexPage(self):
-@@ -276,7 +276,7 @@ class TplDocsCreator(object):
+@@ -276,7 +276,7 @@
          The file is basically copied from tpl, but some small replacements are
          done using Python string templates.
          """
@@ -2018,7 +2060,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
          srcPath = os.path.join(self.tpl_path, 'index.html')
          destPath = os.path.join(self.out_path, 'index.html')
          with open(srcPath, 'rb') as f:
-@@ -301,11 +301,11 @@ class TplDocsCreator(object):
+@@ -301,11 +301,11 @@
          else:
              type_num = TYPE_CLASS
          # Index functions.
@@ -2032,7 +2074,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
                  if not ':' in node.children['summary'].texts[0]:
                      continue
                  summary = self.html_helper.translateMarkup(node.children['summary'].texts[0].split(':', 1)[1])
-@@ -320,7 +320,7 @@ class TplDocsCreator(object):
+@@ -320,7 +320,7 @@
              filename = getPagePath(cat_type, name, 'files')
              # Build list of include headers.
              includes = ''
@@ -2041,7 +2083,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
                  includes = ' ' + ', '.join(node.children['include'].texts)
              if type_num == TYPE_FUNCTION:
                  name = name + '()'
-@@ -339,14 +339,14 @@ class TplDocsCreator(object):
+@@ -339,14 +339,14 @@
          'longSearchIndex, 'info' that are used by searchdoc.js for providing the
          search index.
          """
@@ -2058,7 +2100,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
          key_entries = [(x[0], x[1].entry) for x in items if x[1].entry]
          key_linenos = [(x[0], self.tree.entries[x[1][0]].line_no_begin) for x in key_entries]
          cats = [x[0] for x in sorted(key_linenos, key=lambda a:a[1])]
-@@ -362,10 +362,10 @@ class TplDocsCreator(object):
+@@ -362,10 +362,10 @@
          This file contains the JavaScript information for building the naviation
          tree in the left frame.
          """
@@ -2071,7 +2113,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
          def getLocation(x):
              return (self.tree.entries[x[2].entry[0]].filename,
                      self.tree.entries[x[2].entry[0]].line_no_begin)
-@@ -407,7 +407,7 @@ class TplDocsCreator(object):
+@@ -407,7 +407,7 @@
                  subcat_nodes.append(subcat_node)
              filename = getIndexPagePath(self.tree, cat, 'files')
              trees_data.append([cat_title, filename, '', subcat_nodes])
@@ -2080,7 +2122,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
                  continue
          # Write out tree as JavaScript/JSON.
          ## print 'trees_data =', trees_data
-@@ -512,7 +512,7 @@ class HtmlHelper(object):
+@@ -512,7 +512,7 @@
                  if not parent_key in node.children:
                      continue
                  for path in node.children[parent_key].texts:
@@ -2089,7 +2131,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
                          continue  # Skip automatically generated upwards links.
                      parent = self.tree.find(path)
                      if not parent:
-@@ -790,7 +790,7 @@ class HtmlHelper(object):
+@@ -790,7 +790,7 @@
  
  class DocsCreator(object):
      def __init__(self, error_logger, tree, tpl_path, out_path, include_dirs):
@@ -2098,7 +2140,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
          self.tree = tree
          self.error_logger = error_logger
          self.tpl_path = tpl_path
-@@ -811,10 +811,10 @@ class DocsCreator(object):
+@@ -811,10 +811,10 @@
      def createIndexPages(self):
          index = core.buildByTypeAndCatIndex(self.tree)
          cat_nodes = self.tree.find('globals.indexes').children
@@ -2112,7 +2154,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
              filename = getIndexPagePath(self.tree, cat, self.out_path)
              with open(filename, 'wb') as f:
                  title_node = self.tree.find(['Indexpage', cat, 'title'])
-@@ -836,7 +836,7 @@ class DocsCreator(object):
+@@ -836,7 +836,7 @@
  
      def copyFiles(self):
          """Copy files in FILE_DIRS."""
@@ -2121,7 +2163,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
          for path in FILE_DIRS:
              entries = os.listdir(path)
              if not os.path.exists(os.path.join(self.out_path, path)):  # Make sure output path exists.
-@@ -847,18 +847,18 @@ class DocsCreator(object):
+@@ -847,18 +847,18 @@
                  source_path = os.path.join(path, entry)
                  target_path = os.path.join(self.out_path, path, entry)
                  # Copy file.
@@ -2145,7 +2187,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
                  filename = getPagePath(cat, subcat, self.out_path)
                  ## print filename
                  with open(filename, 'wb') as f:
-@@ -876,8 +876,8 @@ class DocsCreator(object):
+@@ -876,8 +876,8 @@
                                               html=HtmlHelper(self.error_logger, self.tree, os.path.dirname(filename), self.include_dirs),
                                               json=json)
                      f.write(res.encode('utf-8'))
@@ -2156,8 +2198,8 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
  
  
  def createDocs(error_logger, tree, tpl_path, out_path, include_dirs):
---- a/util/py_lib/seqan/dddoc/main.py
-+++ b/util/py_lib/seqan/dddoc/main.py
+--- seqan.orig/util/py_lib/seqan/dddoc/main.py
++++ seqan/util/py_lib/seqan/dddoc/main.py
 @@ -1,12 +1,12 @@
 -#!/usr/bin/env python
 +#!/usr/bin/python3
@@ -2174,7 +2216,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
  
  
  HEADER = """
-@@ -52,10 +52,10 @@ class DDDocRunner(object):
+@@ -52,10 +52,10 @@
            Return code of the application.  Is 0 for no problem, and 1 on
            errors and warnings.
          """
@@ -2187,7 +2229,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
                  core.parseFile(fn, app.cache)
          else:
              # Scan some/all modules.
-@@ -65,25 +65,25 @@ class DDDocRunner(object):
+@@ -65,25 +65,25 @@
                  
              # Scan doc directories.
              for doc_dir in self.doc_dirs:
@@ -2217,7 +2259,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
  
      start_time = datetime.datetime.now()
      
-@@ -106,12 +106,12 @@ def main(argv):
+@@ -106,12 +106,12 @@
                        action='store_true',
                        help='Ignore files if cache file exists.')
      options, args = parser.parse_args(argv)
@@ -2233,7 +2275,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
          return 1
      # Create application object and run documentation generation.
      app = DDDocRunner(index_only=False, doc_dirs=options.doc_dirs,
-@@ -122,7 +122,7 @@ def main(argv):
+@@ -122,7 +122,7 @@
      res = app.run(args)
  
      elapsed = datetime.datetime.now() - start_time
@@ -2242,8 +2284,8 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
  
      return res
      
---- a/util/py_lib/seqan/fixgcov/__init__.py
-+++ b/util/py_lib/seqan/fixgcov/__init__.py
+--- seqan.orig/util/py_lib/seqan/fixgcov/__init__.py
++++ seqan/util/py_lib/seqan/fixgcov/__init__.py
 @@ -1,8 +1,8 @@
 -#!/usr/bin/env python
 +#!/usr/bin/python3
@@ -2255,15 +2297,15 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
  
  main = app.main
  
---- a/util/py_lib/seqan/fixgcov/app.py
-+++ b/util/py_lib/seqan/fixgcov/app.py
+--- seqan.orig/util/py_lib/seqan/fixgcov/app.py
++++ seqan/util/py_lib/seqan/fixgcov/app.py
 @@ -1,4 +1,4 @@
 -#!/usr/bin/env python
 +#!/usr/bin/python3
  """Small libclang based app to fix gcov output.
  
  Fix gcov output with templates.  This is done by first parsing in the .cpp files
-@@ -16,7 +16,7 @@ Copyright: (c) 2010, Knut Reinert, FU Be
+@@ -16,7 +16,7 @@
  License:   3-clause BSD (see LICENSE)
  """
  
@@ -2272,7 +2314,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
  
  __author__ = 'Manuel Holtgrewe <manuel.holtgrewe at fu-berlin.de>'
  
-@@ -97,7 +97,7 @@ class VisitAllowedRule(object):
+@@ -97,7 +97,7 @@
          if not _hasFileLocation(node):
              return False
          # Try to hit cache.
@@ -2281,7 +2323,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
              return self.cache[node.location.file.name]
          # Check whether node's location is below the include directories.  It is
          # only visited if this is the case.
-@@ -137,7 +137,7 @@ class AstTraverser(object):
+@@ -137,7 +137,7 @@
          # print args
          tu = index.parse(filename, args=args)
          if self.options.verbosity >= 1:
@@ -2290,7 +2332,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
          return self._recurse(tu.cursor)
      
      @classmethod
-@@ -207,17 +207,17 @@ def main():
+@@ -207,17 +207,17 @@
          # lines with compound statements in all included files are written to
          # the location file.
          if options.verbosity >= 1:
@@ -2312,7 +2354,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
              AstTraverser.visitFile(src, node_visitor, options)
  
          # Convert locations into points.
-@@ -229,7 +229,7 @@ def main():
+@@ -229,7 +229,7 @@
  
          # Write out the source locations.
          if options.verbosity >= 1:
@@ -2321,7 +2363,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
          with open(options.location_file, 'wb') as f:
              pickle.dump(locations, f)
  
-@@ -240,20 +240,20 @@ def main():
+@@ -240,20 +240,20 @@
      if options.gcov_files:
          # If no source files and gcov files are given then
          if options.verbosity >= 1:
@@ -2346,7 +2388,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
              with open(filename, 'rb') as f:
                  lines = f.readlines()
              pos0 = lines[0].find(':')
-@@ -268,9 +268,9 @@ def main():
+@@ -268,9 +268,9 @@
                  txt = line[pos1 + 1:]
                  if txt.startswith('Source:'):
                      source = os.path.abspath(txt[len('Source:'):].strip())
@@ -2358,15 +2400,15 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
                          skip = True
                          break
                  if not source or lineno == 0:
---- a/util/py_lib/seqan/paths.py
-+++ b/util/py_lib/seqan/paths.py
+--- seqan.orig/util/py_lib/seqan/paths.py
++++ seqan/util/py_lib/seqan/paths.py
 @@ -1,4 +1,4 @@
 -#!/usr/bin/env python
 +#!/usr/bin/python3
  """SeqAn path utilities.
  
  Code to get paths within the SeqAn repository; Useful for setting defaults in
-@@ -56,10 +56,10 @@ def pathToHeader(location, filename):
+@@ -56,10 +56,10 @@
      return os.path.join(repositoryRoot(), location, filename)
  
  def main(args):
@@ -2381,8 +2423,8 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
  
  if __name__ == '__main__':
     sys.exit(main(sys.argv))
---- a/util/py_lib/seqan/pyclangcheck/__init__.py
-+++ b/util/py_lib/seqan/pyclangcheck/__init__.py
+--- seqan.orig/util/py_lib/seqan/pyclangcheck/__init__.py
++++ seqan/util/py_lib/seqan/pyclangcheck/__init__.py
 @@ -1,8 +1,8 @@
 -#!/usr/bin/env python
 +#!/usr/bin/python3
@@ -2394,15 +2436,15 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
  
  main = app.main
  
---- a/util/py_lib/seqan/pyclangcheck/app.py
-+++ b/util/py_lib/seqan/pyclangcheck/app.py
+--- seqan.orig/util/py_lib/seqan/pyclangcheck/app.py
++++ seqan/util/py_lib/seqan/pyclangcheck/app.py
 @@ -1,4 +1,4 @@
 -#!/usr/bin/env python
 +#!/usr/bin/python3
  """pyclangcheck driver code
  
  This code is the driver code for the pyclangcheck tool.
-@@ -7,7 +7,7 @@ Copyright: (c) 2010, Knut Reinert, FU Be
+@@ -7,7 +7,7 @@
  License:   3-clause BSD (see LICENSE)
  """
  
@@ -2411,7 +2453,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
  
  __author__ = 'Manuel Holtgrewe <manuel.holtgrewe at fu-berlin.de>'
  
-@@ -19,9 +19,9 @@ import sys
+@@ -19,9 +19,9 @@
  
  import clang.cindex as ci
  
@@ -2424,7 +2466,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
  
  def _hasFileLocation(node):
      """Return True if node has a file lcoation."""
-@@ -51,7 +51,7 @@ class FileCache(object):
+@@ -51,7 +51,7 @@
          self.cache = {}
  
      def get(self, path):
@@ -2433,7 +2475,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
              return self.cache[path]
          with open(path, 'rb') as f:
              fcontents = f.readlines()
-@@ -106,7 +106,7 @@ class CollectViolationsVisitor(object):
+@@ -106,7 +106,7 @@
                      txt = '<multiline>'
                  else:
                      txt = ''.join(lines).replace('\n', '\\n')
@@ -2442,7 +2484,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
          violations = []
          for rule in self.rules:
              if rule.allowVisit(node):
-@@ -155,7 +155,7 @@ class VisitAllowedRule(object):
+@@ -155,7 +155,7 @@
          if not _hasFileLocation(node):
              return False
          # Try to hit cache.
@@ -2451,7 +2493,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
              return self.cache[node.location.file.name]
          # Check whether the file is blocked.
          if node.location.file.name in self.blocked_files:
-@@ -200,14 +200,14 @@ class AstTraverser(object):
+@@ -200,14 +200,14 @@
          # print args
          tu = index.parse(filename, args=args)
          if self.options.verbosity >= 1:
@@ -2468,7 +2510,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
          traverser = AstTraverser(node_visitor, options)
          res = traverser.run(filename)
          return res != True
-@@ -291,7 +291,7 @@ def main():
+@@ -291,7 +291,7 @@
          res = AstTraverser.visitFile(filename, node_visitor, options)
          node_visitor.seenToBlocked()
          elapsed = datetime.datetime.now() - start
@@ -2477,7 +2519,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
          if res:
              break
  
-@@ -310,7 +310,7 @@ def main():
+@@ -310,7 +310,7 @@
      # Print violations.
      # ========================================================================
  
@@ -2486,15 +2528,15 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
      vs.update(node_visitor.violations)
      printer = violations.ViolationPrinter(options.ignore_nolint,
                                            options.show_source)
---- a/util/py_lib/seqan/pyclangcheck/rules.py
-+++ b/util/py_lib/seqan/pyclangcheck/rules.py
+--- seqan.orig/util/py_lib/seqan/pyclangcheck/rules.py
++++ seqan/util/py_lib/seqan/pyclangcheck/rules.py
 @@ -1,4 +1,4 @@
 -#!/usr/bin/env python
 +#!/usr/bin/python3
  
  __author__ = 'Manuel Holtgrewe <manuel.holtgrewe at fu-berlin.de>'
  
-@@ -7,8 +7,8 @@ import re
+@@ -7,8 +7,8 @@
  
  import clang.cindex as ci
  
@@ -2505,7 +2547,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
  
  RULE_NAMING_CONSTANT = 'naming.constant'
  RULE_NAMING_STRUCT = 'naming.struct'
-@@ -173,7 +173,7 @@ class InIncludeDirsRule(object):
+@@ -173,7 +173,7 @@
              return True
          if not app._hasFileLocation(node):
              return False
@@ -2514,8 +2556,8 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
              return self.cache[node.location.file.name]
          # Check whether node's location is below the include directories or one
          # of the source files.
---- a/util/py_lib/seqan/pyclangcheck/simple_checks.py
-+++ b/util/py_lib/seqan/pyclangcheck/simple_checks.py
+--- seqan.orig/util/py_lib/seqan/pyclangcheck/simple_checks.py
++++ seqan/util/py_lib/seqan/pyclangcheck/simple_checks.py
 @@ -1,13 +1,13 @@
 -#!/usr/bin/env python
 +#!/usr/bin/python3
@@ -2533,7 +2575,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
  
  RULE_TRAILING_WHITESPACE = 'whitespace.trailing'
  RULE_TEXT_TRAILING_WHITESPACE = 'Trailing whitespace is not allowed.'
-@@ -98,7 +98,7 @@ class CommentChecker(object):
+@@ -98,7 +98,7 @@
                  match = re.match(RE_TODO, comment)
                  if match:
                      if len(match.group(1)) > 1:
@@ -2542,13 +2584,13 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
                          v = violations.SimpleRuleViolation(
                              RULE_TODO_ONE_SPACE, filename, cstart.line,
                              cstart.column, RULE_TEXT_TODO_ONE_SPACE)
---- a/util/py_lib/seqan/pyclangcheck/suppressions.py
-+++ b/util/py_lib/seqan/pyclangcheck/suppressions.py
+--- seqan.orig/util/py_lib/seqan/pyclangcheck/suppressions.py
++++ seqan/util/py_lib/seqan/pyclangcheck/suppressions.py
 @@ -1 +1 @@
 -#!/usr/bin/env python
 +#!/usr/bin/python3
---- a/util/py_lib/seqan/pyclangcheck/violations.py
-+++ b/util/py_lib/seqan/pyclangcheck/violations.py
+--- seqan.orig/util/py_lib/seqan/pyclangcheck/violations.py
++++ seqan/util/py_lib/seqan/pyclangcheck/violations.py
 @@ -1,14 +1,14 @@
 -#!/usr/bin/env python
 +#!/usr/bin/python3
@@ -2568,7 +2610,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
  
  
  class RuleViolation(object):
-@@ -54,7 +54,7 @@ class NolintManager(object):
+@@ -54,7 +54,7 @@
      def hasNolint(self, filename, lineno):
          filename = os.path.abspath(filename)
          # Ensure that the nolint lines are registered in self.locations[filename].
@@ -2577,7 +2619,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
              line_set = set()
              with open(filename, 'rb') as f:
                  line_no = 0
-@@ -80,12 +80,12 @@ class ViolationPrinter(object):
+@@ -80,12 +80,12 @@
          for k in sorted(vs.keys()):
              violation = vs[k]
              if self.ignore_nolint or not self.nolints.hasNolint(violation.file, violation.line):
@@ -2595,15 +2637,15 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
 -        print 'Total: %d violations' % len(vs)
 +        print('Total: %d violations' % len(vs))
  
---- a/util/py_lib/seqan/release_page.py
-+++ b/util/py_lib/seqan/release_page.py
+--- seqan.orig/util/py_lib/seqan/release_page.py
++++ seqan/util/py_lib/seqan/release_page.py
 @@ -1,4 +1,4 @@
 -#!/usr/bin/env python
 +#!/usr/bin/python3
  """Build the SeqAn Releases Website."""
  
  import operator
-@@ -167,23 +167,23 @@ class RssWriter(object):
+@@ -167,23 +167,23 @@
  
      def generate(self):
          """Create output RSS files."""
@@ -2633,7 +2675,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
      db = PackageDatabase(options.package_db)
      db.load()
      # Load and render overview template.
-@@ -197,9 +197,9 @@ def work(options):
+@@ -197,9 +197,9 @@
                      sorted=sorted))
      # Load and render package template.
      tpl = pyratemp.Template(filename=PACKAGE_TPL_PATH)
@@ -2645,15 +2687,15 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
          with open(out_path, 'wb') as f:
              f.write(tpl(FORMATS=FORMATS,
                          utc_time=time.strftime('%a, %d %b %Y %H:%M:%S UTC', time.gmtime()),
---- a/util/py_lib/seqan/skel.py
-+++ b/util/py_lib/seqan/skel.py
+--- seqan.orig/util/py_lib/seqan/skel.py
++++ seqan/util/py_lib/seqan/skel.py
 @@ -1,4 +1,4 @@
 -#!/usr/bin/env python
 +#!/usr/bin/python3
  """SeqAn code generation from templates / skeletons.
  
  This module contains code to help the creation of modules, tests, apps etc.
-@@ -28,7 +28,7 @@ Copyright: (c) 2010, Knut Reinert, FU Be
+@@ -28,7 +28,7 @@
  License:   3-clause BSD (see LICENSE)
  """
  
@@ -2662,7 +2704,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
  
  __author__ = 'Manuel Holtgrewe <manuel.holtgrewe at fu-berlin.de>'
  
-@@ -39,7 +39,7 @@ import os.path
+@@ -39,7 +39,7 @@
  import sys
  import string
  
@@ -2671,7 +2713,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
  
  # Add os.path.relpath if it is not already there, so we can use Python 2.5, too.
  # TODO(holtgrew): This could go into a "compatibility" module.
-@@ -111,30 +111,30 @@ library modules, tests, apps, app tests,
+@@ -111,30 +111,30 @@
  #""".strip()
  
  def createDirectory(path, dry_run=False):
@@ -2713,7 +2755,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
      else:
          with open(target_file, 'wb') as f:
              f.write(target_contents)
-@@ -177,13 +177,13 @@ def _checkTargetPaths(target_path, optio
+@@ -177,13 +177,13 @@
      # Check that the given path does not exist yet.
      if os.path.exists(target_path) and not options.force:
          msg = 'The path %s already exists. Move it and call this script again.'
@@ -2730,7 +2772,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
          return False
      return True
  
-@@ -192,14 +192,14 @@ def createModule(name, location, options
+@@ -192,14 +192,14 @@
      seqan_path = os.path.join(include_path, 'seqan')
      module_path = os.path.join(seqan_path, name)
      header_path = os.path.join(seqan_path, '%s.h' % name)
@@ -2749,7 +2791,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
      if options.create_dirs:
          # Create directory.
          createDirectory(module_path, options.dry_run)
-@@ -227,11 +227,11 @@ def createModule(name, location, options
+@@ -227,11 +227,11 @@
  
  def createTest(name, location, options):
      target_path = paths.pathToTest(location, name)
@@ -2764,7 +2806,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
      if options.create_dirs:
          # Create directory.
          createDirectory(target_path, options.dry_run)
-@@ -259,11 +259,11 @@ def createTest(name, location, options):
+@@ -259,11 +259,11 @@
  
  def createApp(name, location, options):
      target_path = paths.pathToApp(location, name)
@@ -2779,7 +2821,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
      if options.create_programs:
          # Create directory.
          createDirectory(target_path, options.dry_run)
-@@ -291,11 +291,11 @@ def createApp(name, location, options):
+@@ -291,11 +291,11 @@
  
  def createDemo(name, location, options):
      target_path = paths.pathToDemo(location, name)
@@ -2794,7 +2836,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
      if options.create_programs:
          # Copy over .cpp file for app and perform replacements.
          source_file = paths.pathToTemplate('demo_template', 'demo.cpp')
-@@ -307,27 +307,27 @@ def createDemo(name, location, options):
+@@ -307,27 +307,27 @@
  
  def createHeader(name, location, options):
      target_path = paths.pathToHeader(location, name)
@@ -2829,7 +2871,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
      # Copy over .h file for app and perform replacements.
      source_file = paths.pathToTemplate('header_template', 'library_header.h')
      target_file = os.path.join(target_path)
-@@ -337,12 +337,12 @@ def createLibraryHeader(name, location,
+@@ -337,12 +337,12 @@
      return 0
  
  def createRepository(location, options):
@@ -2845,7 +2887,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
      if options.create_dirs:
          # Create directories.
          createDirectory(target_path, options.dry_run)
-@@ -375,13 +375,13 @@ def createRepository(location, options):
+@@ -375,13 +375,13 @@
      return 0
  
  def createAppTests(location, options):
@@ -2862,7 +2904,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
  
      # Create directories.
      if options.create_dirs:
-@@ -398,16 +398,16 @@ def createAppTests(location, options):
+@@ -398,16 +398,16 @@
      replacements = buildReplacements('app_tests', location, target_path, target_file, options)
      configureFile(target_file, source_file, replacements, options.dry_run, options)
  
@@ -2889,7 +2931,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
      
      return 0
  
-@@ -441,7 +441,7 @@ def main():
+@@ -441,7 +441,7 @@
                        default=False)
      options, args = parser.parse_args()
      if options.infos_only and options.cmakelists_only:
@@ -2898,7 +2940,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
          return 1
      options.create_cmakelists = True
      options.create_infos = True
-@@ -457,15 +457,15 @@ def main():
+@@ -457,15 +457,15 @@
          parser.print_help(file=sys.stderr)
          return 1
      if len(args) < 2:
@@ -2917,7 +2959,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
              return 1
  
      if args[0] == 'repository':
-@@ -473,7 +473,7 @@ def main():
+@@ -473,7 +473,7 @@
      elif args[0] == 'app_tests':
          return createAppTests(args[1], options)
      elif len(args) != 3:
@@ -2926,8 +2968,8 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
          return 1
      create_methods = {
          'module' : createModule,
---- a/util/py_lib/termcolor.py
-+++ b/util/py_lib/termcolor.py
+--- seqan.orig/util/py_lib/termcolor.py
++++ seqan/util/py_lib/termcolor.py
 @@ -23,7 +23,7 @@
  
  """ANSII Color formatting for output in terminal."""
@@ -2937,9 +2979,9 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
  import os
  
  
---- a/util/py_lib/threadpool/__init__.py
-+++ b/util/py_lib/threadpool/__init__.py
-@@ -52,7 +52,7 @@ __license__ = "MIT license"
+--- seqan.orig/util/py_lib/threadpool/__init__.py
++++ seqan/util/py_lib/threadpool/__init__.py
+@@ -52,7 +52,7 @@
  # standard library modules
  import sys
  import threading
@@ -2948,7 +2990,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
  import traceback
  
  
-@@ -145,7 +145,7 @@ class WorkerThread(threading.Thread):
+@@ -145,7 +145,7 @@
              # the while loop again, to give the thread a chance to exit.
              try:
                  request = self._requests_queue.get(True, self._poll_timeout)
@@ -2957,7 +2999,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
                  continue
              else:
                  if self._dismissed.isSet():
-@@ -247,8 +247,8 @@ class ThreadPool:
+@@ -247,8 +247,8 @@
              ``ThreadPool.putRequest()`` and catch ``Queue.Full`` exceptions.
  
          """
@@ -2968,7 +3010,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
          self.workers = []
          self.dismissedWorkers = []
          self.workRequests = {}
-@@ -315,7 +315,7 @@ class ThreadPool:
+@@ -315,7 +315,7 @@
                         (request.exception and request.exc_callback):
                      request.callback(request, result)
                  del self.workRequests[request.requestID]
@@ -2977,7 +3019,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
                  break
  
      def wait(self):
-@@ -346,18 +346,18 @@ if __name__ == '__main__':
+@@ -346,18 +346,18 @@
  
      # this will be called each time a result is available
      def print_result(request, result):
@@ -3001,7 +3043,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
  
      # assemble the arguments for each job to a list...
      data = [random.randint(1,10) for i in range(20)]
-@@ -377,13 +377,13 @@ if __name__ == '__main__':
+@@ -377,13 +377,13 @@
      )
  
      # we create a pool of 3 worker threads
@@ -3017,7 +3059,7 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
      # or shorter:
      # [main.putRequest(req) for req in requests]
  
-@@ -398,21 +398,21 @@ if __name__ == '__main__':
+@@ -398,21 +398,21 @@
          try:
              time.sleep(0.5)
              main.poll()
@@ -3046,8 +3088,8 @@ Last-Update: Mon, 16 Dec 2019 17:19:24 +0100
 -        print "Joining all dismissed worker threads..."
 +        print("Joining all dismissed worker threads...")
          main.joinAllDismissedWorkers()
---- a/util/skel/app_tests_template/run_tests.py
-+++ b/util/skel/app_tests_template/run_tests.py
+--- seqan.orig/util/skel/app_tests_template/run_tests.py
++++ seqan/util/skel/app_tests_template/run_tests.py
 @@ -1,4 +1,4 @@
 -#!/usr/bin/env python
 +#!/usr/bin/python3


=====================================
debian/patches/series
=====================================
@@ -1,3 +1,4 @@
 skip_extras_and_apps.patch
 skip_doc_creation.patch
 2to3.patch
+skip_broken_tests


=====================================
debian/patches/skip_broken_tests
=====================================
@@ -0,0 +1,16 @@
+Author: Michael R. Crusoe <michael.crusoe at gmail.com>
+Description: skip broken tests
+
+Upstream will not be fixing this
+--- seqan.orig/core/tests/index/CMakeLists.txt
++++ seqan/core/tests/index/CMakeLists.txt
+@@ -130,9 +130,5 @@
+ add_test (NAME test_test_index_sa_bwtwalk COMMAND $<TARGET_FILE:test_index_sa_bwtwalk>)
+ add_test (NAME test_test_index_shapes COMMAND $<TARGET_FILE:test_index_shapes>)
+ add_test (NAME test_test_index_drawing COMMAND $<TARGET_FILE:test_index_drawing>)
+-add_test (NAME test_test_index_fm COMMAND $<TARGET_FILE:test_index_fm>)
+-if (NOT CMAKE_COMPILER_IS_GNUCXX OR (450 LESS _GCC_VERSION))
+-    add_test (NAME test_test_index_stree_iterators COMMAND $<TARGET_FILE:test_index_stree_iterators>)
+-endif ()
+ add_test (NAME test_test_index_repeats COMMAND $<TARGET_FILE:test_index_repeats>)
+ 



View it on GitLab: https://salsa.debian.org/med-team/seqan/-/compare/31cb70a2a28ae39cf0d0bc87682ebbc495acecf9...dd0c3c68e2a88891b972be4439164988f7d6397c

-- 
View it on GitLab: https://salsa.debian.org/med-team/seqan/-/compare/31cb70a2a28ae39cf0d0bc87682ebbc495acecf9...dd0c3c68e2a88891b972be4439164988f7d6397c
You're receiving this email because of your account on salsa.debian.org.


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/debian-med-commit/attachments/20200302/0aa9ab54/attachment-0001.html>


More information about the debian-med-commit mailing list