[FL-2481] Renamed assets->resources; enforcing Manifest build if it does not exist (#1135)

* Renamed assets->resources; enforcing Manifest build if it does not exist
* Rebuild resources from CI
* Added Manifest to repo - be sure to rebuild it with `make -C assets` before committing changes!
* Actually added Manifest.
* Keeping Manifest on assets clean
* Spelling fix in Makefile
This commit is contained in:
hedger
2022-04-19 22:02:37 +03:00
committed by GitHub
parent 956788c09b
commit 57312961e8
17 changed files with 343 additions and 68 deletions

View File

@@ -203,15 +203,12 @@ class Main(App):
manifest_file = os.path.join(directory_path, "Manifest")
old_manifest = Manifest()
if os.path.exists(manifest_file):
self.logger.info(
f"old manifest is present, loading for compare and removing file"
)
self.logger.info("old manifest is present, loading for compare")
old_manifest.load(manifest_file)
os.unlink(manifest_file)
self.logger.info(f'Creating new Manifest for directory "{directory_path}"')
new_manifest = Manifest()
new_manifest.create(directory_path)
new_manifest.save(manifest_file)
self.logger.info(f"Comparing new manifest with old")
only_in_old, changed, only_in_new = Manifest.compare(old_manifest, new_manifest)
for record in only_in_old:
@@ -220,6 +217,12 @@ class Main(App):
self.logger.info(f"Changed: {record}")
for record in only_in_new:
self.logger.info(f"Only in new: {record}")
if any((only_in_old, changed, only_in_new)):
self.logger.warning("Manifests are different, updating")
new_manifest.save(manifest_file)
else:
self.logger.info("Manifest is up-to-date!")
self.logger.info(f"Complete")
return 0

View File

@@ -18,7 +18,7 @@ class Main(App):
self.parser_copy.add_argument("-t", dest="target", required=True)
self.parser_copy.add_argument("-p", dest="projects", nargs="+", required=True)
self.parser_copy.add_argument("-s", dest="suffix", required=True)
self.parser_copy.add_argument("-a", dest="assets", required=False)
self.parser_copy.add_argument("-r", dest="resources", required=False)
self.parser_copy.add_argument(
"--bundlever",
dest="version",
@@ -79,16 +79,16 @@ class Main(App):
self.args.version,
"-t",
self.args.target,
"-dfu",
"--dfu",
self.get_dist_filepath(self.get_project_filename("firmware", "dfu")),
"-stage",
"--stage",
self.get_dist_filepath(self.get_project_filename("updater", "bin")),
]
if self.args.assets:
if self.args.resources:
bundle_args.extend(
(
"-a",
self.args.assets,
"-r",
self.args.resources,
)
)
self.logger.info(

View File

@@ -8,7 +8,7 @@ import os
from flipper.app import App
from flipper.cube import CubeProgrammer
STATEMENT = "AGREE_TO_LOOSE_FLIPPER_FEATURES_THAT_USES_CRYPTO_ENCLAVE"
STATEMENT = "AGREE_TO_LOSE_FLIPPER_FEATURES_THAT_USE_CRYPTO_ENCLAVE"
class Main(App):

View File

@@ -18,10 +18,10 @@ class ManifestRecord:
def toLine(self):
raise NotImplementedError
def _unpack(self, manifest, key, type):
def _unpack(self, manifest, key, nodetype):
key, value = manifest.readline().split(":", 1)
assert key == key
return type(value)
return nodetype(value)
MANIFEST_TAGS_RECORDS = {}
@@ -94,7 +94,7 @@ class ManifestRecordFile(ManifestRecord):
@staticmethod
def fromLine(line):
data = line.split(":", 3)
return ManifestRecordFile(data[2], data[0], data[1])
return ManifestRecordFile(data[2], data[0], int(data[1]))
def toLine(self):
return f"{self.tag}:{self.md5}:{self.size}:{self.path}\n"
@@ -133,7 +133,7 @@ class Manifest:
def addFile(self, path, md5, size):
self.records.append(ManifestRecordFile(path, md5, size))
def create(self, directory_path):
def create(self, directory_path, ignore_files=["Manifest"]):
for root, dirs, files in os.walk(directory_path):
relative_root = root.replace(directory_path, "", 1)
if relative_root.startswith("/"):
@@ -141,13 +141,16 @@ class Manifest:
# process directories
for dir in dirs:
relative_dir_path = os.path.join(relative_root, dir)
self.logger.info(f'Adding directory: "{relative_dir_path}"')
self.logger.debug(f'Adding directory: "{relative_dir_path}"')
self.addDirectory(relative_dir_path)
# Process files
for file in files:
relative_file_path = os.path.join(relative_root, file)
if file in ignore_files:
self.logger.info(f'Skipping file "{relative_file_path}"')
continue
full_file_path = os.path.join(root, file)
self.logger.info(f'Adding file: "{relative_file_path}"')
self.logger.debug(f'Adding file: "{relative_file_path}"')
self.addFile(
relative_file_path,
file_md5(full_file_path),
@@ -155,7 +158,7 @@ class Manifest:
)
def toFsTree(self):
root = FsNode("", FsNode.Type.Directory)
root = FsNode("", FsNode.NodeType.Directory)
for record in self.records:
if isinstance(record, ManifestRecordDirectory):
root.addDirectory(record.path)

View File

@@ -3,13 +3,13 @@ from collections import OrderedDict
class FsNode:
class Type(Enum):
class NodeType(Enum):
File = 0
Directory = 1
def __init__(self, name: str, type: "FsNode.Type", **kwargs):
def __init__(self, name: str, nodetype: "FsNode.Type", **kwargs):
self.name = name
self.type = type
self.nodetype = nodetype
self.data = kwargs
self.parent = None
self.children = OrderedDict()
@@ -25,7 +25,7 @@ class FsNode:
parent_node = self.traverse(fragments)
if not parent_node:
raise Exception(f"No parent node found for: {path}")
parent_node.addChild(FsNode(name, FsNode.Type.Directory))
parent_node.addChild(FsNode(name, FsNode.NodeType.Directory))
def addFile(self, path, md5, size):
fragments = path.split("/")
@@ -34,7 +34,7 @@ class FsNode:
parent_node = self.traverse(fragments)
if not parent_node:
raise Exception(f"No parent node found for: {path}")
parent_node.addChild(FsNode(name, FsNode.Type.File, md5=md5, size=size))
parent_node.addChild(FsNode(name, FsNode.NodeType.File, md5=md5, size=size))
def getChild(self, name):
return self.children[name]
@@ -58,19 +58,37 @@ class FsNode:
def dump(self):
ret = {}
ret["name"] = (self.name,)
ret["type"] = (self.type,)
ret["type"] = (self.nodetype,)
ret["path"] = (self.getPath(),)
if len(self.children):
ret["children"] = [node.dump() for node in self.children.values()]
return ret
def walk_nodes(node: FsNode):
yield node
for child in node.children.values():
yield from walk_nodes(child)
# Returns filenames: [only_in_left], [changed], [only_in_right]
def compare_fs_trees(left: FsNode, right: FsNode):
# import pprint
# pprint.pprint(left.dump())
# pprint.pprint(right.dump())
left_dict = dict((node.getPath(), node) for node in walk_nodes(left))
right_dict = dict((node.getPath(), node) for node in walk_nodes(right))
only_in_left = []
changed = []
only_in_right = []
return [], [], []
left_names = set(left_dict.keys())
right_names = set(right_dict.keys())
common_names = left_names.intersection(right_names)
return (
list(left_names - right_names),
list(
name
for name in common_names
if left_dict[name].data != right_dict[name].data
),
list(right_names - left_names),
)

View File

@@ -10,8 +10,12 @@ import tarfile
class Main(App):
UPDATE_MANIFEST_NAME = "update.fuf"
# No compression, plain tar
ASSET_TAR_MODE = "w:"
RESOURCE_TAR_MODE = "w:"
RESOURCE_TAR_FORMAT = tarfile.USTAR_FORMAT
RESOURCE_FILE_NAME = "resources.tar"
def init(self):
self.subparsers = self.parser.add_subparsers(help="sub-command help")
@@ -24,17 +28,17 @@ class Main(App):
self.parser_generate.add_argument("-d", dest="directory", required=True)
self.parser_generate.add_argument("-v", dest="version", required=True)
self.parser_generate.add_argument("-t", dest="target", required=True)
self.parser_generate.add_argument("-dfu", dest="dfu", required=False)
self.parser_generate.add_argument("-a", dest="assets", required=False)
self.parser_generate.add_argument("-stage", dest="stage", required=True)
self.parser_generate.add_argument("--dfu", dest="dfu", required=False)
self.parser_generate.add_argument("-r", dest="resources", required=False)
self.parser_generate.add_argument("--stage", dest="stage", required=True)
self.parser_generate.add_argument(
"-radio", dest="radiobin", default="", required=False
"--radio", dest="radiobin", default="", required=False
)
self.parser_generate.add_argument(
"-radioaddr", dest="radioaddr", required=False
"--radioaddr", dest="radioaddr", required=False
)
self.parser_generate.add_argument(
"-radiover", dest="radioversion", required=False
"--radiover", dest="radioversion", required=False
)
self.parser_generate.set_defaults(func=self.generate)
@@ -43,7 +47,7 @@ class Main(App):
stage_basename = basename(self.args.stage)
dfu_basename = basename(self.args.dfu)
radiobin_basename = basename(self.args.radiobin)
assets_basename = ""
resources_basename = ""
if not exists(self.args.directory):
os.makedirs(self.args.directory)
@@ -54,10 +58,10 @@ class Main(App):
shutil.copyfile(
self.args.radiobin, join(self.args.directory, radiobin_basename)
)
if self.args.assets:
assets_basename = "assets.tar"
self.package_assets(
self.args.assets, join(self.args.directory, assets_basename)
if self.args.resources:
resources_basename = self.RESOURCE_FILE_NAME
self.package_resources(
self.args.resources, join(self.args.directory, resources_basename)
)
file = FlipperFormatFile()
@@ -75,14 +79,14 @@ class Main(App):
file.writeKey("Radio CRC", self.int2ffhex(self.crc(self.args.radiobin)))
else:
file.writeKey("Radio CRC", self.int2ffhex(0))
file.writeKey("Assets", assets_basename)
file.save(join(self.args.directory, "update.fuf"))
file.writeKey("Resources", resources_basename)
file.save(join(self.args.directory, self.UPDATE_MANIFEST_NAME))
return 0
def package_assets(self, srcdir: str, dst_name: str):
def package_resources(self, srcdir: str, dst_name: str):
with tarfile.open(
dst_name, self.ASSET_TAR_MODE, format=tarfile.USTAR_FORMAT
dst_name, self.RESOURCE_TAR_MODE, format=self.RESOURCE_TAR_FORMAT
) as tarball:
tarball.add(srcdir, arcname="")