summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorConley Owens <cco3@android.com>2012-04-16 10:36:08 -0700
committerShawn O. Pearce <sop@google.com>2012-04-23 12:39:05 -0700
commit971de8ea7b7e474a4d9253b6c9f47da3f1130973 (patch)
treed8ac52741957b38d57d15f208e57b984d71ddc19
parent24c130884018364f91baa8de0ff3541f4c32d1bb (diff)
downloadgit-repo-971de8ea7b7e474a4d9253b6c9f47da3f1130973.tar.gz
Refine groups functionality
Every project is in group "default". "-default" does not remove it from this project. All group names specified in the manifest are positive names as opposed to a mix of negative and positive. Specified groups are resolved in order. If init is supplied with --groups="group1,-group2", the following describes the project selection when syncing: * all projects in "group1" will be added, and * all projects in "group2" will be removed. Change-Id: I1df3dcdb64bbd4cd80d675f9b2d3becbf721f661
-rw-r--r--command.py7
-rw-r--r--docs/manifest-format.txt4
-rw-r--r--manifest_xml.py21
-rw-r--r--project.py48
-rwxr-xr-xrepo4
-rw-r--r--subcmds/init.py10
6 files changed, 42 insertions, 52 deletions
diff --git a/command.py b/command.py
index 724e4c5d..2ee0a43a 100644
--- a/command.py
+++ b/command.py
@@ -58,7 +58,7 @@ class Command(object):
58 """Perform the action, after option parsing is complete. 58 """Perform the action, after option parsing is complete.
59 """ 59 """
60 raise NotImplementedError 60 raise NotImplementedError
61 61
62 def GetProjects(self, args, missing_ok=False): 62 def GetProjects(self, args, missing_ok=False):
63 """A list of projects that match the arguments. 63 """A list of projects that match the arguments.
64 """ 64 """
@@ -68,8 +68,9 @@ class Command(object):
68 mp = self.manifest.manifestProject 68 mp = self.manifest.manifestProject
69 69
70 groups = mp.config.GetString('manifest.groups') 70 groups = mp.config.GetString('manifest.groups')
71 if groups: 71 if groups is None:
72 groups = re.split('[,\s]+', groups) 72 groups = 'default'
73 groups = [x for x in re.split('[,\s]+', groups) if x]
73 74
74 if not args: 75 if not args:
75 for project in all.values(): 76 for project in all.values():
diff --git a/docs/manifest-format.txt b/docs/manifest-format.txt
index e5f5ee18..764e41eb 100644
--- a/docs/manifest-format.txt
+++ b/docs/manifest-format.txt
@@ -165,8 +165,8 @@ been extensively tested. If not supplied the revision given by
165the default element is used. 165the default element is used.
166 166
167Attribute `groups`: List of groups to which this project belongs, 167Attribute `groups`: List of groups to which this project belongs,
168whitespace or comma separated. All projects are part of the group 168whitespace or comma separated. All projects belong to the group
169"default" unless "-default" is specified in the list of groups. 169"default".
170 170
171Element annotation 171Element annotation
172------------------ 172------------------
diff --git a/manifest_xml.py b/manifest_xml.py
index 9b804da9..5ffc49e9 100644
--- a/manifest_xml.py
+++ b/manifest_xml.py
@@ -122,8 +122,9 @@ class XmlManifest(object):
122 mp = self.manifestProject 122 mp = self.manifestProject
123 123
124 groups = mp.config.GetString('manifest.groups') 124 groups = mp.config.GetString('manifest.groups')
125 if groups: 125 if groups is None:
126 groups = re.split('[,\s]+', groups) 126 groups = 'default'
127 groups = [x for x in re.split(r'[,\s]+', groups) if x]
127 128
128 doc = xml.dom.minidom.Document() 129 doc = xml.dom.minidom.Document()
129 root = doc.createElement('manifest') 130 root = doc.createElement('manifest')
@@ -200,8 +201,9 @@ class XmlManifest(object):
200 ce.setAttribute('dest', c.dest) 201 ce.setAttribute('dest', c.dest)
201 e.appendChild(ce) 202 e.appendChild(ce)
202 203
203 if p.groups: 204 egroups = [g for g in p.groups if g != 'default']
204 e.setAttribute('groups', ','.join(p.groups)) 205 if egroups:
206 e.setAttribute('groups', ','.join(egroups))
205 207
206 for a in p.annotations: 208 for a in p.annotations:
207 if a.keep == "true": 209 if a.keep == "true":
@@ -524,11 +526,12 @@ class XmlManifest(object):
524 else: 526 else:
525 rebase = rebase.lower() in ("yes", "true", "1") 527 rebase = rebase.lower() in ("yes", "true", "1")
526 528
527 groups = node.getAttribute('groups') 529 groups = ''
528 if groups: 530 if node.hasAttribute('groups'):
529 groups = re.split('[,\s]+', groups) 531 groups = node.getAttribute('groups')
530 else: 532 groups = [x for x in re.split('[,\s]+', groups) if x]
531 groups = None 533 if 'default' not in groups:
534 groups.append('default')
532 535
533 if self.IsMirror: 536 if self.IsMirror:
534 relpath = None 537 relpath = None
diff --git a/project.py b/project.py
index e297926d..2b740007 100644
--- a/project.py
+++ b/project.py
@@ -657,41 +657,21 @@ class Project(object):
657 """Returns true if the manifest groups specified at init should cause 657 """Returns true if the manifest groups specified at init should cause
658 this project to be synced. 658 this project to be synced.
659 Prefixing a manifest group with "-" inverts the meaning of a group. 659 Prefixing a manifest group with "-" inverts the meaning of a group.
660 All projects are implicitly labelled with "default" unless they are 660 All projects are implicitly labelled with "default".
661 explicitly labelled "-default".
662 If any non-inverted manifest groups are specified, the default label
663 is ignored.
664 Specifying only inverted groups implies "default".
665 """
666 project_groups = self.groups
667 if not manifest_groups:
668 return not project_groups or not "-default" in project_groups
669
670 if not project_groups:
671 project_groups = ["default"]
672 elif not ("default" in project_groups or "-default" in project_groups):
673 project_groups.append("default")
674
675 plus_groups = [x for x in manifest_groups if not x.startswith("-")]
676 minus_groups = [x[1:] for x in manifest_groups if x.startswith("-")]
677
678 if not plus_groups:
679 plus_groups.append("default")
680
681 for group in minus_groups:
682 if group in project_groups:
683 # project was excluded by -group
684 return False
685 661
686 for group in plus_groups: 662 labels are resolved in order. In the example case of
687 if group in project_groups: 663 project_groups: "default,group1,group2"
688 # project was included by group 664 manifest_groups: "-group1,group2"
689 return True 665 the project will be matched.
690 666 """
691 # groups were specified that did not include this project 667 matched = False
692 if plus_groups: 668 for group in manifest_groups:
693 return False 669 if group.startswith('-') and group[1:] in self.groups:
694 return True 670 matched = False
671 elif group in self.groups:
672 matched = True
673
674 return matched
695 675
696## Status Display ## 676## Status Display ##
697 677
diff --git a/repo b/repo
index 75fe9ec2..0aabc0d8 100755
--- a/repo
+++ b/repo
@@ -28,7 +28,7 @@ if __name__ == '__main__':
28del magic 28del magic
29 29
30# increment this whenever we make important changes to this script 30# increment this whenever we make important changes to this script
31VERSION = (1, 15) 31VERSION = (1, 16)
32 32
33# increment this if the MAINTAINER_KEYS block is modified 33# increment this if the MAINTAINER_KEYS block is modified
34KEYRING_VERSION = (1,0) 34KEYRING_VERSION = (1,0)
@@ -126,7 +126,7 @@ group.add_option('--depth', type='int', default=None,
126 dest='depth', 126 dest='depth',
127 help='create a shallow clone with given depth; see git clone') 127 help='create a shallow clone with given depth; see git clone')
128group.add_option('-g', '--groups', 128group.add_option('-g', '--groups',
129 dest='groups', default="", 129 dest='groups', default='default',
130 help='restrict manifest projects to ones with a specified group', 130 help='restrict manifest projects to ones with a specified group',
131 metavar='GROUP') 131 metavar='GROUP')
132 132
diff --git a/subcmds/init.py b/subcmds/init.py
index 6cf39d14..d1c497c1 100644
--- a/subcmds/init.py
+++ b/subcmds/init.py
@@ -14,6 +14,7 @@
14# limitations under the License. 14# limitations under the License.
15 15
16import os 16import os
17import re
17import shutil 18import shutil
18import sys 19import sys
19 20
@@ -87,7 +88,7 @@ to update the working directory files.
87 dest='depth', 88 dest='depth',
88 help='create a shallow clone with given depth; see git clone') 89 help='create a shallow clone with given depth; see git clone')
89 g.add_option('-g', '--groups', 90 g.add_option('-g', '--groups',
90 dest='groups', default="", 91 dest='groups', default='default',
91 help='restrict manifest projects to ones with a specified group', 92 help='restrict manifest projects to ones with a specified group',
92 metavar='GROUP') 93 metavar='GROUP')
93 94
@@ -139,7 +140,12 @@ to update the working directory files.
139 r.ResetFetch() 140 r.ResetFetch()
140 r.Save() 141 r.Save()
141 142
142 m.config.SetString('manifest.groups', opt.groups) 143 groups = re.split('[,\s]+', opt.groups)
144 groups = [x for x in groups if x]
145 groupstr = ','.join(groups)
146 if groupstr == 'default':
147 groupstr = None
148 m.config.SetString('manifest.groups', groupstr)
143 149
144 if opt.reference: 150 if opt.reference:
145 m.config.SetString('repo.reference', opt.reference) 151 m.config.SetString('repo.reference', opt.reference)