| OLD | NEW |
| 1 # coding=utf8 | 1 # coding=utf8 |
| 2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | 2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
| 4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
| 5 """Utility functions to handle patches.""" | 5 """Utility functions to handle patches.""" |
| 6 | 6 |
| 7 import posixpath | 7 import posixpath |
| 8 import os | 8 import os |
| 9 import re | 9 import re |
| 10 | 10 |
| (...skipping 485 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 496 def __init__(self, patches): | 496 def __init__(self, patches): |
| 497 for p in patches: | 497 for p in patches: |
| 498 assert isinstance(p, FilePatchBase) | 498 assert isinstance(p, FilePatchBase) |
| 499 | 499 |
| 500 def key(p): | 500 def key(p): |
| 501 """Sort by ordering of application. | 501 """Sort by ordering of application. |
| 502 | 502 |
| 503 File move are first. | 503 File move are first. |
| 504 Deletes are last. | 504 Deletes are last. |
| 505 """ | 505 """ |
| 506 if p.source_filename: | 506 # The bool is necessary because None < 'string' but the reverse is needed. |
| 507 return (p.is_delete, p.source_filename_utf8, p.filename_utf8) | 507 return ( |
| 508 else: | 508 p.is_delete, |
| 509 # tuple are always greater than string, abuse that fact. | 509 # False is before True, so files *with* a source file will be first. |
| 510 return (p.is_delete, (p.filename_utf8,), p.filename_utf8) | 510 not bool(p.source_filename), |
| 511 p.source_filename_utf8, |
| 512 p.filename_utf8) |
| 511 | 513 |
| 512 self.patches = sorted(patches, key=key) | 514 self.patches = sorted(patches, key=key) |
| 513 | 515 |
| 514 def set_relpath(self, relpath): | 516 def set_relpath(self, relpath): |
| 515 """Used to offset the patch into a subdirectory.""" | 517 """Used to offset the patch into a subdirectory.""" |
| 516 for patch in self.patches: | 518 for patch in self.patches: |
| 517 patch.set_relpath(relpath) | 519 patch.set_relpath(relpath) |
| 518 | 520 |
| 519 def __iter__(self): | 521 def __iter__(self): |
| 520 for patch in self.patches: | 522 for patch in self.patches: |
| 521 yield patch | 523 yield patch |
| 522 | 524 |
| 523 def __getitem__(self, key): | 525 def __getitem__(self, key): |
| 524 return self.patches[key] | 526 return self.patches[key] |
| 525 | 527 |
| 526 @property | 528 @property |
| 527 def filenames(self): | 529 def filenames(self): |
| 528 return [p.filename for p in self.patches] | 530 return [p.filename for p in self.patches] |
| OLD | NEW |