OLD | NEW |
1 # Copyright (c) 2012 Google Inc. All rights reserved. | 1 # Copyright (c) 2012 Google Inc. All rights reserved. |
2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
4 | 4 |
5 from __future__ import with_statement | 5 from __future__ import with_statement |
6 | 6 |
7 import collections | 7 import collections |
8 import errno | 8 import errno |
9 import filecmp | 9 import filecmp |
10 import os.path | 10 import os.path |
(...skipping 311 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
322 def WriteOnDiff(filename): | 322 def WriteOnDiff(filename): |
323 """Write to a file only if the new contents differ. | 323 """Write to a file only if the new contents differ. |
324 | 324 |
325 Arguments: | 325 Arguments: |
326 filename: name of the file to potentially write to. | 326 filename: name of the file to potentially write to. |
327 Returns: | 327 Returns: |
328 A file like object which will write to temporary file and only overwrite | 328 A file like object which will write to temporary file and only overwrite |
329 the target if it differs (on close). | 329 the target if it differs (on close). |
330 """ | 330 """ |
331 | 331 |
332 class Writer: | 332 class Writer(object): |
333 """Wrapper around file which only covers the target if it differs.""" | 333 """Wrapper around file which only covers the target if it differs.""" |
334 def __init__(self): | 334 def __init__(self): |
335 # Pick temporary file. | 335 # Pick temporary file. |
336 tmp_fd, self.tmp_path = tempfile.mkstemp( | 336 tmp_fd, self.tmp_path = tempfile.mkstemp( |
337 suffix='.tmp', | 337 suffix='.tmp', |
338 prefix=os.path.split(filename)[1] + '.gyp.', | 338 prefix=os.path.split(filename)[1] + '.gyp.', |
339 dir=os.path.split(filename)[0]) | 339 dir=os.path.split(filename)[0]) |
340 try: | 340 try: |
341 self.tmp_file = os.fdopen(tmp_fd, 'wb') | 341 self.tmp_file = os.fdopen(tmp_fd, 'wb') |
342 except Exception: | 342 except Exception: |
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
541 | 541 |
542 class CycleError(Exception): | 542 class CycleError(Exception): |
543 """An exception raised when an unexpected cycle is detected.""" | 543 """An exception raised when an unexpected cycle is detected.""" |
544 def __init__(self, nodes): | 544 def __init__(self, nodes): |
545 self.nodes = nodes | 545 self.nodes = nodes |
546 def __str__(self): | 546 def __str__(self): |
547 return 'CycleError: cycle involving: ' + str(self.nodes) | 547 return 'CycleError: cycle involving: ' + str(self.nodes) |
548 | 548 |
549 | 549 |
550 def TopologicallySorted(graph, get_edges): | 550 def TopologicallySorted(graph, get_edges): |
551 """Topologically sort based on a user provided edge definition. | 551 r"""Topologically sort based on a user provided edge definition. |
552 | 552 |
553 Args: | 553 Args: |
554 graph: A list of node names. | 554 graph: A list of node names. |
555 get_edges: A function mapping from node name to a hashable collection | 555 get_edges: A function mapping from node name to a hashable collection |
556 of node names which this node has outgoing edges to. | 556 of node names which this node has outgoing edges to. |
557 Returns: | 557 Returns: |
558 A list containing all of the node in graph in topological order. | 558 A list containing all of the node in graph in topological order. |
559 It is assumed that calling get_edges once for each node and caching is | 559 It is assumed that calling get_edges once for each node and caching is |
560 cheaper than repeatedly calling get_edges. | 560 cheaper than repeatedly calling get_edges. |
561 Raises: | 561 Raises: |
(...skipping 17 matching lines...) Expand all Loading... |
579 return | 579 return |
580 visited.add(node) | 580 visited.add(node) |
581 visiting.add(node) | 581 visiting.add(node) |
582 for neighbor in get_edges(node): | 582 for neighbor in get_edges(node): |
583 Visit(neighbor) | 583 Visit(neighbor) |
584 visiting.remove(node) | 584 visiting.remove(node) |
585 ordered_nodes.insert(0, node) | 585 ordered_nodes.insert(0, node) |
586 for node in sorted(graph): | 586 for node in sorted(graph): |
587 Visit(node) | 587 Visit(node) |
588 return ordered_nodes | 588 return ordered_nodes |
OLD | NEW |