Index: gclient.py |
diff --git a/gclient.py b/gclient.py |
index 407b9ad4e99f1efd3f31270f3695e18f458b1fcb..506439630438004a437d34037d3427a8b12d3486 100755 |
--- a/gclient.py |
+++ b/gclient.py |
@@ -73,6 +73,7 @@ |
__version__ = '0.7' |
import copy |
+import json |
import logging |
import optparse |
import os |
@@ -301,6 +302,9 @@ class Dependency(gclient_utils.WorkItem, DependencySettings): |
# This is the scm used to checkout self.url. It may be used by dependencies |
# to get the datetime of the revision we checked out. |
self._used_scm = None |
+ # The actual revision we ended up getting, or None if that information is |
+ # unavailable |
+ self._got_revision = None |
if not self.name and self.parent: |
raise gclient_utils.Error('Dependency without name') |
@@ -624,7 +628,8 @@ class Dependency(gclient_utils.WorkItem, DependencySettings): |
command, options, parsed_url, self.parent.name, revision_overrides) |
self._used_scm = gclient_scm.CreateSCM( |
parsed_url, self.root.root_dir, self.name) |
- self._used_scm.RunCommand(command, options, args, file_list) |
+ self._got_revision = self._used_scm.RunCommand(command, options, args, |
+ file_list) |
if file_list: |
file_list = [os.path.join(self.name, f.strip()) for f in file_list] |
@@ -855,6 +860,11 @@ class Dependency(gclient_utils.WorkItem, DependencySettings): |
return self._used_scm |
@property |
+ @gclient_utils.lockedmethod |
+ def got_revision(self): |
+ return self._got_revision |
+ |
+ @property |
def file_list_and_children(self): |
result = list(self.file_list) |
for d in self.dependencies: |
@@ -1523,6 +1533,21 @@ def CMDstatus(parser, args): |
all modules (useful for recovering files deleted from local copy) |
gclient sync --revision src@31000 |
update src directory to r31000 |
+ |
+JSON output format: |
+If the --output-json option is specified, the following document structure will |
+be emitted to the provided file. 'null' entries may occur for subprojects which |
+are present in the gclient solution, but were not processed (due to custom_deps, |
+os_deps, etc.) |
+ |
+{ |
+ "solutions" : { |
+ "<name>": { # <name> is the posix-normalized path to the solution. |
+ "revision": [<svn rev int>|<git id hex string>|null], |
+ "scm": ["svn"|"git"|null], |
+ } |
+ } |
+} |
""") |
def CMDsync(parser, args): |
"""Checkout/update all modules.""" |
@@ -1573,6 +1598,9 @@ def CMDsync(parser, args): |
'actual HEAD revision from the repository') |
parser.add_option('--upstream', action='store_true', |
help='Make repo state match upstream branch.') |
+ parser.add_option('--output-json', |
+ help='Output a json document to this path containing ' |
+ 'summary information about the sync.') |
(options, args) = parser.parse_args(args) |
client = GClient.LoadCurrentConfig(options) |
@@ -1587,7 +1615,18 @@ def CMDsync(parser, args): |
# Print out the .gclient file. This is longer than if we just printed the |
# client dict, but more legible, and it might contain helpful comments. |
print(client.config_content) |
- return client.RunOnDeps('update', args) |
+ ret = client.RunOnDeps('update', args) |
+ if options.output_json: |
+ slns = {} |
+ for d in client.subtree(True): |
+ normed = d.name.replace('\\', '/').rstrip('/') + '/' |
+ slns[normed] = { |
+ 'revision': d.got_revision, |
+ 'scm': d.used_scm.name if d.used_scm else None, |
+ } |
+ with open(options.output_json, 'wb') as f: |
+ json.dump({'solutions': slns}, f) |
+ return ret |
CMDupdate = CMDsync |