1b6a906aeSopenharmony_ci#!/usr/bin/env python
2b6a906aeSopenharmony_ci# -*- coding: utf-8 -*-
3b6a906aeSopenharmony_ci# Copyright (c) 2023 Huawei Device Co., Ltd.
4b6a906aeSopenharmony_ci# Licensed under the Apache License, Version 2.0 (the "License");
5b6a906aeSopenharmony_ci# you may not use this file except in compliance with the License.
6b6a906aeSopenharmony_ci# You may obtain a copy of the License at
7b6a906aeSopenharmony_ci#
8b6a906aeSopenharmony_ci#     http://www.apache.org/licenses/LICENSE-2.0
9b6a906aeSopenharmony_ci#
10b6a906aeSopenharmony_ci# Unless required by applicable law or agreed to in writing, software
11b6a906aeSopenharmony_ci# distributed under the License is distributed on an "AS IS" BASIS,
12b6a906aeSopenharmony_ci# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b6a906aeSopenharmony_ci# See the License for the specific language governing permissions and
14b6a906aeSopenharmony_ci# limitations under the License.
15b6a906aeSopenharmony_ci
16b6a906aeSopenharmony_ciimport argparse
17b6a906aeSopenharmony_ciimport os
18b6a906aeSopenharmony_ciimport subprocess
19b6a906aeSopenharmony_ciimport sys
20b6a906aeSopenharmony_ci
21b6a906aeSopenharmony_ci
22b6a906aeSopenharmony_cidef untar_file(tar_file_path, extract_path, args):
23b6a906aeSopenharmony_ci    try:
24b6a906aeSopenharmony_ci        if os.path.exists(extract_path):
25b6a906aeSopenharmony_ci            rm_cmd = ['rm', '-rf', extract_path]
26b6a906aeSopenharmony_ci            subprocess.run(rm_cmd, check=True)
27b6a906aeSopenharmony_ci
28b6a906aeSopenharmony_ci        tar_cmd = ['tar', '-zxvf', tar_file_path, '-C', args.gen_dir]
29b6a906aeSopenharmony_ci        subprocess.run(tar_cmd, check=True)
30b6a906aeSopenharmony_ci
31b6a906aeSopenharmony_ci    except Exception as e:
32b6a906aeSopenharmony_ci        print("tar error!")
33b6a906aeSopenharmony_ci        return
34b6a906aeSopenharmony_ci
35b6a906aeSopenharmony_ci
36b6a906aeSopenharmony_cidef apply_patch(patch_file, target_dir):
37b6a906aeSopenharmony_ci    try:
38b6a906aeSopenharmony_ci        if not os.path.exists(target_dir):
39b6a906aeSopenharmony_ci            return
40b6a906aeSopenharmony_ci
41b6a906aeSopenharmony_ci        patch_cmd = ['patch', '-p1', "--fuzz=0", "--no-backup-if-mismatch", '-i', patch_file, '-d', target_dir]
42b6a906aeSopenharmony_ci        subprocess.run(patch_cmd, check=True)
43b6a906aeSopenharmony_ci
44b6a906aeSopenharmony_ci    except Exception as e:
45b6a906aeSopenharmony_ci        print("apply_patch error!")
46b6a906aeSopenharmony_ci        return
47b6a906aeSopenharmony_ci
48b6a906aeSopenharmony_ci
49b6a906aeSopenharmony_cidef do_patch(args, target_dir):
50b6a906aeSopenharmony_ci    patch_file = [
51b6a906aeSopenharmony_ci        "Fix error whenparses the value of 5E-324 with libc++.patch",
52b6a906aeSopenharmony_ci        "0001-Parse-large-floats-as-infinity-1349-1353.patch",
53b6a906aeSopenharmony_ci        "0001-Use-default-rather-than-hard-coded-8-for-maximum-agg.patch",
54b6a906aeSopenharmony_ci        "Fix out-of-bounds read.patch"
55b6a906aeSopenharmony_ci    ]
56b6a906aeSopenharmony_ci
57b6a906aeSopenharmony_ci    for patch in patch_file:
58b6a906aeSopenharmony_ci        file_path = os.path.join(args.source_file, patch)
59b6a906aeSopenharmony_ci        apply_patch(file_path, target_dir)
60b6a906aeSopenharmony_ci
61b6a906aeSopenharmony_ci
62b6a906aeSopenharmony_cidef main():
63b6a906aeSopenharmony_ci    libpng_path = argparse.ArgumentParser()
64b6a906aeSopenharmony_ci    libpng_path.add_argument('--gen-dir', help='generate path of jsoncpp')
65b6a906aeSopenharmony_ci    libpng_path.add_argument('--source-file', help='jsoncpp source compressed dir')
66b6a906aeSopenharmony_ci    args = libpng_path.parse_args()
67b6a906aeSopenharmony_ci    tar_file_path = os.path.join(args.source_file, "jsoncpp-1.9.5.tar.gz")
68b6a906aeSopenharmony_ci    target_dir = os.path.join(args.gen_dir, "jsoncpp-1.9.5")
69b6a906aeSopenharmony_ci    untar_file(tar_file_path, target_dir, args)
70b6a906aeSopenharmony_ci    do_patch(args, target_dir)
71b6a906aeSopenharmony_ci    return 0
72b6a906aeSopenharmony_ci
73b6a906aeSopenharmony_ci
74b6a906aeSopenharmony_ciif __name__ == '__main__':
75b6a906aeSopenharmony_ci    sys.exit(main())
76