From a1bfd2cd7253b1662e08f5ec5be3d863430c756c Mon Sep 17 00:00:00 2001 From: Nico Sallembien Date: Tue, 6 Apr 2010 10:40:01 -0700 Subject: Add a 'smart sync' option to repo sync This option allows the user to specify a manifest server to use when syncing. This manifest server will provide a manifest pegging each project to a known green build. This allows developers to work on a known good tree that is known to build and pass tests, preventing failed builds to hamper productivity. The manifest used is not "sticky" so as to allow subsequent 'repo sync' calls to sync to the tip of the tree. Change-Id: Id0a24ece20f5a88034ad364b416a1dd2e394226d --- manifest_xml.py | 32 +++++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) (limited to 'manifest_xml.py') diff --git a/manifest_xml.py b/manifest_xml.py index 7d02f9d6..d0c9debe 100644 --- a/manifest_xml.py +++ b/manifest_xml.py @@ -65,8 +65,8 @@ class XmlManifest(object): self._Unload() - def Link(self, name): - """Update the repo metadata to use a different manifest. + def Override(self, name): + """Use a different manifest, just for the current instantiation. """ path = os.path.join(self.manifestProject.worktree, name) if not os.path.isfile(path): @@ -80,6 +80,11 @@ class XmlManifest(object): finally: self.manifestFile = old + def Link(self, name): + """Update the repo metadata to use a different manifest. + """ + self.Override(name) + try: if os.path.exists(self.manifestFile): os.remove(self.manifestFile) @@ -123,6 +128,12 @@ class XmlManifest(object): root.appendChild(e) root.appendChild(doc.createTextNode('')) + if self._manifest_server: + e = doc.createElement('manifest-server') + e.setAttribute('url', self._manifest_server) + root.appendChild(e) + root.appendChild(doc.createTextNode('')) + sort_projects = list(self.projects.keys()) sort_projects.sort() @@ -168,6 +179,11 @@ class XmlManifest(object): self._Load() return self._default + @property + def manifest_server(self): + self._Load() + return self._manifest_server + @property def IsMirror(self): return self.manifestProject.config.GetBoolean('repo.mirror') @@ -178,6 +194,7 @@ class XmlManifest(object): self._remotes = {} self._default = None self.branch = None + self._manifest_server = None def _Load(self): if not self._loaded: @@ -246,6 +263,15 @@ class XmlManifest(object): if self._default is None: self._default = _Default() + for node in config.childNodes: + if node.nodeName == 'manifest-server': + url = self._reqatt(node, 'url') + if self._manifest_server is not None: + raise ManifestParseError, \ + 'duplicate manifest-server in %s' % \ + (self.manifestFile) + self._manifest_server = url + for node in config.childNodes: if node.nodeName == 'project': project = self._ParseProject(node) @@ -315,7 +341,7 @@ class XmlManifest(object): def _ParseProject(self, node): """ reads a element from the manifest file - """ + """ name = self._reqatt(node, 'name') remote = self._get_remote(node) -- cgit v1.2.3-54-g00ecf