xref: /aosp_15_r20/external/autotest/autotest_lib/utils/Python2MigrationFinder.py (revision 9c5db1993ded3edbeafc8092d69fe5de2ee02df7)
1*9c5db199SXin Li#!/usr/bin/python3
2*9c5db199SXin Li
3*9c5db199SXin Liimport os
4*9c5db199SXin Li
5*9c5db199SXin Li
6*9c5db199SXin Lidef has_match(line):
7*9c5db199SXin Li    """check if file current line matches py3_strs.
8*9c5db199SXin Li
9*9c5db199SXin Li    Args:
10*9c5db199SXin Li            line: Current line to check.
11*9c5db199SXin Li
12*9c5db199SXin Li    return:
13*9c5db199SXin Li            Boolean True or False.
14*9c5db199SXin Li    """
15*9c5db199SXin Li    py3_strs = [
16*9c5db199SXin Li            "#!/usr/bin/python3", "#!/usr/bin/env python3",
17*9c5db199SXin Li            "# lint as: python2, python3", "# lint as: python3"
18*9c5db199SXin Li    ]
19*9c5db199SXin Li    for match in py3_strs:
20*9c5db199SXin Li        if match in line:
21*9c5db199SXin Li            return True
22*9c5db199SXin Li    return False
23*9c5db199SXin Li
24*9c5db199SXin Li
25*9c5db199SXin Lidef need_to_skip(fullname):
26*9c5db199SXin Li    """check if this file or folder that needs to be skipped from skip_strs.
27*9c5db199SXin Li
28*9c5db199SXin Li    Args:
29*9c5db199SXin Li            fullname: Current file or folder name.
30*9c5db199SXin Li
31*9c5db199SXin Li    return:
32*9c5db199SXin Li            Boolean True or False.
33*9c5db199SXin Li    """
34*9c5db199SXin Li    skip_strs = ["__init__.py", "autotest_lib", "common.py", "site_tests"]
35*9c5db199SXin Li    for match in skip_strs:
36*9c5db199SXin Li        if match in fullname:
37*9c5db199SXin Li            return True
38*9c5db199SXin Li    return False
39*9c5db199SXin Li
40*9c5db199SXin Li
41*9c5db199SXin Lidef list_files_to_txt(upper_dir, file, suffix, nums_line_to_check):
42*9c5db199SXin Li    """List results to .txt file by check all target files.
43*9c5db199SXin Li    under the folder and subfolder.
44*9c5db199SXin Li
45*9c5db199SXin Li    Args:
46*9c5db199SXin Li            upper_dir: The folder path need to check. The default.
47*9c5db199SXin Li                    is the ipper path of this script.
48*9c5db199SXin Li            file: output .txt file. The default is Python2MigrationTarget.txt.
49*9c5db199SXin Li            suffix: File extensions that need to be checked.
50*9c5db199SXin Li            nums_line_to_check: The number of rows to check.
51*9c5db199SXin Li
52*9c5db199SXin Li    return:
53*9c5db199SXin Li            All file names and paths that meet the standard.
54*9c5db199SXin Li    """
55*9c5db199SXin Li    exts = suffix.split(" ")
56*9c5db199SXin Li    files = os.listdir(upper_dir)
57*9c5db199SXin Li    for filename in files:
58*9c5db199SXin Li        fullname = os.path.join(upper_dir, filename)
59*9c5db199SXin Li        if need_to_skip(fullname):
60*9c5db199SXin Li            continue
61*9c5db199SXin Li        if os.path.isdir(fullname):
62*9c5db199SXin Li            list_files_to_txt(fullname, file, suffix, nums_line_to_check)
63*9c5db199SXin Li        else:
64*9c5db199SXin Li            for ext in exts:
65*9c5db199SXin Li                if filename.endswith(ext):
66*9c5db199SXin Li                    filename = fullname
67*9c5db199SXin Li                    with open(filename, "r") as f:
68*9c5db199SXin Li                        for i in range(nums_line_to_check):
69*9c5db199SXin Li                            line = str(f.readline().strip()).lower()
70*9c5db199SXin Li                            if has_match(line):
71*9c5db199SXin Li                                tail = filename.split("third_party")[-1]
72*9c5db199SXin Li                                file.write("%s, 3\n" % tail)
73*9c5db199SXin Li                            else:
74*9c5db199SXin Li                                tail = filename.split("third_party")[-1]
75*9c5db199SXin Li                                file.write("%s, 2\n" % tail)
76*9c5db199SXin Li                            break
77*9c5db199SXin Li
78*9c5db199SXin Li
79*9c5db199SXin Lidef main():
80*9c5db199SXin Li    """This is main function"""
81*9c5db199SXin Li    upper_dir = os.path.abspath(
82*9c5db199SXin Li            os.path.join(os.path.dirname("__file__"), os.path.pardir))
83*9c5db199SXin Li    outfile = "Python2MigrationTarget.txt"
84*9c5db199SXin Li    suffix = ".py"
85*9c5db199SXin Li    nums_line_to_check = 20
86*9c5db199SXin Li    file = open(outfile, "w")
87*9c5db199SXin Li    if not file:
88*9c5db199SXin Li        print("cannot open the file %s " % outfile)
89*9c5db199SXin Li    list_files_to_txt(upper_dir, file, suffix, nums_line_to_check)
90*9c5db199SXin Li    file.close()
91*9c5db199SXin Li
92*9c5db199SXin Li
93*9c5db199SXin Liif __name__ == "__main__":
94*9c5db199SXin Li
95*9c5db199SXin Li    main()
96