OLD | NEW |
1 #!/usr/bin/python | 1 #!/usr/bin/python |
2 # | 2 # |
3 # Copyright 2008 Google Inc. All Rights Reserved. | 3 # Copyright 2008 Google Inc. All Rights Reserved. |
4 # | 4 # |
5 # Licensed under the Apache License, Version 2.0 (the "License"); | 5 # Licensed under the Apache License, Version 2.0 (the "License"); |
6 # you may not use this file except in compliance with the License. | 6 # you may not use this file except in compliance with the License. |
7 # You may obtain a copy of the License at | 7 # You may obtain a copy of the License at |
8 # | 8 # |
9 # http://www.apache.org/licenses/LICENSE-2.0 | 9 # http://www.apache.org/licenses/LICENSE-2.0 |
10 # | 10 # |
(...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
251 #\"data/really_large_component\": None, | 251 #\"data/really_large_component\": None, |
252 }, | 252 }, |
253 \"safesync_url\": \"%s\" | 253 \"safesync_url\": \"%s\" |
254 } | 254 } |
255 ] | 255 ] |
256 """) | 256 """) |
257 | 257 |
258 | 258 |
259 ## Generic utils | 259 ## Generic utils |
260 | 260 |
261 | |
262 def getText(nodelist): | |
263 """ | |
264 Return the concatenated text for the children of a list of DOM nodes. | |
265 """ | |
266 rc = [] | |
267 for node in nodelist: | |
268 if node.nodeType == node.TEXT_NODE: | |
269 rc.append(node.data) | |
270 else: | |
271 rc.append(getText(node.childNodes)) | |
272 return ''.join(rc) | |
273 | |
274 | |
275 def ParseXML(output): | 261 def ParseXML(output): |
276 try: | 262 try: |
277 return xml.dom.minidom.parseString(output) | 263 return xml.dom.minidom.parseString(output) |
278 except xml.parsers.expat.ExpatError: | 264 except xml.parsers.expat.ExpatError: |
279 return None | 265 return None |
280 | 266 |
281 | 267 |
| 268 def GetNamedNodeText(node, node_name): |
| 269 child_nodes = node.getElementsByTagName(node_name) |
| 270 if not child_nodes: |
| 271 return None |
| 272 assert len(child_nodes) == 1 and child_nodes[0].childNodes.length == 1 |
| 273 return child_nodes[0].firstChild.nodeValue |
| 274 |
| 275 |
| 276 def GetNodeNamedAttributeText(node, node_name, attribute_name): |
| 277 child_nodes = node.getElementsByTagName(node_name) |
| 278 if not child_nodes: |
| 279 return None |
| 280 assert len(child_nodes) == 1 |
| 281 return child_nodes[0].getAttribute(attribute_name) |
| 282 |
| 283 |
282 class Error(Exception): | 284 class Error(Exception): |
283 """gclient exception class.""" | 285 """gclient exception class.""" |
284 pass | 286 pass |
285 | 287 |
286 class PrintableObject(object): | 288 class PrintableObject(object): |
287 def __str__(self): | 289 def __str__(self): |
288 output = '' | 290 output = '' |
289 for i in dir(self): | 291 for i in dir(self): |
290 if i.startswith('__'): | 292 if i.startswith('__'): |
291 continue | 293 continue |
(...skipping 266 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
558 """Runs 'svn info' on an existing path. | 560 """Runs 'svn info' on an existing path. |
559 | 561 |
560 Args: | 562 Args: |
561 relpath: The directory where the working copy resides relative to | 563 relpath: The directory where the working copy resides relative to |
562 the directory given by in_directory. | 564 the directory given by in_directory. |
563 in_directory: The directory where svn is to be run. | 565 in_directory: The directory where svn is to be run. |
564 | 566 |
565 Returns: | 567 Returns: |
566 An object with fields corresponding to the output of 'svn info' | 568 An object with fields corresponding to the output of 'svn info' |
567 """ | 569 """ |
568 info = CaptureSVN(options, ["info", "--xml", relpath], in_directory) | 570 dom = ParseXML(CaptureSVN(options, ["info", "--xml", relpath], in_directory)) |
569 dom = xml.dom.minidom.parseString(info) | |
570 | |
571 # str() the getText() results because they may be returned as | |
572 # Unicode, which interferes with the higher layers matching up | |
573 # things in the deps dictionary. | |
574 result = PrintableObject() | 571 result = PrintableObject() |
575 result.root = str(getText(dom.getElementsByTagName('root'))) | 572 if dom: |
576 result.url = str(getText(dom.getElementsByTagName('url'))) | 573 # /info/entry/ |
577 result.uuid = str(getText(dom.getElementsByTagName('uuid'))) | 574 # url |
578 result.revision = int(dom.getElementsByTagName('entry')[0].getAttribute( | 575 # reposityory/(root|uuid) |
579 'revision')) | 576 # wc-info/(schedule|depth) |
| 577 # commit/(author|date) |
| 578 # str() the results because they may be returned as Unicode, which |
| 579 # interferes with the higher layers matching up things in the deps |
| 580 # dictionary. |
| 581 result = PrintableObject() |
| 582 result.root = str(GetNamedNodeText(dom, 'root')) |
| 583 result.url = str(GetNamedNodeText(dom, 'url')) |
| 584 result.uuid = str(GetNamedNodeText(dom, 'uuid')) |
| 585 result.revision = int(GetNodeNamedAttributeText(dom, 'entry', 'revision')) |
580 return result | 586 return result |
581 | 587 |
582 | 588 |
583 def CaptureSVNHeadRevision(options, url): | 589 def CaptureSVNHeadRevision(options, url): |
584 """Get the head revision of a SVN repository. | 590 """Get the head revision of a SVN repository. |
585 | 591 |
586 Returns: | 592 Returns: |
587 Int head revision | 593 Int head revision |
588 """ | 594 """ |
589 info = CaptureSVN(options, ["info", "--xml", url], os.getcwd()) | 595 info = CaptureSVN(options, ["info", "--xml", url], os.getcwd()) |
(...skipping 1106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1696 | 1702 |
1697 if "__main__" == __name__: | 1703 if "__main__" == __name__: |
1698 try: | 1704 try: |
1699 result = Main(sys.argv) | 1705 result = Main(sys.argv) |
1700 except Error, e: | 1706 except Error, e: |
1701 print "Error: %s" % str(e) | 1707 print "Error: %s" % str(e) |
1702 result = 1 | 1708 result = 1 |
1703 sys.exit(result) | 1709 sys.exit(result) |
1704 | 1710 |
1705 # vim: ts=2:sw=2:tw=80:et: | 1711 # vim: ts=2:sw=2:tw=80:et: |
OLD | NEW |