nt9856x/build/nvt-tools/publish.py
2023-03-28 15:07:53 +08:00

107 lines
3.3 KiB
Python
Executable File

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import sys
import os
import json
import argparse
import posixpath
from collections import OrderedDict
def dbg_err(msg):
print(msg, file=sys.stderr)
def parse_args(argv):
parser = argparse.ArgumentParser(description='module publish')
parser.add_argument('-j', '--json',metavar='.json', required=True,
dest='json', action='store',
help='json file')
parser.add_argument('-s', '--src',
action="store_true",
help='remove non published source files')
args = parser.parse_args()
return args
def load_json(json_path):
if not os.path.isfile(json_path):
print("cannot find {}".format(json_path), file=sys.stderr)
return None
with open(json_path, encoding="utf-8", errors='ignore') as file:
cfg = json.load(file, object_pairs_hook=OrderedDict)
if cfg["jsontype"] != "module_publish":
logging.error("this json file is not for this application.")
return None
return cfg
return None
def remove_source(json_cfg, root_dir):
# speical case to keep all source
if len(json_cfg["publish_src"]) > 0 and json_cfg["publish_src"][0] == '*':
return 0
publish_src = []
if len(root_dir) == 0:
root_dir = "."
# remove "./" e.g: ./abc/xxx.c => abc/xxx.c
for src in json_cfg["publish_src"]:
publish_src.append(src.replace("./", ""))
skip_root = "skip_root" # for subdir has publish.json, we skip this subfolder and it's recursive one
for root, dirs, files in os.walk(root_dir):
if skip_root in root:
continue
if root!=root_dir and "publish.json" in files:
skip_root = root
continue
for file in files:
main_name, ext_name = os.path.splitext(file)
if ext_name == ".c" or ext_name == ".cpp":
keep_file = False
fullpath = os.path.join(root, file)
# use relative_path to compare publish.json
relative_path = posixpath.join(os.path.relpath(root, root_dir), file).replace("./", "")
for src in publish_src:
if src == relative_path:
keep_file = True
break
if keep_file:
print("keep {}".format(relative_path))
else:
print("remove {}".format(relative_path))
os.remove(fullpath)
return 0
def main(argv):
if 0:
argv.append(r"-s")
argv.append(r"-j")
argv.append(r"Z:\firmware\na51055_dual_sdk\na51055_linux_sdk\base\hdal\drivers\k_driver\source\comm\publish.json")
args = parse_args(argv)
try:
json_cfg = load_json(args.json)
except json.decoder.JSONDecodeError as exp:
print("unable to parse " + args.json)
print(exp)
return -1
if json_cfg is None:
return -1
root_dir = os.path.dirname(args.json)
if remove_source(json_cfg, root_dir) != 0:
return -1
return 0
if __name__ == '__main__':
try:
er = main(sys.argv)
except Exception as exp:
er = -1
print(exp, file=sys.stderr)
raise exp
sys.exit(er)