Support user supplied custom .repo/local_manifest.xml files

By creating a .repo/local_manifest.xml the user can add extra
projects into their client space, without touching the main
manifest script.

For example:

  $ cat .repo/local_manifest.xml
  <?xml version="1.0" encoding="UTF-8"?>
  <manifest>
   <project path="android-build"
            name="platform/build"
            remote="korg"
            revision="android-1.0" />
  </manifest>

Signed-off-by: Shawn O. Pearce <sop@google.com>
This commit is contained in:
Shawn O. Pearce 2008-10-23 16:19:27 -07:00
parent 632768bc65
commit 5cc6679fb8

View File

@ -26,6 +26,7 @@ from remote import Remote
from error import ManifestParseError from error import ManifestParseError
MANIFEST_FILE_NAME = 'manifest.xml' MANIFEST_FILE_NAME = 'manifest.xml'
LOCAL_MANIFEST_NAME = 'local_manifest.xml'
class _Default(object): class _Default(object):
"""Project defaults within the manifest.""" """Project defaults within the manifest."""
@ -108,10 +109,20 @@ class Manifest(object):
def _Load(self): def _Load(self):
if not self._loaded: if not self._loaded:
self._ParseManifest() self._ParseManifest(True)
local = os.path.join(self.repodir, LOCAL_MANIFEST_NAME)
if os.path.exists(local):
try:
real = self.manifestFile
self.manifestFile = local
self._ParseManifest(False)
finally:
self.manifestFile = real
self._loaded = True self._loaded = True
def _ParseManifest(self): def _ParseManifest(self, is_root_file):
root = xml.dom.minidom.parse(self.manifestFile) root = xml.dom.minidom.parse(self.manifestFile)
if not root or not root.childNodes: if not root or not root.childNodes:
raise ManifestParseError, \ raise ManifestParseError, \
@ -124,9 +135,10 @@ class Manifest(object):
"no <manifest> in %s" % \ "no <manifest> in %s" % \
self.manifestFile self.manifestFile
self.branch = config.getAttribute('branch') if is_root_file:
if not self.branch: self.branch = config.getAttribute('branch')
self.branch = 'default' if not self.branch:
self.branch = 'default'
for node in config.childNodes: for node in config.childNodes:
if node.nodeName == 'remote': if node.nodeName == 'remote':