Example #1
0
def matching_version_from_dict(dependency_name, dependency_version_range):
    global global_dependency_version_dict
    key = dependency_name + dependency_version_range
    if key in global_dependency_version_dict:
        return global_dependency_version_dict[key]
    else:
        # 实际匹配版本
        dependency_version = matching_version.get_matching_version(
            dependency_name, dependency_version_range)
        global_dependency_version_dict[key] = dependency_version
        return dependency_version
Example #2
0
def do_check_dependencies_tree(targetFramework, lock_dependencies_list):
    global install_dependencies_list
    global waiting_detect_dependencies_list
    global matching_version_get_matching_version_dict

    for l_num in range(len(lock_dependencies_list)):
        lock_dependencies_list[l_num] = lock_dependencies_list[l_num].replace(
            "@", "$")

    # for dependencies_info in dependencies_list:
    #     # [email protected]@0
    #     # 包@版本范围@层级
    #     if waiting_detect_dependencies_list==[]:
    #         waiting_detect_dependencies_list.append(dependencies_info)
    #     else:
    #         if dependencies_info not in waiting_detect_dependencies_list:
    #             waiting_detect_dependencies_list.append(dependencies_info)

    #等待检测队列不为空时
    while waiting_detect_dependencies_list != []:

        detect_dependencies_info = waiting_detect_dependencies_list.pop(0)
        detect_dependencies_info_list = detect_dependencies_info.split("@")
        # 直接依赖信息: A$1.0
        detect_directly_dependency_info = detect_dependencies_info_list[0]

        detect_dependency_name = detect_dependencies_info_list[1]
        detect_dependency_version_range = detect_dependencies_info_list[2]
        detect_dependency_level = detect_dependencies_info_list[3]

        matching_version_get_matching_version_key = detect_dependency_name + detect_dependency_version_range
        if matching_version_get_matching_version_key in matching_version_get_matching_version_dict:
            detect_dependency_version = matching_version_get_matching_version_dict[
                matching_version_get_matching_version_key]
        else:
            # 待检测依赖版本
            detect_dependency_version = matching_version.get_matching_version(
                detect_dependency_name, detect_dependency_version_range)
            matching_version_get_matching_version_dict[
                matching_version_get_matching_version_key] = detect_dependency_version

        (matched_framework, commitTimeStamp) = check_targetFramework_confict(
            detect_dependency_name, detect_dependency_version, targetFramework,
            detect_directly_dependency_info)

        if "(" in detect_dependency_version_range:
            # print("*****************************************************************")
            # print("warning! NU1604 版本范围无下限", detect_dependency_name)
            # print("依赖范围:", detect_dependency_version_range)
            irregularity_list.append(detect_dependency_name + "@" +
                                     detect_dependency_version_range)

        status = 0
        temp_check_info = []
        for install_dependencies_info in install_dependencies_list:
            # [A,version,first_level,[range1,range2,range3]]
            install_dependencies_name = install_dependencies_info[0]
            if detect_dependency_name == install_dependencies_name:
                temp_check_info = install_dependencies_info
                break

        # 已安装列表中-没有同名依赖包
        if temp_check_info == []:

            # ['Microsoft.Extensions.Primitives', '5.0.0', '3', ['[3.0.0, )', '[5.0.0, )'], 'Microsoft.EntityFrameworkCore.SqlServer$5.0.3', '.NETCoreApp3.0']
            temp_install_dependencies_info = []

            temp_install_dependencies_info.append(detect_dependency_name)
            detect_dependency_version = matching_version.get_matching_version(
                detect_dependency_name, detect_dependency_version_range)
            temp_install_dependencies_info.append(detect_dependency_version)
            temp_install_dependencies_info.append(detect_dependency_level)
            temp_range_list = []
            temp_range_list.append(detect_dependency_version_range)
            temp_install_dependencies_info.append(temp_range_list)

            # # 直接依赖信息: A$1.0
            temp_install_dependencies_info.append(
                detect_directly_dependency_info)
            temp_install_dependencies_info.append(matched_framework)

            install_dependencies_list.append(temp_install_dependencies_info)

            append_waiting_detect_dependencies_list(
                detect_directly_dependency_info, detect_dependency_name,
                detect_dependency_version, detect_dependency_level,
                matched_framework, commitTimeStamp)

        # 有同名依赖包
        else:
            # print("**********************************************")
            # 首次出现是否为直接依赖:
            temp_check_dependency_name = temp_check_info[0]
            temp_check_dependency_install_version = temp_check_info[1]
            temp_check_dependency_first_level = temp_check_info[2]
            temp_check_dependency_version_range_list = temp_check_info[3]
            # 直接依赖
            temp_detect_directly_dependency_info = temp_check_info[4]

            # if detect_dependency_name == "Microsoft.EntityFrameworkCore.Relational":
            #     print(temp_check_info)

            # ['System.Threading', '4.3.0', '2', ['[4.3.0, )']]
            # System.Threading
            # 4.3.0
            # 2
            # ['[4.3.0, )']
            # System.Threading [4.3.0, ) 6

            # 如果已安装的为直接依赖
            if temp_check_dependency_first_level == '0':

                # 待检测依赖版本
                # detect_dependency_version=matching_version.get_matching_version(detect_dependency_name,detect_dependency_version_range)
                # >> > semver.compare("1.0.0", "2.0.0") -1
                # >> > semver.compare("2.0.0", "1.0.0") 1
                # >> > semver.compare("2.0.0", "2.0.0") 0

                # 直接依赖版本较新时
                if semver.compare(detect_dependency_version,
                                  temp_check_dependency_install_version) == -1:
                    #验证直接依赖范围与间接依赖范围有无交集:
                    check_version = matching_version.check_verison_in_versionrange(
                        temp_check_dependency_install_version,
                        detect_dependency_version_range)
                    # 无交集
                    if check_version == "":
                        # print("*****************************************************************")
                        # print("error! NU1608 直接依赖版本高于间接依赖,但无交集",temp_check_dependency_name)
                        # print("直接版本:",temp_check_dependency_install_version)
                        # print("间接依赖范围:", detect_dependency_version_range)
                        # print("*****************************************************************")

                        # # 将NU1608视为warning
                        # irregularity_list.append(temp_check_dependency_name)

                        # # 将NU1608视为error,待检测依赖加入冲突队列:待检测依赖信息_调整的起始版本
                        # error_directly_dependency_list.append(detect_directly_dependency_info+"_"+temp_check_dependency_install_version)

                        # 将NU1608视为error,
                        if detect_directly_dependency_info in lock_dependencies_list:
                            # 已安装的依赖添加到冲突队列
                            error_directly_dependency_list.append(
                                temp_detect_directly_dependency_info)
                        else:
                            # 待检测依赖加入冲突队列:待检测依赖信息_调整的起始版本
                            error_directly_dependency_list.append(
                                detect_directly_dependency_info)

                    # 有交集
                    else:
                        pass

                # NU1605 直接依赖版本版本低于间接依赖,异常
                elif semver.compare(
                        detect_dependency_version,
                        temp_check_dependency_install_version) == 1:
                    # print("*****************************************************************")
                    # print("error! NU1605 直接依赖版本版本低于间接依赖",temp_check_dependency_name)
                    # print("直接版本:", temp_check_dependency_install_version)
                    # print("间接依赖范围:", detect_dependency_version_range)
                    # print("*****************************************************************")

                    # 已安装版本是否为锁定版本
                    if temp_detect_directly_dependency_info in lock_dependencies_list:
                        # 待安装的依赖添加到冲突队列
                        error_directly_dependency_list.append(
                            detect_directly_dependency_info)
                    else:
                        error_directly_dependency_list.append(
                            temp_detect_directly_dependency_info + "_" +
                            detect_dependency_version)

            # 如果已安装的为非直接依赖
            else:
                check_version = matching_version.check_verison_in_versionrange(
                    temp_check_dependency_install_version,
                    detect_dependency_version_range)
                # 已安装版本符合待检测范围:
                if check_version != "":
                    pass
                # 已安装版本不符合待检测版本范围:
                else:

                    # detect_dependency_version = matching_version.get_matching_version(detect_dependency_name,detect_dependency_version_range)
                    temp_check_ststus = 0
                    conflict_version_range_list = []
                    for temp_check_dependency_version_range in temp_check_dependency_version_range_list:
                        temp_check_version = matching_version.check_verison_in_versionrange(
                            detect_dependency_version,
                            temp_check_dependency_version_range)

                        # if detect_dependency_name == "Microsoft.EntityFrameworkCore.Relational":
                        #     print(detect_dependency_version,temp_check_dependency_version_range)
                        #     print(temp_check_version)

                        if temp_check_version == "":
                            temp_check_ststus = 1
                            conflict_version_range_list.append(
                                temp_check_dependency_version_range)
                    # 间接依赖之间无交集
                    if temp_check_ststus == 1:
                        # print("*****************************************************************")
                        # print("error! NU1107 间接依赖之间无交集", temp_check_dependency_name)
                        # print("已安装版本:", temp_check_dependency_install_version)
                        # print("待检测依赖范围:", detect_dependency_version_range)
                        # print("冲突间接依赖范围:", conflict_version_range_list)
                        # print("*****************************************************************")
                        #
                        # # 已安装版本: 5.0.3
                        # # 待检测依赖范围: [3.1.8, 5.0.0)
                        # # 冲突间接依赖范围: ['[5.0.3, )']
                        # print(detect_dependency_version, temp_check_dependency_install_version)

                        # 已安装版本是否为锁定版本
                        if temp_detect_directly_dependency_info in lock_dependencies_list:
                            # 待安装的依赖添加到冲突队列
                            error_directly_dependency_list.append(
                                detect_directly_dependency_info)

                        else:
                            # 已经安装的版本高,待安装的版本低
                            if semver.compare(
                                    detect_dependency_version,
                                    temp_check_dependency_install_version
                            ) == -1:
                                # 待安装的依赖添加到冲突队列
                                error_directly_dependency_list.append(
                                    detect_directly_dependency_info)
                            # 已经安装的版本低,待安装的版本高
                            else:
                                # 已经安装的依赖添加到冲突队列
                                error_directly_dependency_list.append(
                                    temp_detect_directly_dependency_info)

                    # 间接依赖之间有交集,更新安装版本
                    else:
                        for i_num in range(len(install_dependencies_list)):
                            # ['Microsoft.Extensions.Primitives', '5.0.0', '3', ['[3.0.0, )', '[5.0.0, )'], 'Microsoft.EntityFrameworkCore.SqlServer$5.0.3', '.NETCoreApp3.0']
                            if install_dependencies_list[i_num][
                                    0] == detect_dependency_name:
                                install_dependencies_list[i_num][
                                    1] = detect_dependency_version
                                install_dependencies_list[i_num][3].append(
                                    detect_dependency_version_range)
                                install_dependencies_list[i_num][4] = (
                                    detect_directly_dependency_info)
                                install_dependencies_list[i_num][5] = (
                                    matched_framework)

                        # 新版依赖关系添加到待检测队列
                        append_waiting_detect_dependencies_list(
                            detect_directly_dependency_info,
                            detect_dependency_name, detect_dependency_version,
                            detect_dependency_level, matched_framework,
                            commitTimeStamp)