From c5271e91ab6a2c81b9dc45f05867e176185a2e46 Mon Sep 17 00:00:00 2001 From: Rabenok Dmitrii Date: Tue, 9 Jun 2026 16:53:44 +0500 Subject: [PATCH 1/5] Add new repos in topics.json --- config/topics.json | 72 ++++++++++++++++++++++++++++++++++++++ validate_topics.py | 86 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 158 insertions(+) create mode 100644 validate_topics.py diff --git a/config/topics.json b/config/topics.json index e86be0c7..7928b0ea 100644 --- a/config/topics.json +++ b/config/topics.json @@ -1729,6 +1729,78 @@ "name": "qubership-integration" } ] + }, + { + "repositoryName": "cassandra", + "repositoryTopics": [ + { + "name": "qubership-infra-fork" + } + ] + }, + { + "repositoryName": "kafka", + "repositoryTopics": [ + { + "name": "qubership-infra-fork" + } + ] + }, + { + "repositoryName": "keycloak", + "repositoryTopics": [ + { + "name": "qubership-infra-fork" + } + ] + }, + { + "repositoryName": "minio", + "repositoryTopics": [ + { + "name": "qubership-infra-fork" + } + ] + }, + { + "repositoryName": "mistral-upstream", + "repositoryTopics": [ + { + "name": "qubership-infra-fork" + } + ] + }, + { + "repositoryName": "postgres", + "repositoryTopics": [ + { + "name": "qubership-infra-fork" + } + ] + }, + { + "repositoryName": "qubership-clickhouse-operator-helm", + "repositoryTopics": [ + { + "name": "qubership-infra" + } + ] + }, + { + "repositoryName": "qubership-openbao", + "repositoryTopics": [ + { + "name": "qubership-infra" + } + ] + }, + { + "repositoryName": "qubership-build-info-go", + "repositoryTopics": [ + { + "name": "qubership-devops" + } + ] } ] diff --git a/validate_topics.py b/validate_topics.py new file mode 100644 index 00000000..f5b0ec33 --- /dev/null +++ b/validate_topics.py @@ -0,0 +1,86 @@ +import json +import re +import sys +from collections import Counter + +path = "config/topics.json" +errors = [] +warnings = [] + +with open(path, encoding="utf-8") as f: + try: + data = json.load(f) + except json.JSONDecodeError as e: + print(f"JSON parse error: {e}") + sys.exit(1) + +if not isinstance(data, list): + errors.append("Root must be a JSON array") + +names = [] +topic_pattern = re.compile(r"^[a-z0-9][a-z0-9-]*$") + +for i, entry in enumerate(data): + if not isinstance(entry, dict): + errors.append(f"Entry {i}: must be an object") + continue + if "repositoryName" not in entry: + errors.append(f"Entry {i}: missing repositoryName") + continue + name = entry["repositoryName"] + if not isinstance(name, str) or not name.strip(): + errors.append(f"Entry {i}: invalid repositoryName") + elif "," in name: + errors.append(f"Entry {i}: repositoryName contains comma: {name!r}") + names.append(name) + + topics = entry.get("repositoryTopics") + if topics is None: + errors.append(f"Entry {i} ({name}): missing repositoryTopics") + continue + if not isinstance(topics, list) or len(topics) == 0: + warnings.append(f"{name}: empty or invalid repositoryTopics") + continue + for j, t in enumerate(topics): + if not isinstance(t, dict) or "name" not in t: + errors.append(f"{name}: topic {j} missing name field") + continue + tname = t["name"] + if not isinstance(tname, str) or not tname.strip(): + errors.append(f"{name}: topic {j} has empty name") + elif not topic_pattern.match(tname): + errors.append( + f"{name}: invalid topic name {tname!r} (GitHub: lowercase alphanumeric + hyphens)" + ) + +counts = Counter(names) +dups = [n for n, c in counts.items() if c > 1] +for n in sorted(dups): + errors.append(f"Duplicate repositoryName: {n!r} ({counts[n]} times)") + +topic_names = { + t["name"] + for e in data + if isinstance(e, dict) and isinstance(e.get("repositoryTopics"), list) + for t in e["repositoryTopics"] + if isinstance(t, dict) and "name" in t +} + +print(f"Entries: {len(data)}") +print(f"Unique repositories: {len(set(names))}") +print(f"Distinct topic names: {len(topic_names)}") + +if warnings: + print(f"\nWarnings ({len(warnings)}):") + for w in warnings: + print(f" - {w}") + +if errors: + print(f"\nErrors ({len(errors)}):") + for e in errors: + print(f" - {e}") + sys.exit(1) + +print("\nValidation passed: valid JSON and all checks OK") +if warnings: + print(f"({len(warnings)} warning(s))") From 0628537168a259bb6fc661f78846751fbafee153 Mon Sep 17 00:00:00 2001 From: Rabenok Dmitrii Date: Tue, 9 Jun 2026 17:00:00 +0500 Subject: [PATCH 2/5] Delete unnessary file --- validate_topics.py | 86 ---------------------------------------------- 1 file changed, 86 deletions(-) delete mode 100644 validate_topics.py diff --git a/validate_topics.py b/validate_topics.py deleted file mode 100644 index f5b0ec33..00000000 --- a/validate_topics.py +++ /dev/null @@ -1,86 +0,0 @@ -import json -import re -import sys -from collections import Counter - -path = "config/topics.json" -errors = [] -warnings = [] - -with open(path, encoding="utf-8") as f: - try: - data = json.load(f) - except json.JSONDecodeError as e: - print(f"JSON parse error: {e}") - sys.exit(1) - -if not isinstance(data, list): - errors.append("Root must be a JSON array") - -names = [] -topic_pattern = re.compile(r"^[a-z0-9][a-z0-9-]*$") - -for i, entry in enumerate(data): - if not isinstance(entry, dict): - errors.append(f"Entry {i}: must be an object") - continue - if "repositoryName" not in entry: - errors.append(f"Entry {i}: missing repositoryName") - continue - name = entry["repositoryName"] - if not isinstance(name, str) or not name.strip(): - errors.append(f"Entry {i}: invalid repositoryName") - elif "," in name: - errors.append(f"Entry {i}: repositoryName contains comma: {name!r}") - names.append(name) - - topics = entry.get("repositoryTopics") - if topics is None: - errors.append(f"Entry {i} ({name}): missing repositoryTopics") - continue - if not isinstance(topics, list) or len(topics) == 0: - warnings.append(f"{name}: empty or invalid repositoryTopics") - continue - for j, t in enumerate(topics): - if not isinstance(t, dict) or "name" not in t: - errors.append(f"{name}: topic {j} missing name field") - continue - tname = t["name"] - if not isinstance(tname, str) or not tname.strip(): - errors.append(f"{name}: topic {j} has empty name") - elif not topic_pattern.match(tname): - errors.append( - f"{name}: invalid topic name {tname!r} (GitHub: lowercase alphanumeric + hyphens)" - ) - -counts = Counter(names) -dups = [n for n, c in counts.items() if c > 1] -for n in sorted(dups): - errors.append(f"Duplicate repositoryName: {n!r} ({counts[n]} times)") - -topic_names = { - t["name"] - for e in data - if isinstance(e, dict) and isinstance(e.get("repositoryTopics"), list) - for t in e["repositoryTopics"] - if isinstance(t, dict) and "name" in t -} - -print(f"Entries: {len(data)}") -print(f"Unique repositories: {len(set(names))}") -print(f"Distinct topic names: {len(topic_names)}") - -if warnings: - print(f"\nWarnings ({len(warnings)}):") - for w in warnings: - print(f" - {w}") - -if errors: - print(f"\nErrors ({len(errors)}):") - for e in errors: - print(f" - {e}") - sys.exit(1) - -print("\nValidation passed: valid JSON and all checks OK") -if warnings: - print(f"({len(warnings)} warning(s))") From 39ccca3ea3471d3fa9b783d312453b1c7ac5b3bd Mon Sep 17 00:00:00 2001 From: Rabenok Dmitrii Date: Tue, 9 Jun 2026 17:09:38 +0500 Subject: [PATCH 3/5] Add new repos in topics.json --- config/topics.json | 35 +++++++++++++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/config/topics.json b/config/topics.json index 7928b0ea..69167e58 100644 --- a/config/topics.json +++ b/config/topics.json @@ -480,7 +480,7 @@ ] }, { - "repositoryName": "qubership-core-commons", + "repositoryName": "qubership-core-mesh-config", "repositoryTopics": [ { "name": "qubership-core" @@ -1778,6 +1778,38 @@ } ] }, + { + "repositoryName": "qubership-ai-packages", + "repositoryTopics": [ + { + "name": "qubership-generic" + } + ] + }, + { + "repositoryName": "qubership-3rd-party-security-report", + "repositoryTopics": [ + { + "name":"qubership-devops" + } + ] + }, + { + "repositoryName":"opensearch-cross-cluster-replication-patches", + "repositoryTopics":[ + { + "name":"qubership-infra" + } + ] + }, + { + "repositoryName": "openmaxio-object-browser", + "repositoryTopics":[ + { + "name":"qubership-infra-fork" + } + ] + }, { "repositoryName": "qubership-clickhouse-operator-helm", "repositoryTopics": [ @@ -1802,5 +1834,4 @@ } ] } - ] From 7767d71ff03655cde093fdab1dc56791e66938fd Mon Sep 17 00:00:00 2001 From: Rabenok Dmitrii Date: Tue, 9 Jun 2026 17:19:05 +0500 Subject: [PATCH 4/5] Add new repos in topics.json --- config/topics.json | 24 ------------------------ 1 file changed, 24 deletions(-) diff --git a/config/topics.json b/config/topics.json index 69167e58..99e6389c 100644 --- a/config/topics.json +++ b/config/topics.json @@ -1809,29 +1809,5 @@ "name":"qubership-infra-fork" } ] - }, - { - "repositoryName": "qubership-clickhouse-operator-helm", - "repositoryTopics": [ - { - "name": "qubership-infra" - } - ] - }, - { - "repositoryName": "qubership-openbao", - "repositoryTopics": [ - { - "name": "qubership-infra" - } - ] - }, - { - "repositoryName": "qubership-build-info-go", - "repositoryTopics": [ - { - "name": "qubership-devops" - } - ] } ] From fb8ab96b8825eceaf9107e9371fe1702ef7fda3d Mon Sep 17 00:00:00 2001 From: Rabenok Dmitrii Date: Tue, 9 Jun 2026 17:21:09 +0500 Subject: [PATCH 5/5] Add new repos in topics.json --- config/topics.json | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/config/topics.json b/config/topics.json index 99e6389c..69167e58 100644 --- a/config/topics.json +++ b/config/topics.json @@ -1809,5 +1809,29 @@ "name":"qubership-infra-fork" } ] + }, + { + "repositoryName": "qubership-clickhouse-operator-helm", + "repositoryTopics": [ + { + "name": "qubership-infra" + } + ] + }, + { + "repositoryName": "qubership-openbao", + "repositoryTopics": [ + { + "name": "qubership-infra" + } + ] + }, + { + "repositoryName": "qubership-build-info-go", + "repositoryTopics": [ + { + "name": "qubership-devops" + } + ] } ]