Add sync-c option to manifest
There are use-cases when fetching all branch is impractical and
we really need to fetch only one branch/tag.
e.g. there is a large project with binaries and every update of a
binary file is put to a separate branch.
The whole project history might be too large to allow users fetch it.
Add 'sync-c' option to 'project' and 'default' tags to make it possible
to configure 'sync-c' behavior at per-project and per-manifest level.
Note that currently there is no possibility to revert boolean flag from
command line. If 'sync-c' is set in manifest then you cannot make
full fetch by providing a repo tool argument.
Change-Id: Ie36fe5737304930493740370239403986590f593
diff --git a/docs/manifest-format.txt b/docs/manifest-format.txt
index 764e41e..5378965 100644
--- a/docs/manifest-format.txt
+++ b/docs/manifest-format.txt
@@ -39,6 +39,7 @@
<!ATTLIST default remote IDREF #IMPLIED>
<!ATTLIST default revision CDATA #IMPLIED>
<!ATTLIST default sync-j CDATA #IMPLIED>
+ <!ATTLIST default sync-c CDATA #IMPLIED>
<!ELEMENT manifest-server (EMPTY)>
<!ATTLIST url CDATA #REQUIRED>
@@ -49,6 +50,7 @@
<!ATTLIST project remote IDREF #IMPLIED>
<!ATTLIST project revision CDATA #IMPLIED>
<!ATTLIST project groups CDATA #IMPLIED>
+ <!ATTLIST project sync-c CDATA #IMPLIED>
<!ELEMENT annotation (EMPTY)>
<!ATTLIST annotation name CDATA #REQUIRED>
diff --git a/manifest_xml.py b/manifest_xml.py
index d20eac2..ca65e33 100644
--- a/manifest_xml.py
+++ b/manifest_xml.py
@@ -35,6 +35,7 @@
revisionExpr = None
remote = None
sync_j = 1
+ sync_c = False
class _XmlRemote(object):
def __init__(self,
@@ -159,6 +160,9 @@
if d.sync_j > 1:
have_default = True
e.setAttribute('sync-j', '%d' % d.sync_j)
+ if d.sync_c:
+ have_default = True
+ e.setAttribute('sync-c', 'true')
if have_default:
root.appendChild(e)
root.appendChild(doc.createTextNode(''))
@@ -212,6 +216,9 @@
ae.setAttribute('value', a.value)
e.appendChild(ae)
+ if p.sync_c:
+ e.setAttribute('sync-c', 'true')
+
if self._repo_hooks_project:
root.appendChild(doc.createTextNode(''))
e = doc.createElement('repo-hooks')
@@ -444,11 +451,18 @@
d.revisionExpr = node.getAttribute('revision')
if d.revisionExpr == '':
d.revisionExpr = None
+
sync_j = node.getAttribute('sync-j')
if sync_j == '' or sync_j is None:
d.sync_j = 1
else:
d.sync_j = int(sync_j)
+
+ sync_c = node.getAttribute('sync-c')
+ if not sync_c:
+ d.sync_c = False
+ else:
+ d.sync_c = sync_c.lower() in ("yes", "true", "1")
return d
def _ParseNotice(self, node):
@@ -526,6 +540,12 @@
else:
rebase = rebase.lower() in ("yes", "true", "1")
+ sync_c = node.getAttribute('sync-c')
+ if not sync_c:
+ sync_c = False
+ else:
+ sync_c = sync_c.lower() in ("yes", "true", "1")
+
groups = ''
if node.hasAttribute('groups'):
groups = node.getAttribute('groups')
@@ -550,7 +570,8 @@
revisionExpr = revisionExpr,
revisionId = None,
rebase = rebase,
- groups = groups)
+ groups = groups,
+ sync_c = sync_c)
for n in node.childNodes:
if n.nodeName == 'copyfile':
diff --git a/project.py b/project.py
index 2b74000..40f6f31 100644
--- a/project.py
+++ b/project.py
@@ -510,7 +510,8 @@
revisionExpr,
revisionId,
rebase = True,
- groups = None):
+ groups = None,
+ sync_c = False):
self.manifest = manifest
self.name = name
self.remote = remote
@@ -531,6 +532,7 @@
self.rebase = rebase
self.groups = groups
+ self.sync_c = sync_c
self.snapshots = {}
self.copyfiles = []
@@ -964,6 +966,7 @@
and self._ApplyCloneBundle(initial=is_new, quiet=quiet):
is_new = False
+ current_branch_only = current_branch_only or self.sync_c or self.manifest.default.sync_c
if not self._RemoteFetch(initial=is_new, quiet=quiet, alt_dir=alt_dir,
current_branch_only=current_branch_only):
return False