| OLD | NEW |
| (Empty) | |
| 1 #!/usr/bin/env python |
| 2 # Copyright (c) 2013 The Chromium Authors. All rights reserved. |
| 3 # Use of this source code is governed by a BSD-style license that can be |
| 4 # found in the LICENSE file. |
| 5 |
| 6 """Generate local manifest in an Android repository. |
| 7 |
| 8 This is used to generate a local manifest in an Android repository. The purpose |
| 9 of the generated manifest is to remove the set of projects that exist under a |
| 10 certain path. |
| 11 """ |
| 12 |
| 13 from optparse import OptionParser |
| 14 import os |
| 15 import xml.etree.ElementTree as ET |
| 16 |
| 17 def createLocalManifest(manifest_path, local_manifest_path, path_to_exclude, |
| 18 pinned_projects=None): |
| 19 manifest_tree = ET.parse(manifest_path) |
| 20 local_manifest_root = ET.Element('manifest') |
| 21 |
| 22 def remove_project(project): |
| 23 remove_project = ET.SubElement(local_manifest_root, 'remove-project') |
| 24 remove_project.set('name', project.get('name')) |
| 25 |
| 26 def pin_project(project, revision): |
| 27 pin_project = ET.SubElement(local_manifest_root, 'project') |
| 28 pin_project.set('name', project.get('name')) |
| 29 if project.get('path') != None: |
| 30 pin_project.set('path', project.get('path')) |
| 31 pin_project.set('revision', revision) |
| 32 |
| 33 for project in manifest_tree.getroot().findall('project'): |
| 34 project_path = project.get('path') |
| 35 project_name = project.get('name') |
| 36 exclude_project = ((project_path != None and |
| 37 project_path.startswith(path_to_exclude)) or |
| 38 (project_path == None and |
| 39 project_name.startswith(path_to_exclude))) |
| 40 if exclude_project: |
| 41 print 'Excluding project name="%s" path="%s"' % (project_name, |
| 42 project_path) |
| 43 remove_project(project) |
| 44 continue |
| 45 |
| 46 pinned_projects = pinned_projects or [] |
| 47 for pinned in pinned_projects: |
| 48 if pinned['path'] == project_path and pinned['name'] == project_name: |
| 49 remove_project(project) |
| 50 pin_project(project, pinned['revision']) |
| 51 break |
| 52 |
| 53 local_manifest_tree = ET.ElementTree(local_manifest_root) |
| 54 local_manifest_dir = os.path.dirname(local_manifest_path) |
| 55 if not os.path.exists(local_manifest_dir): |
| 56 os.makedirs(local_manifest_dir) |
| 57 local_manifest_tree.write(local_manifest_path, |
| 58 xml_declaration=True, |
| 59 encoding='UTF-8', |
| 60 method='xml') |
| 61 |
| 62 def main(): |
| 63 usage = 'usage: %prog [options] <android_build_top> <path_to_exclude>' |
| 64 parser = OptionParser(usage=usage) |
| 65 parser.add_option('--ndk-revision', dest='ndk_revision', |
| 66 help='pin the ndk project at a particular REVISION', |
| 67 metavar='REVISION', default=None) |
| 68 parser.add_option('--manifest_filename', dest='manifest_filename', |
| 69 help='name of the manifest file', default='default.xml') |
| 70 (options, args) = parser.parse_args() |
| 71 |
| 72 if len(args) != 2: |
| 73 parser.error('Wrong number of arguments.') |
| 74 |
| 75 android_build_top = args[0] |
| 76 path_to_exclude = args[1] |
| 77 |
| 78 manifest_filename = options.manifest_filename |
| 79 |
| 80 manifest_path = os.path.join(android_build_top, '.repo/manifests', |
| 81 manifest_filename) |
| 82 local_manifest_path = os.path.join(android_build_top, |
| 83 '.repo/local_manifest.xml') |
| 84 |
| 85 pinned_projects = [] |
| 86 if options.ndk_revision: |
| 87 pinned_projects = [{ |
| 88 'path': 'ndk', |
| 89 'name': 'platform/ndk', |
| 90 'revision' : options.ndk_revision, |
| 91 },] |
| 92 |
| 93 print 'Path to exclude: %s' % path_to_exclude |
| 94 print 'Path to manifest file: %s' % manifest_path |
| 95 createLocalManifest(manifest_path, local_manifest_path, path_to_exclude, |
| 96 pinned_projects) |
| 97 print 'Local manifest created in: %s' % local_manifest_path |
| 98 |
| 99 if __name__ == '__main__': |
| 100 main() |
| OLD | NEW |