support for per-partition fs_type (do not merge)
Include the recovery.fstab file in the recovery image. Remove the global fs_type and partition_type values from the target-files key/value dict, and parse the recovery.fstab file instead to find types for each partition. Change-Id: I35ee2dd0989441dc2a704b63c1b32e598049acb5
This commit is contained in:
@@ -21,6 +21,9 @@ class EdifyGenerator(object):
|
||||
"""Class to generate scripts in the 'edify' recovery script language
|
||||
used from donut onwards."""
|
||||
|
||||
# map recovery.fstab's fs_types to mount/format "partition types"
|
||||
PARTITION_TYPES = { "yaffs2": "MTD", "mtd": "MTD", "ext4": "EMMC" }
|
||||
|
||||
def __init__(self, version, info):
|
||||
self.script = []
|
||||
self.mounts = set()
|
||||
@@ -131,15 +134,22 @@ class EdifyGenerator(object):
|
||||
available on /cache."""
|
||||
self.script.append("assert(apply_patch_space(%d));" % (amount,))
|
||||
|
||||
def Mount(self, what, mount_point):
|
||||
"""Mount the given 'what' at the given path. 'what' should be a
|
||||
partition name for an MTD partition, or a block device for
|
||||
anything else."""
|
||||
what = self.info.get("partition_path", "") + what
|
||||
self.script.append('mount("%s", "%s", "%s", "%s");' %
|
||||
(self.info["fs_type"], self.info["partition_type"],
|
||||
what, mount_point))
|
||||
self.mounts.add(mount_point)
|
||||
def Mount(self, mount_point):
|
||||
"""Mount the partition with the given mount_point."""
|
||||
fstab = self.info.get("fstab", None)
|
||||
if fstab:
|
||||
p = fstab[mount_point]
|
||||
self.script.append('mount("%s", "%s", "%s", "%s");' %
|
||||
(p.fs_type, self.PARTITION_TYPES[p.fs_type],
|
||||
p.device, p.mount_point))
|
||||
self.mounts.add(p.mount_point)
|
||||
else:
|
||||
what = mount_point.lstrip("/")
|
||||
what = self.info.get("partition_path", "") + what
|
||||
self.script.append('mount("%s", "%s", "%s", "%s");' %
|
||||
(self.info["fs_type"], self.info["partition_type"],
|
||||
what, mount_point))
|
||||
self.mounts.add(mount_point)
|
||||
|
||||
def UnpackPackageDir(self, src, dst):
|
||||
"""Unpack a given directory from the OTA package into the given
|
||||
@@ -158,11 +168,20 @@ class EdifyGenerator(object):
|
||||
self.script.append('ui_print("%s");' % (message,))
|
||||
|
||||
def FormatPartition(self, partition):
|
||||
"""Format the given partition."""
|
||||
partition = self.info.get("partition_path", "") + partition
|
||||
self.script.append('format("%s", "%s", "%s");' %
|
||||
(self.info["fs_type"], self.info["partition_type"],
|
||||
partition))
|
||||
"""Format the given partition, specified by its mount point (eg,
|
||||
"/system")."""
|
||||
|
||||
fstab = self.info.get("fstab", None)
|
||||
if fstab:
|
||||
p = fstab[partition]
|
||||
self.script.append('format("%s", "%s", "%s");' %
|
||||
(p.fs_type, self.PARTITION_TYPES[p.fs_type], p.device))
|
||||
else:
|
||||
# older target-files without per-partition types
|
||||
partition = self.info.get("partition_path", "") + partition
|
||||
self.script.append('format("%s", "%s", "%s");' %
|
||||
(self.info["fs_type"], self.info["partition_type"],
|
||||
partition))
|
||||
|
||||
def DeleteFiles(self, file_list):
|
||||
"""Delete all files in file_list."""
|
||||
@@ -196,24 +215,42 @@ class EdifyGenerator(object):
|
||||
self.script.append(
|
||||
'write_firmware_image("PACKAGE:%s", "%s");' % (fn, kind))
|
||||
|
||||
def WriteRawImage(self, partition, fn):
|
||||
"""Write the given package file into the given partition."""
|
||||
def WriteRawImage(self, mount_point, fn):
|
||||
"""Write the given package file into the partition for the given
|
||||
mount point."""
|
||||
|
||||
if self.info["partition_type"] == "MTD":
|
||||
self.script.append(
|
||||
('assert(package_extract_file("%(fn)s", "/tmp/%(partition)s.img"),\n'
|
||||
' write_raw_image("/tmp/%(partition)s.img", "%(partition)s"),\n'
|
||||
' delete("/tmp/%(partition)s.img"));')
|
||||
% {'partition': partition, 'fn': fn})
|
||||
elif self.info["partition_type"] == "EMMC":
|
||||
self.script.append(
|
||||
('package_extract_file("%(fn)s", "%(dir)s%(partition)s");')
|
||||
% {'partition': partition, 'fn': fn,
|
||||
'dir': self.info.get("partition_path", ""),
|
||||
})
|
||||
fstab = self.info["fstab"]
|
||||
if fstab:
|
||||
p = fstab[mount_point]
|
||||
partition_type = self.PARTITION_TYPES[p.fs_type]
|
||||
args = {'device': p.device, 'fn': fn}
|
||||
if partition_type == "MTD":
|
||||
self.script.append(
|
||||
('assert(package_extract_file("%(fn)s", "/tmp/%(device)s.img"),\n'
|
||||
' write_raw_image("/tmp/%(device)s.img", "%(device)s"),\n'
|
||||
' delete("/tmp/%(device)s.img"));') % args)
|
||||
elif partition_type == "EMMC":
|
||||
self.script.append(
|
||||
'package_extract_file("%(fn)s", "%(device)s");' % args)
|
||||
else:
|
||||
raise ValueError("don't know how to write \"%s\" partitions" % (p.fs_type,))
|
||||
else:
|
||||
raise ValueError("don't know how to write \"%s\" partitions" %
|
||||
(self.info["partition_type"],))
|
||||
# backward compatibility with older target-files that lack recovery.fstab
|
||||
if self.info["partition_type"] == "MTD":
|
||||
self.script.append(
|
||||
('assert(package_extract_file("%(fn)s", "/tmp/%(partition)s.img"),\n'
|
||||
' write_raw_image("/tmp/%(partition)s.img", "%(partition)s"),\n'
|
||||
' delete("/tmp/%(partition)s.img"));')
|
||||
% {'partition': partition, 'fn': fn})
|
||||
elif self.info["partition_type"] == "EMMC":
|
||||
self.script.append(
|
||||
('package_extract_file("%(fn)s", "%(dir)s%(partition)s");')
|
||||
% {'partition': partition, 'fn': fn,
|
||||
'dir': self.info.get("partition_path", ""),
|
||||
})
|
||||
else:
|
||||
raise ValueError("don't know how to write \"%s\" partitions" %
|
||||
(self.info["partition_type"],))
|
||||
|
||||
def SetPermissions(self, fn, uid, gid, mode):
|
||||
"""Set file ownership and permissions."""
|
||||
|
Reference in New Issue
Block a user