• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
3 # Copyright (c) 2021 Huawei Device Co., Ltd.
4 # Licensed under the Apache License, Version 2.0 (the "License");
5 # you may not use this file except in compliance with the License.
6 # You may obtain a copy of the License at
7 #
8 #     http://www.apache.org/licenses/LICENSE-2.0
9 #
10 # Unless required by applicable law or agreed to in writing, software
11 # distributed under the License is distributed on an "AS IS" BASIS,
12 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 # See the License for the specific language governing permissions and
14 # limitations under the License.
15 
16 import json
17 import os
18 import subprocess
19 import hashlib
20 import platform
21 
22 
23 def find_top():
24     cur_dir = os.getcwd()
25     while cur_dir != "/":
26         build_config_file = os.path.join(
27             cur_dir, 'build/config/BUILDCONFIG.gn')
28         if os.path.exists(build_config_file):
29             return cur_dir
30         cur_dir = os.path.dirname(cur_dir)
31 
32 # Read json file data
33 def read_json_file(input_file):
34     if not os.path.exists(input_file):
35         print("file '{}' doesn't exist.".format(input_file))
36         return None
37 
38     data = None
39     try:
40         with open(input_file, 'r') as input_f:
41             data = json.load(input_f)
42     except json.decoder.JSONDecodeError:
43         print("The file '{}' format is incorrect.".format(input_file))
44         raise
45     except:  # noqa E722
46         print("read file '{}' failed.".format(input_file))
47         raise
48     return data
49 
50 
51 # Read file by line
52 def read_file(input_file):
53     if not os.path.exists(input_file):
54         print("file '{}' doesn't exist.".format(input_file))
55         return None
56 
57     data = []
58     try:
59         with open(input_file, 'r') as file_obj:
60             for line in file_obj.readlines():
61                 data.append(line.rstrip('\n'))
62     except:  # noqa E722
63         print("read file '{}' failed".format(input_file))
64         raise
65     return data
66 
67 
68 # Write json file data
69 def write_json_file(output_file, content, check_changes=False):
70     file_dir = os.path.dirname(os.path.abspath(output_file))
71     if not os.path.exists(file_dir):
72         os.makedirs(file_dir, exist_ok=True)
73 
74     if check_changes is True:
75         changed = __check_changes(output_file, content)
76     else:
77         changed = True
78     if changed is True:
79         with open(output_file, 'w') as output_f:
80             json.dump(content, output_f, sort_keys=True, indent=2)
81 
82 
83 def __check_changes(output_file, content):
84     if os.path.exists(output_file) and os.path.isfile(output_file):
85         # file content md5 val
86         sha256_obj = hashlib.sha256()
87         sha256_obj.update(str(read_json_file(output_file)).encode())
88         hash_value = sha256_obj.hexdigest()
89         # new content md5 val
90         sha256_obj_new = hashlib.sha256()
91         sha256_obj_new.update(str(content).encode())
92         hash_value_new = sha256_obj_new.hexdigest()
93         if hash_value_new == hash_value:
94             return False
95     return True
96 
97 
98 # Write file data
99 def write_file(output_file, content):
100     code_dir = find_top()
101     os_name= platform.system().lower()
102     gn_exe = os.path.join(code_dir, f'prebuilts/build-tools/{os_name}-x86/bin/gn')
103     file_dir = os.path.dirname(os.path.abspath(output_file))
104     if not os.path.exists(file_dir):
105         os.makedirs(file_dir, exist_ok=True)
106 
107     with open(output_file, 'w') as output_f:
108         output_f.write(content)
109     if output_file.endswith('.gni') or output_file.endswith('.gn'):
110         # Call gn format to make the output gn file prettier.
111         cmd = [gn_exe, 'format']
112         cmd.append(output_file)
113         subprocess.check_output(cmd)
114