107 lines
3.3 KiB
Python
Executable File
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)
|
|
|