From e665d95f0da728496cb23e39e1adbc13c553654a Mon Sep 17 00:00:00 2001 From: versat Date: Tue, 22 Oct 2019 12:19:17 +0200 Subject: [PATCH 1/8] donate-cpu-server.py: Use tools to prepare code to work with Python 3 The following commands were used for these changes: futurize -1 -w donate-cpu-server.py 2to3 -w donate-cpu-server.py --- tools/donate-cpu-server.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tools/donate-cpu-server.py b/tools/donate-cpu-server.py index cf4ad5aa4c7..398cfb061b5 100644 --- a/tools/donate-cpu-server.py +++ b/tools/donate-cpu-server.py @@ -10,7 +10,7 @@ import time from threading import Thread import sys -import urllib +import urllib.request, urllib.parse, urllib.error import logging import logging.handlers import operator @@ -203,7 +203,7 @@ def crashReport(results_path): html += '\n' html += '
\n'
     html += 'Stack traces\n'
-    for stack_trace in sorted(stack_traces.values(), key=lambda x: x['n'], reverse=True):
+    for stack_trace in sorted(list(stack_traces.values()), key=lambda x: x['n'], reverse=True):
         html += 'Packages: ' + ' '.join(['' + p + '' for p in stack_trace['packages']]) + '\n'
         html += stack_trace['crash_line'] + '\n'
         html += stack_trace['code_line'] + '\n'
@@ -676,11 +676,11 @@ def check_library_report(result_path, message_id):
                 function_counts[function_name] = function_counts.setdefault(function_name, 0) + 1
 
     function_details_list = []
-    for function_name, count in sorted(function_counts.items(), key=operator.itemgetter(1), reverse=True):
+    for function_name, count in sorted(list(function_counts.items()), key=operator.itemgetter(1), reverse=True):
         if len(function_details_list) >= functions_shown_max:
             break
         function_details_list.append(str(count).rjust(column_widths[0]) + ' ' +
-                '' + function_name + '\n')
+                '' + function_name + '\n')
 
     html += ''.join(function_details_list)
     html += '
