Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 36f81635 authored by Daniel Norman's avatar Daniel Norman Committed by android-build-merger
Browse files

Merge "Clean up merge_target_files.py."

am: ff165e31

Change-Id: I4bb6e084b0beb4a57df38a9e083b7e4900320a63
parents e8aa7dcf ff165e31
Loading
Loading
Loading
Loading
+5 −2
Original line number Original line Diff line number Diff line
@@ -463,10 +463,13 @@ def LoadBuildProp(read_helper, prop_file):
  return LoadDictionaryFromLines(data.split("\n"))
  return LoadDictionaryFromLines(data.split("\n"))




def LoadDictionaryFromFile(file_path):
def LoadListFromFile(file_path):
  with open(file_path) as f:
  with open(file_path) as f:
    lines = list(f.read().splitlines())
    return f.read().splitlines()



def LoadDictionaryFromFile(file_path):
  lines = LoadListFromFile(file_path)
  return LoadDictionaryFromLines(lines)
  return LoadDictionaryFromLines(lines)




+20 −71
Original line number Original line Diff line number Diff line
@@ -13,9 +13,8 @@
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations under
# License for the specific language governing permissions and limitations under
# the License.
# the License.

#
"""
"""This script merges two partial target files packages.
This script merges two partial target files packages.


One package contains framework files, and the other contains vendor files.
One package contains framework files, and the other contains vendor files.
It produces a complete target files package that can be used to generate an
It produces a complete target files package that can be used to generate an
@@ -239,8 +238,7 @@ def extract_items(target_files, target_files_temp_dir, extract_item_list):
  # Filter the extract_item_list to remove any items that do not exist in the
  # Filter the extract_item_list to remove any items that do not exist in the
  # zip file. Otherwise, the extraction step will fail.
  # zip file. Otherwise, the extraction step will fail.


  with zipfile.ZipFile(
  with zipfile.ZipFile(target_files, allowZip64=True) as target_files_zipfile:
      target_files, allowZip64=True) as target_files_zipfile:
    target_files_namelist = target_files_zipfile.namelist()
    target_files_namelist = target_files_zipfile.namelist()


  filtered_extract_item_list = []
  filtered_extract_item_list = []
@@ -282,21 +280,6 @@ def copy_items(from_dir, to_dir, patterns):
      shutil.copyfile(original_file_path, copied_file_path)
      shutil.copyfile(original_file_path, copied_file_path)




def read_config_list(config_file_path):
  """Reads a config file into a list of strings.

  Expects the file to be newline-separated.

  Args:
    config_file_path: The path to the config file to open and read.

  Returns:
    The list of strings in the config file.
  """
  with open(config_file_path) as config_file:
    return config_file.read().splitlines()


def validate_config_lists(framework_item_list, framework_misc_info_keys,
def validate_config_lists(framework_item_list, framework_misc_info_keys,
                          vendor_item_list):
                          vendor_item_list):
  """Performs validations on the merge config lists.
  """Performs validations on the merge config lists.
@@ -748,14 +731,14 @@ def files_from_path(target_path, extra_args=None):


  find_command = ['find', target_path] + (extra_args or [])
  find_command = ['find', target_path] + (extra_args or [])
  find_process = common.Run(find_command, stdout=subprocess.PIPE, verbose=False)
  find_process = common.Run(find_command, stdout=subprocess.PIPE, verbose=False)
  return common.RunAndCheckOutput(['sort'], stdin=find_process.stdout,
  return common.RunAndCheckOutput(['sort'],
                                  stdin=find_process.stdout,
                                  verbose=False)
                                  verbose=False)




def create_merged_package(temp_dir, framework_target_files, framework_item_list,
def create_merged_package(temp_dir, framework_target_files, framework_item_list,
                          vendor_target_files, vendor_item_list,
                          vendor_target_files, vendor_item_list,
                          framework_misc_info_keys,
                          framework_misc_info_keys, rebuild_recovery):
                          rebuild_recovery):
  """Merges two target files packages into one target files structure.
  """Merges two target files packages into one target files structure.


  Args:
  Args:
@@ -875,8 +858,7 @@ def generate_super_empty_image(target_dir, output_super_empty):
  """
  """
  # Create super_empty.img using the merged misc_info.txt.
  # Create super_empty.img using the merged misc_info.txt.


  misc_info_txt = os.path.join(target_dir, 'META',
  misc_info_txt = os.path.join(target_dir, 'META', 'misc_info.txt')
                               'misc_info.txt')


  use_dynamic_partitions = common.LoadDictionaryFromFile(misc_info_txt).get(
  use_dynamic_partitions = common.LoadDictionaryFromFile(misc_info_txt).get(
      'use_dynamic_partitions')
      'use_dynamic_partitions')
