From bcfdd0fe37de13d71ae503e3f084bf86ff51b37b Mon Sep 17 00:00:00 2001
From: xuezhixin <xuezhixin@uniontech.com>
Date: Fri, 10 Nov 2023 17:35:30 +0800
Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0abi=E6=A3=80=E6=B5=8B?=
 =?UTF-8?q?=E7=BB=93=E6=9E=9C=E6=9D=83=E9=87=8D?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 sysmig_agent/abi_weight.py | 97 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 97 insertions(+)
 create mode 100644 sysmig_agent/abi_weight.py

diff --git a/sysmig_agent/abi_weight.py b/sysmig_agent/abi_weight.py
new file mode 100644
index 0000000..ce6b15f
--- /dev/null
+++ b/sysmig_agent/abi_weight.py
@@ -0,0 +1,97 @@
+# SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd.
+# SPDX-License-Identifier:   MulanPubL-2.0-or-later
+
+import os
+
+# ABI_INCOMPAT_PATH = '/home/xzx/nfs/abi-incompat-pkg.txt'
+# ABI_COMPAT_PATH = '/home/xzx/nfs/abi-compat-pkg.txt'
+pwd = '/root/nfs'
+ABI_INCOMPAT_PATH = pwd+'/abi-incompat-pkg.txt'
+ABI_COMPAT_PATH = pwd + '/abi-compat-pkg.txt'
+AppStream =pwd + '/uos-sysmig/ut-Migration-tools/sysmig_agent/AppStream.txt'
+BaseOS = pwd + '/uos-sysmig/ut-Migration-tools/sysmig_agent/txts/BaseOS.txt'
+
+
+def get_list_pkg(path):
+    with open(path, 'r') as ap:
+        rpm = ap.readlines()
+        ap.close()
+    return rpm
+#
+
+# 调用
+def get_abi_incompat_pkg():
+    query = []
+    rpms = get_list_pkg(ABI_INCOMPAT_PATH)
+    for i in range(len(rpms)):
+        rpm = rpms[i].split('|', -1)
+        if len(query) > 0:
+            for q in range(len(query)):
+                if str(rpm[0]).strip() == str(query[q]):
+                    break
+                if q == len(query) - 1:
+                    query.append(rpm[0])
+        else:
+            query.append(rpm[0])
+    return query
+
+
+def return_error(debuginfo):
+    #####logging debug info
+    print(debuginfo)
+
+
+# 传入txt和rpm队列返回匹配个数
+def match_rpm(txt_path, rpm_query):
+    with open(txt_path, 'r') as ap:
+        appstream_rpms = ap.readlines()
+        ap.close()
+    total_rpm = 0
+    q = []
+    for i in range(len(rpm_query)):
+        for n in range(len(appstream_rpms)):
+            if str(rpm_query[i].strip().strip('\n')) == str(appstream_rpms[n].strip().strip('\n')):
+                total_rpm = total_rpm + 1
+                q.append(rpm_query[i])
+                break
+            if n == (len(appstream_rpms)):
+                print('No compat with AppStream and BaseOS list : ' + rpm_query[i])
+    return total_rpm
+
+
+def rpm_priority(rpm_compat_query, rpm_incompat_query):
+    app_weight = 50
+    base_weight = 50
+    if not os.path.exists(AppStream) and os.path.exists(BaseOS):
+        return return_error('debuginfo:can not open this file...')
+    total_incompat_app = match_rpm(AppStream, rpm_incompat_query)
+    total_incompat_base = match_rpm(BaseOS, rpm_incompat_query)
+    total_compat_app = match_rpm(AppStream, rpm_compat_query)
+    total_compat_base = match_rpm(BaseOS, rpm_compat_query)
+    app_weight_percent = (total_compat_app / (total_incompat_app + total_compat_app)) * app_weight
+    base_weight_percent = (total_compat_base / (total_incompat_base + total_compat_base)) * base_weight
+    AllWeight = app_weight_percent + base_weight_percent
+    AllWeight = format(AllWeight, '.0f')
+    return AllWeight
+
+
+def first_high_weight(rpm_incompat_query):
+    riq = ['gcc', 'glibc', 'binutils']
+    for i in range(len(riq)):
+        for n in range(len(rpm_incompat_query)):
+            if riq[i] == rpm_incompat_query[n]:
+                return False
+    return True
+
+
+def abi_check_priority():
+    rpm_incompat_query = get_abi_incompat_pkg()
+    rpm_compat_query = get_list_pkg(ABI_COMPAT_PATH)
+    del rpm_incompat_query[:2]
+    del rpm_compat_query[0]
+    if first_high_weight(rpm_incompat_query):
+        AllWeight = rpm_priority(rpm_compat_query, rpm_incompat_query)
+    else:
+        AllWeight = 0
+    print(AllWeight)
+
-- 
2.20.1

