[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