\n' @@ -692,7 +692,7 @@ def check_library_report(result_path, message_id): # Lists all checkLibrary* messages regarding the given function name def check_library_function_name(result_path, function_name): print('check_library_function_name') - function_name = urllib.unquote_plus(function_name) + function_name = urllib.parse.unquote_plus(function_name) output_lines_list = [] for filename in glob.glob(result_path + '/*'): if not os.path.isfile(filename): From 9d182502cd4b1b756b8f402ba4bee4eccc3214b2 Mon Sep 17 00:00:00 2001 From: versat Date: Tue, 22 Oct 2019 13:52:24 +0200 Subject: [PATCH 2/8] Make the server work under Python 3 Manually fixed the Unicode issues. Received data is decoded, sent data is encoded. --- tools/donate-cpu-server.py | 51 +++++++++++++++++++++++++++----------- 1 file changed, 36 insertions(+), 15 deletions(-) diff --git a/tools/donate-cpu-server.py b/tools/donate-cpu-server.py index 398cfb061b5..d1d8e2d22f7 100644 --- a/tools/donate-cpu-server.py +++ b/tools/donate-cpu-server.py @@ -1,5 +1,6 @@ # Server for 'donate-cpu.py' +# Runs only under Python 3. import glob import json @@ -10,7 +11,9 @@ import time from threading import Thread import sys -import urllib.request, urllib.parse, urllib.error +import urllib.request +import urllib.parse +import urllib.error import logging import logging.handlers import operator @@ -18,7 +21,7 @@ # Version scheme (MAJOR.MINOR.PATCH) should orientate on "Semantic Versioning" https://semver.org/ # Every change in this script should result in increasing the version number accordingly (exceptions may be cosmetic # changes) -SERVER_VERSION = "1.2.0" +SERVER_VERSION = "1.3.0" OLD_VERSION = '1.89' @@ -722,7 +725,8 @@ def check_library_function_name(result_path, function_name): return ''.join(output_lines_list) -def sendAll(connection, data): +def sendAll(connection, text): + data = text.encode('utf-8', 'ignore') while data: num = connection.send(data) if num < len(data): @@ -812,7 +816,7 @@ def run(self): filename = resultPath + '/' + url if not os.path.isfile(filename): print('HTTP/1.1 404 Not Found') - self.connection.send('HTTP/1.1 404 Not Found\r\n\r\n') + self.connection.send(b'HTTP/1.1 404 Not Found\r\n\r\n') else: f = open(filename, 'rt') data = f.read() @@ -845,10 +849,15 @@ def server(server_address_port, packages, packageIndex, resultPath): print('[' + strDateTime() + '] waiting for a connection') connection, client_address = sock.accept() try: - cmd = connection.recv(128) + bytes_received = connection.recv(128) + cmd = bytes_received.decode('utf-8', 'ignore') except socket.error: connection.close() continue + except UnicodeDecodeError as e: + connection.close() + print('Error: Decoding failed: ' + str(e)) + continue if cmd.find('\n') < 1: continue firstLine = cmd[:cmd.find('\n')] @@ -861,7 +870,7 @@ def server(server_address_port, packages, packageIndex, resultPath): elif cmd == 'GetCppcheckVersions\n': reply = 'head ' + OLD_VERSION print('[' + strDateTime() + '] GetCppcheckVersions: ' + reply) - connection.send(reply) + connection.send(reply.encode('utf-8', 'ignore')) connection.close() elif cmd == 'get\n': pkg = packages[packageIndex] @@ -874,7 +883,7 @@ def server(server_address_port, packages, packageIndex, resultPath): f.close() print('[' + strDateTime() + '] get:' + pkg) - connection.send(pkg) + connection.send(pkg.encode('utf-8', 'ignore')) connection.close() elif cmd.startswith('write\nftp://'): # read data @@ -883,10 +892,16 @@ def server(server_address_port, packages, packageIndex, resultPath): t = 0 max_data_size = 2 * 1024 * 1024 while (len(data) < max_data_size) and (not data.endswith('\nDONE')) and (t < 10): - d = connection.recv(1024) - if d: + bytes_received = connection.recv(1024) + if bytes_received: + try: + text_received = bytes_received.decode('utf-8', 'ignore') + except UnicodeDecodeError as e: + print('Error: Decoding failed: ' + str(e)) + data = '' + break t = 0 - data += d + data += text_received else: time.sleep(0.2) t += 0.2 @@ -944,10 +959,16 @@ def server(server_address_port, packages, packageIndex, resultPath): t = 0 max_data_size = 1024 * 1024 while (len(data) < max_data_size) and (not data.endswith('\nDONE')) and (t < 10): - d = connection.recv(1024) - if d: + bytes_received = connection.recv(1024) + if bytes_received: + try: + text_received = bytes_received.decode('utf-8', 'ignore') + except UnicodeDecodeError as e: + print('Error: Decoding failed: ' + str(e)) + data = '' + break t = 0 - data += d + data += text_received else: time.sleep(0.2) t += 0.2 @@ -978,7 +999,7 @@ def server(server_address_port, packages, packageIndex, resultPath): f.write(strDateTime() + '\n' + data) elif cmd == 'getPackagesCount\n': packages_count = str(len(packages)) - connection.send(packages_count) + connection.send(packages_count.encode('utf-8', 'ignore')) connection.close() print('[' + strDateTime() + '] getPackagesCount: ' + packages_count) continue @@ -986,7 +1007,7 @@ def server(server_address_port, packages, packageIndex, resultPath): request_idx = abs(int(cmd[len('getPackageIdx:'):])) if request_idx < len(packages): pkg = packages[request_idx] - connection.send(pkg) + connection.send(pkg.encode('utf-8', 'ignore')) connection.close() print('[' + strDateTime() + '] getPackageIdx: ' + pkg) else: From f7230184f41915f6e5330eff46733afcfd239733 Mon Sep 17 00:00:00 2001 From: versat Date: Tue, 22 Oct 2019 15:01:43 +0200 Subject: [PATCH 3/8] Add backward compatible type hints (in comments) This enables better static analysis and suggestions in an IDE. --- tools/donate-cpu-server.py | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/tools/donate-cpu-server.py b/tools/donate-cpu-server.py index d1d8e2d22f7..454eb5ebe5a 100644 --- a/tools/donate-cpu-server.py +++ b/tools/donate-cpu-server.py @@ -55,14 +55,17 @@ def handle_uncaught_exception(exc_type, exc_value, exc_traceback): def strDateTime(): + # type: () -> str return datetime.datetime.now().strftime('%Y-%m-%d %H:%M') def dateTimeFromStr(datestr): + # type: (str) -> datetime.datetime return datetime.datetime.strptime(datestr, '%Y-%m-%d %H:%M') def overviewReport(): + # type: () -> str html = 'daca@home\n' html += '

daca@home

\n' html += 'Crash report
\n' @@ -81,6 +84,7 @@ def overviewReport(): def fmt(a, b, c=None, d=None, e=None, link=True): + # type: (str, str, str, str, str, bool) -> str column_width = [40, 10, 5, 6, 6, 8] ret = a while len(ret) < column_width[0]: @@ -105,6 +109,7 @@ def fmt(a, b, c=None, d=None, e=None, link=True): def latestReport(latestResults): + # type: (list) -> str html = 'Latest daca@home results\n' html += '

Latest daca@home results

\n' html += '
\n' + fmt('Package', 'Date       Time', OLD_VERSION, 'Head', 'Diff', link=False) + '\n'
@@ -144,6 +149,7 @@ def latestReport(latestResults):
 
 
 def crashReport(results_path):
+    # type: (str) -> str
     html = 'Crash report\n'
     html += '

Crash report

\n' html += '
\n'
@@ -218,6 +224,7 @@ def crashReport(results_path):
 
 
 def staleReport(results_path):
+    # type: (str) -> str
     html = 'Stale report\n'
     html += '

Stale report

\n' html += '
\n'
@@ -246,6 +253,7 @@ def staleReport(results_path):
 
 
 def diffReportFromDict(out, today):
+    # type: (dict, str) -> str
     html = '
\n'
     html += 'MessageID                           ' + OLD_VERSION + '    Head\n'
     sum0 = 0
@@ -284,6 +292,7 @@ def diffReportFromDict(out, today):
 
 
 def diffReport(resultsPath):
+    # type: (str) -> str
     out = {}
     outToday = {}
     today = strDateTime()[:10]
@@ -319,6 +328,7 @@ def diffReport(resultsPath):
 
 
 def generate_package_diff_statistics(filename):
+    # type: (str) -> None
     is_diff = False
 
     sums = {}
@@ -359,6 +369,7 @@ def generate_package_diff_statistics(filename):
 
 
 def diffMessageIdReport(resultPath, messageId):
+    # type: (str, str) -> str
     text = messageId + '\n'
     e = '[' + messageId + ']\n'
     for filename in sorted(glob.glob(resultPath + '/*.diff')):
@@ -386,6 +397,7 @@ def diffMessageIdReport(resultPath, messageId):
 
 
 def diffMessageIdTodayReport(resultPath, messageId):
+    # type: (str, str) -> str
     text = messageId + '\n'
     e = '[' + messageId + ']\n'
     today = strDateTime()[:10]
@@ -421,6 +433,7 @@ def diffMessageIdTodayReport(resultPath, messageId):
 
 
 def headReportFromDict(out, today):
+    # type: (dict, str) -> str
     html = '
\n'
     html += 'MessageID                                  Count\n'
     sumTotal = 0
@@ -449,6 +462,7 @@ def headReportFromDict(out, today):
 
 
 def headReport(resultsPath):
+    # type: (str) -> str
     out = {}
     outToday = {}
     today = strDateTime()[:10]
@@ -513,6 +527,7 @@ def headReport(resultsPath):
 
 
 def headMessageIdReport(resultPath, messageId):
+    # type: (str, str) -> str
     text = messageId + '\n'
     e = '[' + messageId + ']\n'
     for filename in sorted(glob.glob(resultPath + '/*')):
@@ -538,6 +553,7 @@ def headMessageIdReport(resultPath, messageId):
 
 
 def headMessageIdTodayReport(resultPath, messageId):
+    # type: (str, str) -> str
     text = messageId + '\n'
     e = '[' + messageId + ']\n'
     today = strDateTime()[:10]
@@ -569,6 +585,7 @@ def headMessageIdTodayReport(resultPath, messageId):
 
 
 def timeReport(resultPath):
+    # type: (str) -> str
     html = 'Time report\n'
     html += '

Time report

\n' html += '
\n'
@@ -638,6 +655,7 @@ def timeReport(resultPath):
 
 
 def check_library_report(result_path, message_id):
+    # type: (str, str) -> str
     if message_id not in ('checkLibraryNoReturn', 'checkLibraryFunction', 'checkLibraryUseIgnore'):
         error_message = 'Invalid value ' + message_id + ' for message_id parameter.'
         print(error_message)
@@ -694,6 +712,7 @@ def check_library_report(result_path, message_id):
 
 # Lists all checkLibrary* messages regarding the given function name
 def check_library_function_name(result_path, function_name):
+    # type: (str, str) -> str
     print('check_library_function_name')
     function_name = urllib.parse.unquote_plus(function_name)
     output_lines_list = []
@@ -726,6 +745,7 @@ def check_library_function_name(result_path, function_name):
 
 
 def sendAll(connection, text):
+    # type: (socket.socket, str) -> None
     data = text.encode('utf-8', 'ignore')
     while data:
         num = connection.send(data)
@@ -736,6 +756,7 @@ def sendAll(connection, text):
 
 
 def httpGetResponse(connection, data, contentType):
+    # type: (socket.socket, str, str) -> None
     resp = 'HTTP/1.1 200 OK\r\n'
     resp += 'Connection: close\r\n'
     resp += 'Content-length: ' + str(len(data)) + '\r\n'
@@ -828,6 +849,7 @@ def run(self):
 
 
 def server(server_address_port, packages, packageIndex, resultPath):
+    # type: (int, list, int, str) -> None
     socket.setdefaulttimeout(30)
     sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
     sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
@@ -889,7 +911,7 @@ def server(server_address_port, packages, packageIndex, resultPath):
             # read data
             data = cmd[cmd.find('ftp'):]
             try:
-                t = 0
+                t = 0.0
                 max_data_size = 2 * 1024 * 1024
                 while (len(data) < max_data_size) and (not data.endswith('\nDONE')) and (t < 10):
                     bytes_received = connection.recv(1024)
@@ -900,7 +922,7 @@ def server(server_address_port, packages, packageIndex, resultPath):
                             print('Error: Decoding failed: ' + str(e))
                             data = ''
                             break
-                        t = 0
+                        t = 0.0
                         data += text_received
                     else:
                         time.sleep(0.2)
@@ -956,7 +978,7 @@ def server(server_address_port, packages, packageIndex, resultPath):
             # read data
             data = cmd[11:]
             try:
-                t = 0
+                t = 0.0
                 max_data_size = 1024 * 1024
                 while (len(data) < max_data_size) and (not data.endswith('\nDONE')) and (t < 10):
                     bytes_received = connection.recv(1024)
@@ -967,7 +989,7 @@ def server(server_address_port, packages, packageIndex, resultPath):
                             print('Error: Decoding failed: ' + str(e))
                             data = ''
                             break
-                        t = 0
+                        t = 0.0
                         data += text_received
                     else:
                         time.sleep(0.2)

From 9603c82c0d2760183a100fd243ed92a708afa56a Mon Sep 17 00:00:00 2001
From: versat 
Date: Tue, 22 Oct 2019 15:33:55 +0200
Subject: [PATCH 4/8] Fix Pylint warning "Comparison to literal"

---
 tools/donate-cpu-server.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tools/donate-cpu-server.py b/tools/donate-cpu-server.py
index 454eb5ebe5a..3bb1a647a4e 100644
--- a/tools/donate-cpu-server.py
+++ b/tools/donate-cpu-server.py
@@ -690,7 +690,7 @@ def check_library_report(result_path, message_id):
             if not info_messages:
                 continue
             if line.endswith('[' + message_id + ']\n'):
-                if message_id is 'checkLibraryFunction':
+                if message_id == 'checkLibraryFunction':
                     function_name = line[(line.find('for function ') + len('for function ')):line.rfind('[') - 1]
                 else:
                     function_name = line[(line.find(': Function ') + len(': Function ')):line.rfind('should have') - 1]

From b04c0dbf30eb135e23e7968f5cb8ad49a92d7c0d Mon Sep 17 00:00:00 2001
From: versat 
Date: Wed, 23 Oct 2019 08:16:47 +0200
Subject: [PATCH 5/8] .travis.yml: Fix/enhance pylint verification and Python
 compilation

donate-cpu-server.py is only Python 3 compatible, so it must be ignored
for pylint verification under Python 2.
All Python scripts that were verified with pylint under Python 2 are
now also verified with pylint under Python 3.
---
 .travis.yml | 13 ++++++++++---
 1 file changed, 10 insertions(+), 3 deletions(-)

diff --git a/.travis.yml b/.travis.yml
index fbc51cf8b18..d42746c1dc4 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -25,9 +25,14 @@ before_install:
  - travis_retry python2 -m pip install --user pytest==4.6.4
  - travis_retry python2 -m pip install --user pylint
  - travis_retry python2 -m pip install --user unittest2
- - travis_retry python2 -m pip install --user pexpect
+ - travis_retry python2 -m pip install --user pexpect # imported by tools/ci.py
 # Python 3 modules
+ - travis_retry python3 -m pip install --user setuptools --upgrade
  - travis_retry python3 -m pip install --user pytest
+ - travis_retry python3 -m pip install --user pylint
+ - travis_retry python3 -m pip install --user unittest2
+ - travis_retry python3 -m pip install --user pexpect # imported by tools/ci.py
+ - travis_retry python3 -m pip install --user requests # imported by tools/pr.py
 
 matrix:
 # do notify immediately about it when a job of a build fails.
@@ -95,11 +100,13 @@ matrix:
 # run pylint
         - pylint --rcfile=pylintrc_travis addons/*.py
         - pylint --rcfile=pylintrc_travis htmlreport/*.py
-        - pylint --rcfile=pylintrc_travis tools/*.py
+        - pylint --rcfile=pylintrc_travis --ignore=donate-cpu-server.py tools/*.py
+        - python3 -m pylint --rcfile=pylintrc_travis addons/*.py
+        - python3 -m pylint --rcfile=pylintrc_travis htmlreport/*.py
+        - python3 -m pylint --rcfile=pylintrc_travis tools/*.py
 # check python syntax by compiling some selected scripts
         - python -m py_compile ./tools/donate-cpu.py
         - python3 -m py_compile ./tools/donate-cpu.py
-        - python -m py_compile ./tools/donate-cpu-server.py
         - python3 -m py_compile ./tools/donate-cpu-server.py
 # check addons/misc.py
         - cd addons/test

From 2d2352b96710b3f1ce2536d2dba817ea496c8396 Mon Sep 17 00:00:00 2001
From: versat 
Date: Wed, 23 Oct 2019 10:41:53 +0200
Subject: [PATCH 6/8] donate-cpu-server.py: Add shebang and mark script as
 executable

---
 tools/donate-cpu-server.py | 1 +
 1 file changed, 1 insertion(+)
 mode change 100644 => 100755 tools/donate-cpu-server.py

diff --git a/tools/donate-cpu-server.py b/tools/donate-cpu-server.py
old mode 100644
new mode 100755
index 3bb1a647a4e..1d4ef4dbdba
--- a/tools/donate-cpu-server.py
+++ b/tools/donate-cpu-server.py
@@ -1,3 +1,4 @@
+#!/usr/bin/env python3
 
 # Server for 'donate-cpu.py'
 # Runs only under Python 3.

From 62205e75402ac77aac96ab60b723a020fb955972 Mon Sep 17 00:00:00 2001
From: versat 
Date: Wed, 23 Oct 2019 10:45:27 +0200
Subject: [PATCH 7/8] start_donate_cpu_server_test_local.sh: Directly execute
 server

Since the server script is executable now and has a shebang it can
be directly executed.
---
 tools/test/start_donate_cpu_server_test_local.sh | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tools/test/start_donate_cpu_server_test_local.sh b/tools/test/start_donate_cpu_server_test_local.sh
index 796c0874585..b53124707e7 100644
--- a/tools/test/start_donate_cpu_server_test_local.sh
+++ b/tools/test/start_donate_cpu_server_test_local.sh
@@ -27,5 +27,5 @@ fi
 
 while :
 do
-    python "${cppcheck_tools_path}/donate-cpu-server.py" --test
+    "${cppcheck_tools_path}/donate-cpu-server.py" --test
 done

From 36b952e992fc6b22e2583f494517b3ca3581ee00 Mon Sep 17 00:00:00 2001
From: versat 
Date: Fri, 25 Oct 2019 09:15:31 +0200
Subject: [PATCH 8/8] Use Python 3.0 function annotations instead of comment
 type hints

Reference: https://www.python.org/dev/peps/pep-3107/
---
 tools/donate-cpu-server.py | 69 +++++++++++++-------------------------
 1 file changed, 23 insertions(+), 46 deletions(-)

diff --git a/tools/donate-cpu-server.py b/tools/donate-cpu-server.py
index 1d4ef4dbdba..6172b728cdb 100755
--- a/tools/donate-cpu-server.py
+++ b/tools/donate-cpu-server.py
@@ -55,18 +55,15 @@ def handle_uncaught_exception(exc_type, exc_value, exc_traceback):
 sys.excepthook = handle_uncaught_exception
 
 
-def strDateTime():
-    # type: () -> str
+def strDateTime() -> str:
     return datetime.datetime.now().strftime('%Y-%m-%d %H:%M')
 
 
-def dateTimeFromStr(datestr):
-    # type: (str) -> datetime.datetime
+def dateTimeFromStr(datestr: str) -> datetime.datetime:
     return datetime.datetime.strptime(datestr, '%Y-%m-%d %H:%M')
 
 
-def overviewReport():
-    # type: () -> str
+def overviewReport() -> str:
     html = 'daca@home\n'
     html += '

daca@home

\n' html += 'Crash report
\n' @@ -84,8 +81,7 @@ def overviewReport(): return html -def fmt(a, b, c=None, d=None, e=None, link=True): - # type: (str, str, str, str, str, bool) -> str +def fmt(a: str, b: str, c: str = None, d: str = None, e: str = None, link: bool = True) -> str: column_width = [40, 10, 5, 6, 6, 8] ret = a while len(ret) < column_width[0]: @@ -109,8 +105,7 @@ def fmt(a, b, c=None, d=None, e=None, link=True): return ret -def latestReport(latestResults): - # type: (list) -> str +def latestReport(latestResults: list) -> str: html = 'Latest daca@home results\n' html += '

Latest daca@home results

\n' html += '
\n' + fmt('Package', 'Date       Time', OLD_VERSION, 'Head', 'Diff', link=False) + '\n'
@@ -149,8 +144,7 @@ def latestReport(latestResults):
     return html
 
 
-def crashReport(results_path):
-    # type: (str) -> str
+def crashReport(results_path: str) -> str:
     html = 'Crash report\n'
     html += '

Crash report

\n' html += '
\n'
@@ -224,8 +218,7 @@ def crashReport(results_path):
     return html
 
 
-def staleReport(results_path):
-    # type: (str) -> str
+def staleReport(results_path: str) -> str:
     html = 'Stale report\n'
     html += '

Stale report

\n' html += '
\n'
@@ -253,8 +246,7 @@ def staleReport(results_path):
     return html
 
 
-def diffReportFromDict(out, today):
-    # type: (dict, str) -> str
+def diffReportFromDict(out: dict, today: str) -> str:
     html = '
\n'
     html += 'MessageID                           ' + OLD_VERSION + '    Head\n'
     sum0 = 0
@@ -292,8 +284,7 @@ def diffReportFromDict(out, today):
     return html
 
 
-def diffReport(resultsPath):
-    # type: (str) -> str
+def diffReport(resultsPath: str) -> str:
     out = {}
     outToday = {}
     today = strDateTime()[:10]
@@ -328,8 +319,7 @@ def diffReport(resultsPath):
     return html
 
 
-def generate_package_diff_statistics(filename):
-    # type: (str) -> None
+def generate_package_diff_statistics(filename: str) -> None:
     is_diff = False
 
     sums = {}
@@ -369,8 +359,7 @@ def generate_package_diff_statistics(filename):
         os.remove(filename_diff)
 
 
-def diffMessageIdReport(resultPath, messageId):
-    # type: (str, str) -> str
+def diffMessageIdReport(resultPath: str, messageId: str) -> str:
     text = messageId + '\n'
     e = '[' + messageId + ']\n'
     for filename in sorted(glob.glob(resultPath + '/*.diff')):
@@ -397,8 +386,7 @@ def diffMessageIdReport(resultPath, messageId):
     return text
 
 
-def diffMessageIdTodayReport(resultPath, messageId):
-    # type: (str, str) -> str
+def diffMessageIdTodayReport(resultPath: str, messageId: str) -> str:
     text = messageId + '\n'
     e = '[' + messageId + ']\n'
     today = strDateTime()[:10]
@@ -433,8 +421,7 @@ def diffMessageIdTodayReport(resultPath, messageId):
     return text
 
 
-def headReportFromDict(out, today):
-    # type: (dict, str) -> str
+def headReportFromDict(out: dict, today: str) -> str:
     html = '
\n'
     html += 'MessageID                                  Count\n'
     sumTotal = 0
@@ -462,8 +449,7 @@ def headReportFromDict(out, today):
     return html
 
 
-def headReport(resultsPath):
-    # type: (str) -> str
+def headReport(resultsPath: str) -> str:
     out = {}
     outToday = {}
     today = strDateTime()[:10]
@@ -527,8 +513,7 @@ def headReport(resultsPath):
     return html
 
 
-def headMessageIdReport(resultPath, messageId):
-    # type: (str, str) -> str
+def headMessageIdReport(resultPath: str, messageId: str) -> str:
     text = messageId + '\n'
     e = '[' + messageId + ']\n'
     for filename in sorted(glob.glob(resultPath + '/*')):
@@ -553,8 +538,7 @@ def headMessageIdReport(resultPath, messageId):
     return text
 
 
-def headMessageIdTodayReport(resultPath, messageId):
-    # type: (str, str) -> str
+def headMessageIdTodayReport(resultPath: str, messageId: str) -> str:
     text = messageId + '\n'
     e = '[' + messageId + ']\n'
     today = strDateTime()[:10]
@@ -585,8 +569,7 @@ def headMessageIdTodayReport(resultPath, messageId):
     return text
 
 
-def timeReport(resultPath):
-    # type: (str) -> str
+def timeReport(resultPath: str) -> str:
     html = 'Time report\n'
     html += '

Time report

\n' html += '
\n'
@@ -655,8 +638,7 @@ def timeReport(resultPath):
     return html
 
 
-def check_library_report(result_path, message_id):
-    # type: (str, str) -> str
+def check_library_report(result_path: str, message_id: str) -> str:
     if message_id not in ('checkLibraryNoReturn', 'checkLibraryFunction', 'checkLibraryUseIgnore'):
         error_message = 'Invalid value ' + message_id + ' for message_id parameter.'
         print(error_message)
@@ -712,8 +694,7 @@ def check_library_report(result_path, message_id):
 
 
 # Lists all checkLibrary* messages regarding the given function name
-def check_library_function_name(result_path, function_name):
-    # type: (str, str) -> str
+def check_library_function_name(result_path: str, function_name: str) -> str:
     print('check_library_function_name')
     function_name = urllib.parse.unquote_plus(function_name)
     output_lines_list = []
@@ -745,8 +726,7 @@ def check_library_function_name(result_path, function_name):
     return ''.join(output_lines_list)
 
 
-def sendAll(connection, text):
-    # type: (socket.socket, str) -> None
+def sendAll(connection: socket.socket, text: str) -> None:
     data = text.encode('utf-8', 'ignore')
     while data:
         num = connection.send(data)
@@ -756,8 +736,7 @@ def sendAll(connection, text):
             data = None
 
 
-def httpGetResponse(connection, data, contentType):
-    # type: (socket.socket, str, str) -> None
+def httpGetResponse(connection: socket.socket, data: str, contentType: str) -> None:
     resp = 'HTTP/1.1 200 OK\r\n'
     resp += 'Connection: close\r\n'
     resp += 'Content-length: ' + str(len(data)) + '\r\n'
@@ -767,7 +746,7 @@ def httpGetResponse(connection, data, contentType):
 
 
 class HttpClientThread(Thread):
-    def __init__(self, connection, cmd, resultPath, latestResults):
+    def __init__(self, connection: socket.socket, cmd: str, resultPath: str, latestResults: list) -> None:
         Thread.__init__(self)
         self.connection = connection
         self.cmd = cmd[:cmd.find('\n')]
@@ -849,8 +828,7 @@ def run(self):
             self.connection.close()
 
 
-def server(server_address_port, packages, packageIndex, resultPath):
-    # type: (int, list, int, str) -> None
+def server(server_address_port: int, packages: list, packageIndex: int, resultPath: str) -> None:
     socket.setdefaulttimeout(30)
     sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
     sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
@@ -1076,4 +1054,3 @@ def server(server_address_port, packages, packageIndex, resultPath):
         server(server_address_port, packages, packageIndex, resultPath)
     except socket.timeout:
         print('Timeout!')
-