@@ -885,8 +867,7 @@ def generate_super_empty_image(target_dir, output_super_empty):
    raise ValueError(
    raise ValueError(
        'Building super_empty.img requires use_dynamic_partitions=true.')
        'Building super_empty.img requires use_dynamic_partitions=true.')
  elif use_dynamic_partitions == 'true':
  elif use_dynamic_partitions == 'true':
    super_empty_img = os.path.join(target_dir, 'IMAGES',
    super_empty_img = os.path.join(target_dir, 'IMAGES', 'super_empty.img')
                                   'super_empty.img')
    build_super_image_args = [
    build_super_image_args = [
        misc_info_txt,
        misc_info_txt,
        super_empty_img,
        super_empty_img,
@@ -898,21 +879,6 @@ def generate_super_empty_image(target_dir, output_super_empty):
      shutil.copyfile(super_empty_img, output_super_empty)
      shutil.copyfile(super_empty_img, output_super_empty)




def create_img_archive(source_path, target_path):
  """Creates IMG archive in target path from source package.

  Args:
    source_path: Path of the source package to be packed.
    target_path: Create IMG package from the source package.
  """

  img_from_target_files_args = [
      source_path,
      target_path,
  ]
  img_from_target_files.main(img_from_target_files_args)


def create_target_files_archive(output_file, source_dir, temp_dir):
def create_target_files_archive(output_file, source_dir, temp_dir):
  """Creates archive from target package.
  """Creates archive from target package.


@@ -923,13 +889,12 @@ def create_target_files_archive(output_file, source_dir, temp_dir):
  """
  """
  output_target_files_list = os.path.join(temp_dir, 'output.list')
  output_target_files_list = os.path.join(temp_dir, 'output.list')
  output_zip = os.path.abspath(output_file)
  output_zip = os.path.abspath(output_file)
  output_target_files_meta_dir = os.path.join(source_dir,
  output_target_files_meta_dir = os.path.join(source_dir, 'META')
                                              'META')


  meta_content = files_from_path(output_target_files_meta_dir)
  meta_content = files_from_path(output_target_files_meta_dir)
  other_content = files_from_path(source_dir,
  other_content = files_from_path(
                                  ['-path', output_target_files_meta_dir,
      source_dir,
                                   '-prune', '-o', '-print'])
      ['-path', output_target_files_meta_dir, '-prune', '-o', '-print'])


  with open(output_target_files_list, 'w') as f:
  with open(output_target_files_list, 'w') as f:
    f.write(meta_content)
    f.write(meta_content)
@@ -953,20 +918,6 @@ def create_target_files_archive(output_file, source_dir, temp_dir):
  return output_zip
  return output_zip




def create_ota_package(zip_package, output_ota):
  """Creates OTA package from archived package.

  Args:
    zip_package: The name of the zip archived package.
    output_ota: The name of the output zip archive ota package.
  """
  ota_from_target_files_args = [
      zip_package,
      output_ota,
  ]
  ota_from_target_files.main(ota_from_target_files_args)


def merge_target_files(temp_dir, framework_target_files, framework_item_list,
def merge_target_files(temp_dir, framework_target_files, framework_item_list,
                       framework_misc_info_keys, vendor_target_files,
                       framework_misc_info_keys, vendor_target_files,
                       vendor_item_list, output_target_files, output_dir,
                       vendor_item_list, output_target_files, output_dir,
@@ -1024,7 +975,7 @@ def merge_target_files(temp_dir, framework_target_files, framework_item_list,
  if output_img:
  if output_img:
    # Create the IMG package from the merged target files (before zipping, in
    # Create the IMG package from the merged target files (before zipping, in
    # order to avoid an unnecessary unzip and copy).
    # order to avoid an unnecessary unzip and copy).
    create_img_archive(output_target_files_temp_dir, output_img)
    img_from_target_files.main([output_target_files_temp_dir, output_img])


  # Finally, create the output target files zip archive and/or copy the
  # Finally, create the output target files zip archive and/or copy the
  # output items to the output target files directory.
  # output items to the output target files directory.
@@ -1042,7 +993,7 @@ def merge_target_files(temp_dir, framework_target_files, framework_item_list,
  # Create the OTA package from the merged target files package.
  # Create the OTA package from the merged target files package.


  if output_ota:
  if output_ota:
    create_ota_package(output_zip, output_ota)
    ota_from_target_files.main([output_zip, output_ota])




def call_func_with_temp_dir(func, keep_tmp):
def call_func_with_temp_dir(func, keep_tmp):
@@ -1095,10 +1046,8 @@ def main():
    elif o == '--framework-item-list':
    elif o == '--framework-item-list':
      OPTIONS.framework_item_list = a
      OPTIONS.framework_item_list = a
    elif o == '--system-misc-info-keys':
    elif o == '--system-misc-info-keys':
      logger.warning(
      logger.warning('--system-misc-info-keys has been renamed to '
          '--system-misc-info-keys has been renamed to '
                     '--framework-misc-info-keys')
          '--framework-misc-info-keys'
      )
      OPTIONS.framework_misc_info_keys = a
      OPTIONS.framework_misc_info_keys = a
    elif o == '--framework-misc-info-keys':
    elif o == '--framework-misc-info-keys':
      OPTIONS.framework_misc_info_keys = a
      OPTIONS.framework_misc_info_keys = a
@@ -1167,23 +1116,23 @@ def main():
    sys.exit(1)
    sys.exit(1)


  if OPTIONS.framework_item_list:
  if OPTIONS.framework_item_list:
    framework_item_list = read_config_list(OPTIONS.framework_item_list)
    framework_item_list = common.LoadListFromFile(OPTIONS.framework_item_list)
  else:
  else:
    framework_item_list = DEFAULT_FRAMEWORK_ITEM_LIST
    framework_item_list = DEFAULT_FRAMEWORK_ITEM_LIST


  if OPTIONS.framework_misc_info_keys:
  if OPTIONS.framework_misc_info_keys:
    framework_misc_info_keys = read_config_list(
    framework_misc_info_keys = common.LoadListFromFile(
        OPTIONS.framework_misc_info_keys)
        OPTIONS.framework_misc_info_keys)
  else:
  else:
    framework_misc_info_keys = DEFAULT_FRAMEWORK_MISC_INFO_KEYS
    framework_misc_info_keys = DEFAULT_FRAMEWORK_MISC_INFO_KEYS


  if OPTIONS.vendor_item_list:
  if OPTIONS.vendor_item_list:
    vendor_item_list = read_config_list(OPTIONS.vendor_item_list)
    vendor_item_list = common.LoadListFromFile(OPTIONS.vendor_item_list)
  else:
  else:
    vendor_item_list = DEFAULT_VENDOR_ITEM_LIST
    vendor_item_list = DEFAULT_VENDOR_ITEM_LIST


  if OPTIONS.output_item_list:
  if OPTIONS.output_item_list:
    output_item_list = read_config_list(OPTIONS.output_item_list)
    output_item_list = common.LoadListFromFile(OPTIONS.output_item_list)
  else:
  else:
    output_item_list = None
    output_item_list = None


+17 −0
Original line number Original line Diff line number Diff line
@@ -912,6 +912,23 @@ class CommonUtilsTest(test_utils.ReleaseToolsTestCase):
      'recovery_as_boot': 'true',
      'recovery_as_boot': 'true',
  }
  }


  def test_LoadListFromFile(self):
    file_path = os.path.join(self.testdata_dir,
                             'merge_config_framework_item_list')
    contents = common.LoadListFromFile(file_path)
    expected_contents = [
        'META/apkcerts.txt',
        'META/filesystem_config.txt',
        'META/root_filesystem_config.txt',
        'META/system_manifest.xml',
        'META/system_matrix.xml',
        'META/update_engine_config.txt',
        'PRODUCT/*',
        'ROOT/*',
        'SYSTEM/*',
    ]
    self.assertEqual(sorted(contents), sorted(expected_contents))

  @staticmethod
  @staticmethod
  def _test_LoadInfoDict_createTargetFiles(info_dict, fstab_path):
  def _test_LoadInfoDict_createTargetFiles(info_dict, fstab_path):
    target_files = common.MakeTempFile(prefix='target_files-', suffix='.zip')
    target_files = common.MakeTempFile(prefix='target_files-', suffix='.zip')
+1 −19
Original line number Original line Diff line number Diff line
@@ -18,7 +18,7 @@ import os.path


import common
import common
import test_utils
import test_utils
from merge_target_files import (read_config_list, validate_config_lists,
from merge_target_files import (validate_config_lists,
                                DEFAULT_FRAMEWORK_ITEM_LIST,
                                DEFAULT_FRAMEWORK_ITEM_LIST,
                                DEFAULT_VENDOR_ITEM_LIST,
                                DEFAULT_VENDOR_ITEM_LIST,
                                DEFAULT_FRAMEWORK_MISC_INFO_KEYS, copy_items,
                                DEFAULT_FRAMEWORK_MISC_INFO_KEYS, copy_items,
@@ -83,24 +83,6 @@ class MergeTargetFilesTest(test_utils.ReleaseToolsTestCase):
    self.assertEqual(
    self.assertEqual(
        os.readlink(os.path.join(output_dir, 'a_link.cpp')), 'a.cpp')
        os.readlink(os.path.join(output_dir, 'a_link.cpp')), 'a.cpp')


  def test_read_config_list(self):
    framework_item_list_file = os.path.join(self.testdata_dir,
                                            'merge_config_framework_item_list')
    framework_item_list = read_config_list(framework_item_list_file)
    expected_framework_item_list = [
        'META/apkcerts.txt',
        'META/filesystem_config.txt',
        'META/root_filesystem_config.txt',
        'META/system_manifest.xml',
        'META/system_matrix.xml',
        'META/update_engine_config.txt',
        'PRODUCT/*',
        'ROOT/*',
        'SYSTEM/*',
    ]
    self.assertEqual(sorted(framework_item_list),
                     sorted(expected_framework_item_list))

  def test_validate_config_lists_ReturnsFalseIfMissingDefaultItem(self):
  def test_validate_config_lists_ReturnsFalseIfMissingDefaultItem(self):
    framework_item_list = list(DEFAULT_FRAMEWORK_ITEM_LIST)
    framework_item_list = list(DEFAULT_FRAMEWORK_ITEM_LIST)
    framework_item_list.remove('SYSTEM/*')
    framework_item_list.remove('SYSTEM/*')