diff options
author | Conley Owens <cco3@android.com> | 2014-09-18 23:09:08 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2014-09-18 23:09:08 +0000 |
commit | c190b98ed55040c58d880d575c32e9c01044378c (patch) | |
tree | 81f1f8fa93c397e322362374427adeb888bb6c3c | |
parent | 4863307299bee9a644a94957f06bed48d898532e (diff) | |
parent | 884a387ecae6ce0aa3739771eecfcc0cd376cf61 (diff) | |
download | git-repo-c190b98ed55040c58d880d575c32e9c01044378c.tar.gz |
Merge "Add extend-project tag to support adding groups to an existing project"
-rw-r--r-- | docs/manifest-format.txt | 22 | ||||
-rw-r--r-- | manifest_xml.py | 24 |
2 files changed, 44 insertions, 2 deletions
diff --git a/docs/manifest-format.txt b/docs/manifest-format.txt index 28a21bb7..d5c6a024 100644 --- a/docs/manifest-format.txt +++ b/docs/manifest-format.txt | |||
@@ -26,6 +26,7 @@ following DTD: | |||
26 | manifest-server?, | 26 | manifest-server?, |
27 | remove-project*, | 27 | remove-project*, |
28 | project*, | 28 | project*, |
29 | extend-project*, | ||
29 | repo-hooks?)> | 30 | repo-hooks?)> |
30 | 31 | ||
31 | <!ELEMENT notice (#PCDATA)> | 32 | <!ELEMENT notice (#PCDATA)> |
@@ -67,6 +68,11 @@ following DTD: | |||
67 | <!ATTLIST annotation value CDATA #REQUIRED> | 68 | <!ATTLIST annotation value CDATA #REQUIRED> |
68 | <!ATTLIST annotation keep CDATA "true"> | 69 | <!ATTLIST annotation keep CDATA "true"> |
69 | 70 | ||
71 | <!ELEMENT extend-project> | ||
72 | <!ATTLIST extend-project name CDATA #REQUIRED> | ||
73 | <!ATTLIST extend-project path CDATA #IMPLIED> | ||
74 | <!ATTLIST extend-project groups CDATA #IMPLIED> | ||
75 | |||
70 | <!ELEMENT remove-project (EMPTY)> | 76 | <!ELEMENT remove-project (EMPTY)> |
71 | <!ATTLIST remove-project name CDATA #REQUIRED> | 77 | <!ATTLIST remove-project name CDATA #REQUIRED> |
72 | 78 | ||
@@ -252,6 +258,22 @@ rather than the `name` attribute. This attribute only applies to the | |||
252 | local mirrors syncing, it will be ignored when syncing the projects in a | 258 | local mirrors syncing, it will be ignored when syncing the projects in a |
253 | client working directory. | 259 | client working directory. |
254 | 260 | ||
261 | Element extend-project | ||
262 | ---------------------- | ||
263 | |||
264 | Modify the attributes of the named project. | ||
265 | |||
266 | This element is mostly useful in a local manifest file, to modify the | ||
267 | attributes of an existing project without completely replacing the | ||
268 | existing project definition. This makes the local manifest more robust | ||
269 | against changes to the original manifest. | ||
270 | |||
271 | Attribute `path`: If specified, limit the change to projects checked out | ||
272 | at the specified path, rather than all projects with the given name. | ||
273 | |||
274 | Attribute `groups`: List of additional groups to which this project | ||
275 | belongs. Same syntax as the corresponding element of `project`. | ||
276 | |||
255 | Element annotation | 277 | Element annotation |
256 | ------------------ | 278 | ------------------ |
257 | 279 | ||
diff --git a/manifest_xml.py b/manifest_xml.py index 6d70c86b..890c954d 100644 --- a/manifest_xml.py +++ b/manifest_xml.py | |||
@@ -168,6 +168,9 @@ class XmlManifest(object): | |||
168 | if r.revision is not None: | 168 | if r.revision is not None: |
169 | e.setAttribute('revision', r.revision) | 169 | e.setAttribute('revision', r.revision) |
170 | 170 | ||
171 | def _ParseGroups(self, groups): | ||
172 | return [x for x in re.split(r'[,\s]+', groups) if x] | ||
173 | |||
171 | def Save(self, fd, peg_rev=False, peg_rev_upstream=True): | 174 | def Save(self, fd, peg_rev=False, peg_rev_upstream=True): |
172 | """Write the current manifest out to the given file descriptor. | 175 | """Write the current manifest out to the given file descriptor. |
173 | """ | 176 | """ |
@@ -175,7 +178,7 @@ class XmlManifest(object): | |||
175 | 178 | ||
176 | groups = mp.config.GetString('manifest.groups') | 179 | groups = mp.config.GetString('manifest.groups') |
177 | if groups: | 180 | if groups: |
178 | groups = [x for x in re.split(r'[,\s]+', groups) if x] | 181 | groups = self._ParseGroups(groups) |
179 | 182 | ||
180 | doc = xml.dom.minidom.Document() | 183 | doc = xml.dom.minidom.Document() |
181 | root = doc.createElement('manifest') | 184 | root = doc.createElement('manifest') |
@@ -511,6 +514,23 @@ class XmlManifest(object): | |||
511 | if node.nodeName == 'project': | 514 | if node.nodeName == 'project': |
512 | project = self._ParseProject(node) | 515 | project = self._ParseProject(node) |
513 | recursively_add_projects(project) | 516 | recursively_add_projects(project) |
517 | if node.nodeName == 'extend-project': | ||
518 | name = self._reqatt(node, 'name') | ||
519 | |||
520 | if name not in self._projects: | ||
521 | raise ManifestParseError('extend-project element specifies non-existent ' | ||
522 | 'project: %s' % name) | ||
523 | |||
524 | path = node.getAttribute('path') | ||
525 | groups = node.getAttribute('groups') | ||
526 | if groups: | ||
527 | groups = self._ParseGroups(groups) | ||
528 | |||
529 | for p in self._projects[name]: | ||
530 | if path and p.relpath != path: | ||
531 | continue | ||
532 | if groups: | ||
533 | p.groups.extend(groups) | ||
514 | if node.nodeName == 'repo-hooks': | 534 | if node.nodeName == 'repo-hooks': |
515 | # Get the name of the project and the (space-separated) list of enabled. | 535 | # Get the name of the project and the (space-separated) list of enabled. |
516 | repo_hooks_project = self._reqatt(node, 'in-project') | 536 | repo_hooks_project = self._reqatt(node, 'in-project') |
@@ -751,7 +771,7 @@ class XmlManifest(object): | |||
751 | groups = '' | 771 | groups = '' |
752 | if node.hasAttribute('groups'): | 772 | if node.hasAttribute('groups'): |
753 | groups = node.getAttribute('groups') | 773 | groups = node.getAttribute('groups') |
754 | groups = [x for x in re.split(r'[,\s]+', groups) if x] | 774 | groups = self._ParseGroups(groups) |
755 | 775 | ||
756 | if parent is None: | 776 | if parent is None: |
757 | relpath, worktree, gitdir, objdir = self.GetProjectPaths(name, path) | 777 | relpath, worktree, gitdir, objdir = self.GetProjectPaths(name, path) |