diff options
Diffstat (limited to 'tools')
-rwxr-xr-x | tools/releasetools/build_image.py | 40 |
1 files changed, 36 insertions, 4 deletions
diff --git a/tools/releasetools/build_image.py b/tools/releasetools/build_image.py index a615d1a..94a9fda 100755 --- a/tools/releasetools/build_image.py +++ b/tools/releasetools/build_image.py @@ -21,9 +21,22 @@ Usage: build_image input_directory properties_file output_image_file """ import os +import os.path import subprocess import sys +def RunCommand(cmd): + """ Echo and run the given command + + Args: + cmd: the command represented as a list of strings. + Returns: + The exit code. + """ + print "Running: ", " ".join(cmd) + p = subprocess.Popen(cmd) + p.communicate() + return p.returncode def BuildImage(in_dir, prop_dict, out_file): """Build an image to out_file from in_dir with property prop_dict. @@ -38,10 +51,12 @@ def BuildImage(in_dir, prop_dict, out_file): """ build_command = [] fs_type = prop_dict.get("fs_type", "") + run_fsck = False if fs_type.startswith("ext"): build_command = ["mkuserimg.sh"] if "extfs_sparse_flag" in prop_dict: build_command.append(prop_dict["extfs_sparse_flag"]) + run_fsck = True build_command.extend([in_dir, out_file, fs_type, prop_dict["mount_point"]]) if "partition_size" in prop_dict: @@ -58,10 +73,27 @@ def BuildImage(in_dir, prop_dict, out_file): build_command.append(prop_dict["selinux_fc"]) build_command.append(prop_dict["mount_point"]) - print "Running: ", " ".join(build_command) - p = subprocess.Popen(build_command); - p.communicate() - return p.returncode == 0 + exit_code = RunCommand(build_command) + if exit_code != 0: + return False + + if run_fsck: + # Inflate the sparse image + unsparse_image = os.path.join( + os.path.dirname(out_file), "unsparse_" + os.path.basename(out_file)) + inflate_command = ["simg2img", out_file, unsparse_image] + exit_code = RunCommand(inflate_command) + if exit_code != 0: + os.remove(unsparse_image) + return False + + # Run e2fsck on the inflated image file + e2fsck_command = ["e2fsck", "-f", "-n", unsparse_image] + exit_code = RunCommand(e2fsck_command) + + os.remove(unsparse_image) + + return exit_code == 0 def ImagePropFromGlobalDict(glob_dict, mount_point): |