bin/checkExternalLibraries.py |  196 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 196 insertions(+)

New commits:
commit 510f0837882284d20b49da8ee1f4f909ed54f0b7
Author:     Xisco Fauli <[email protected]>
AuthorDate: Wed Sep 18 14:46:13 2024 +0200
Commit:     Xisco Fauli <[email protected]>
CommitDate: Wed Nov 13 09:33:38 2024 +0100

    bin: Add script to check the latest version of external libraries
    
    it uses https://release-monitoring.org for that
    
    Change-Id: I8ec79f3b1b5e9ae57cc35e19156cba5022870911
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/173618
    Tested-by: Jenkins
    Reviewed-by: Xisco Fauli <[email protected]>

diff --git a/bin/checkExternalLibraries.py b/bin/checkExternalLibraries.py
new file mode 100755
index 000000000000..df05999c1ba4
--- /dev/null
+++ b/bin/checkExternalLibraries.py
@@ -0,0 +1,196 @@
+#!/usr/bin/env python3
+
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+# Use this script to check the latest version of the external libraries
+
+import requests
+import sys
+import re
+from packaging.version import Version, parse
+import subprocess
+import argparse
+
+python_branch = ""
+openssl_branch = ""
+postgres_branch = ""
+mariadb_branch = ""
+
+def get_current_version(libName):
+    libraryName = libName.replace("_", ".")
+    libraryName = re.sub("[0-9a-f]{5,40}", "", libraryName) #SHA1
+    s = re.search("\d[\d\.]+\d", libraryName )
+    if s:
+        return parse(s.group())
+
+    return Version("0.0.0")
+
+def get_library_list(fileName):
+    inputProces = "include " + fileName + "
all:
        $(foreach v,$(sort $(filter %TARBALL,$(.VARIABLES))),$(info export 
$(v)=$($(v))))"
+    process = subprocess.run(["make", "-q", "-f", "-"], 
input=bytes(inputProces, 'UTF-8'), stdout=subprocess.PIPE)
+
+    libraryList = []
+    for lib in process.stdout.splitlines():
+        decodedName = lib.decode("utf-8")
+        variableName = decodedName.split("=")[0]
+
+        if "JFREEREPORT_" in variableName:
+            continue
+
+        # FIXME
+        if "FONT_" in variableName:
+            continue
+
+        libraryName = decodedName.split("=")[1]
+        if libraryName.startswith("Python"):
+            global python_branch
+            python_branch = ''.join(re.findall("\d{1,2}\.\d{1,2}", 
libraryName)[0])
+            print("Python is on branch: " + str(python_branch))
+        elif libraryName.startswith("postgres"):
+            global postgres_branch
+            postgres_branch = ''.join(re.findall("\d{1,2}", libraryName)[0])
+            print("Postgres is on branch: " + str(postgres_branch))
+        elif libraryName.startswith("openssl"):
+            global openssl_branch
+            openssl_branch = ''.join(re.findall("\d{1,2}\.\d{1,2}", 
libraryName)[0])
+            print("Openssl is on branch: " + str(openssl_branch))
+        elif libraryName.startswith("mariadb"):
+            global mariadb_branch
+            mariadb_branch = ''.join(re.findall("\d{1,2}\.\d{1,2}", 
libraryName)[0])
+            print("MariaDB is on branch: " + str(mariadb_branch))
+        libraryList.append(libraryName.lower())
+    return libraryList
+
+def get_latest_version(libName):
+
+    if libName.startswith("boost"):
+        libName = "boost"
+    elif libName.startswith("java-websocket"):
+        libName = "java-websocket"
+    elif libName.startswith("phc-winner-argon2"):
+        libName = "argon2"
+    elif libName.startswith("libe-book"):
+        libName = "libe-book"
+    elif libName.startswith("zxcvbn-c"):
+        libName = "zxcvbn-c"
+    elif libName.startswith("libjpeg-turbo"):
+        libName = "libjpeg-turbo"
+    elif libName.startswith("poppler-data"):
+        libName = "poppler-data"
+    elif libName.startswith("libgpg-error"):
+        libName = "libgpg-error"
+    elif libName.startswith("mariadb-connector-c"):
+        libName = "mariadb-connector-c"
+    elif libName.startswith("postgresql"):
+        libName = "postgresql%20" + str(postgres_branch) + ".x"
+    elif libName.startswith("tiff"):
+        libName = "libtiff"
+    elif libName.startswith("zxing"):
+        libName = "zxing-cpp"
+    elif libName.startswith("liborcus"):
+        libName = "orcus"
+    elif libName.startswith("ltm"):
+        libName = "libtommath"
+    elif "clucene-core" in libName:
+        libName = "clucene-core"
+    elif "lp_solve" in libName:
+        libName = "lp_solve"
+    elif "hsqldb" in libName:
+        libName = "hsqldb"
+    elif re.match("[0-9a-f]{5,40}", libName.split("-")[0]): # SHA1
+        libName = libName.split("-")[1]
+    else:
+        libName = libName.split("-")[0]
+
+    item = 0
+    itemId = 0
+    latest_version = 0
+    if libName == "openssl":
+        item = 2
+        itemId = 2566
+    elif libName == "curl":
+        item = 1
+        itemId = 381
+    elif libName == "libpng":
+        item = 4
+        itemId = 1705
+    elif libName == "freetype":
+        item = 2
+        itemId = 854
+    elif libName == "lcms2":
+        item = 1
+        itemId = 9815
+    elif libName == "cairo":
+        item = 1
+        itemId = 247
+    elif libName == "bzip2":
+        item = 1
+        itemId = 237
+    elif libName == "zlib":
+        item = 1
+        itemId = 5303
+    elif libName == "libwebp":
+        item = 1
+        itemId = 1761
+    elif libName == "libffi":
+        item = 1
+        itemId = 1611
+
+    urlApi = "https://release-monitoring.org/api/v2/projects/?name="; + libName
+    res = requests.get(urlApi)
+    json = res.json()
+    if not json['items']:
+        return Version("0.0.0"), ""
+
+    if item != 0:
+        assert json['items'][item]['id'] == itemId, 
str(json['items'][item]['id']) + " != " + str(itemId)
+
+    if libName == "openssl":
+        for idx, ver in enumerate(json['items'][item]['stable_versions']):
+            if ver.startswith(openssl_branch):
+                latest_version = idx
+                break
+
+    elif libName == "python":
+        for idx, ver in enumerate(json['items'][item]['stable_versions']):
+            if ver.startswith(python_branch):
+                latest_version = idx
+                break
+
+    elif libName == "mariadb-connector-c":
+        for idx, ver in enumerate(json['items'][item]['stable_versions']):
+            if ver.startswith(mariadb_branch):
+                latest_version = idx
+                break
+
+    return 
Version(json['items'][item]['stable_versions'][latest_version].replace("_", 
".").replace("-", ".")), json['items'][item]['homepage']
+
+if __name__ == '__main__':
+    parser = argparse.ArgumentParser()
+
+    parser.add_argument('--file', action="store", dest="file", required=True)
+
+    args = parser.parse_args()
+
+    libraryList = get_library_list(args.file)
+    if not libraryList:
+        sys.exit(1)
+
+    for lib in libraryList:
+        if lib.startswith("language-subtag-registry"):
+            print("CHECK 
https://www.iana.org/assignments/language-subtag-registry/language-subtag-registry";)
+            continue
+        latestVersion, website = get_latest_version(lib)
+        currentVersion = get_current_version(lib)
+        if latestVersion == Version("0.0.0"):
+            print("FAIL: " + lib + " not found in 
https://release-monitoring.org";)
+        elif currentVersion == Version("0.0.0"):
+            print("FAIL: " + lib + " version not detected")
+        elif currentVersion != latestVersion:
+            print(lib + " is not updated: " + website)
+            print(" ----> The current version is " + str(currentVersion))
+            print(" ----> The latest version is " + str(latestVersion))

Reply via email to