| OLD | NEW |
| 1 # Copyright 2014 The Chromium Authors. All rights reserved. | 1 # Copyright 2014 The Chromium Authors. 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 # Monkeypatch IMapIterator so that Ctrl-C can kill everything properly. | 5 # Monkeypatch IMapIterator so that Ctrl-C can kill everything properly. |
| 6 # Derived from https://gist.github.com/aljungberg/626518 | 6 # Derived from https://gist.github.com/aljungberg/626518 |
| 7 import multiprocessing.pool | 7 import multiprocessing.pool |
| 8 from multiprocessing.pool import IMapIterator | 8 from multiprocessing.pool import IMapIterator |
| 9 def wrapper(func): | 9 def wrapper(func): |
| 10 def wrap(self, timeout=None): | 10 def wrap(self, timeout=None): |
| (...skipping 15 matching lines...) Expand all Loading... |
| 26 import signal | 26 import signal |
| 27 import sys | 27 import sys |
| 28 import tempfile | 28 import tempfile |
| 29 import textwrap | 29 import textwrap |
| 30 import threading | 30 import threading |
| 31 | 31 |
| 32 import subprocess2 | 32 import subprocess2 |
| 33 | 33 |
| 34 ROOT = os.path.abspath(os.path.dirname(__file__)) | 34 ROOT = os.path.abspath(os.path.dirname(__file__)) |
| 35 | 35 |
| 36 GIT_EXE = ROOT+'\\git.bat' if sys.platform.startswith('win') else 'git' | 36 IS_WIN = sys.platform == 'win32' |
| 37 GIT_EXE = ROOT+'\\git.bat' if IS_WIN else 'git' |
| 37 TEST_MODE = False | 38 TEST_MODE = False |
| 38 | 39 |
| 39 FREEZE = 'FREEZE' | 40 FREEZE = 'FREEZE' |
| 40 FREEZE_SECTIONS = { | 41 FREEZE_SECTIONS = { |
| 41 'indexed': 'soft', | 42 'indexed': 'soft', |
| 42 'unindexed': 'mixed' | 43 'unindexed': 'mixed' |
| 43 } | 44 } |
| 44 FREEZE_MATCHER = re.compile(r'%s.(%s)' % (FREEZE, '|'.join(FREEZE_SECTIONS))) | 45 FREEZE_MATCHER = re.compile(r'%s.(%s)' % (FREEZE, '|'.join(FREEZE_SECTIONS))) |
| 45 | 46 |
| 46 | 47 |
| (...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 277 return _inner_gen().next | 278 return _inner_gen().next |
| 278 | 279 |
| 279 | 280 |
| 280 ## Git functions | 281 ## Git functions |
| 281 | 282 |
| 282 | 283 |
| 283 def branch_config(branch, option, default=None): | 284 def branch_config(branch, option, default=None): |
| 284 return config('branch.%s.%s' % (branch, option), default=default) | 285 return config('branch.%s.%s' % (branch, option), default=default) |
| 285 | 286 |
| 286 | 287 |
| 288 def config_regexp(pattern): |
| 289 if IS_WIN: # pragma: no cover |
| 290 # this madness is because we call git.bat which calls git.exe which calls |
| 291 # bash.exe (or something to that effect). Each layer divides the number of |
| 292 # ^'s by 2. |
| 293 pattern = pattern.replace('^', '^' * 8) |
| 294 return run('config', '--get-regexp', pattern).splitlines() |
| 295 |
| 296 |
| 287 def branch_config_map(option): | 297 def branch_config_map(option): |
| 288 """Return {branch: <|option| value>} for all branches.""" | 298 """Return {branch: <|option| value>} for all branches.""" |
| 289 try: | 299 try: |
| 290 reg = re.compile(r'^branch\.(.*)\.%s$' % option) | 300 reg = re.compile(r'^branch\.(.*)\.%s$' % option) |
| 291 lines = run('config', '--get-regexp', reg.pattern).splitlines() | 301 lines = config_regexp(reg.pattern) |
| 292 return {reg.match(k).group(1): v for k, v in (l.split() for l in lines)} | 302 return {reg.match(k).group(1): v for k, v in (l.split() for l in lines)} |
| 293 except subprocess2.CalledProcessError: | 303 except subprocess2.CalledProcessError: |
| 294 return {} | 304 return {} |
| 295 | 305 |
| 296 | 306 |
| 297 def branches(*args): | 307 def branches(*args): |
| 298 NO_BRANCH = ('* (no branch', '* (detached', '* (HEAD detached') | 308 NO_BRANCH = ('* (no branch', '* (detached', '* (HEAD detached') |
| 299 | 309 |
| 300 key = 'depot-tools.branch-limit' | 310 key = 'depot-tools.branch-limit' |
| 301 limit = 20 | 311 limit = 20 |
| (...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 546 | 556 |
| 547 | 557 |
| 548 def run_with_retcode(*cmd, **kwargs): | 558 def run_with_retcode(*cmd, **kwargs): |
| 549 """Run a command but only return the status code.""" | 559 """Run a command but only return the status code.""" |
| 550 try: | 560 try: |
| 551 run(*cmd, **kwargs) | 561 run(*cmd, **kwargs) |
| 552 return 0 | 562 return 0 |
| 553 except subprocess2.CalledProcessError as cpe: | 563 except subprocess2.CalledProcessError as cpe: |
| 554 return cpe.returncode | 564 return cpe.returncode |
| 555 | 565 |
| 556 | |
| 557 def run_stream(*cmd, **kwargs): | 566 def run_stream(*cmd, **kwargs): |
| 558 """Runs a git command. Returns stdout as a PIPE (file-like object). | 567 """Runs a git command. Returns stdout as a PIPE (file-like object). |
| 559 | 568 |
| 560 stderr is dropped to avoid races if the process outputs to both stdout and | 569 stderr is dropped to avoid races if the process outputs to both stdout and |
| 561 stderr. | 570 stderr. |
| 562 """ | 571 """ |
| 563 kwargs.setdefault('stderr', subprocess2.VOID) | 572 kwargs.setdefault('stderr', subprocess2.VOID) |
| 564 kwargs.setdefault('stdout', subprocess2.PIPE) | 573 kwargs.setdefault('stdout', subprocess2.PIPE) |
| 574 kwargs.setdefault('shell', False) |
| 565 cmd = (GIT_EXE, '-c', 'color.ui=never') + cmd | 575 cmd = (GIT_EXE, '-c', 'color.ui=never') + cmd |
| 566 proc = subprocess2.Popen(cmd, **kwargs) | 576 proc = subprocess2.Popen(cmd, **kwargs) |
| 567 return proc.stdout | 577 return proc.stdout |
| 568 | 578 |
| 569 | 579 |
| 570 @contextlib.contextmanager | 580 @contextlib.contextmanager |
| 571 def run_stream_with_retcode(*cmd, **kwargs): | 581 def run_stream_with_retcode(*cmd, **kwargs): |
| 572 """Runs a git command as context manager yielding stdout as a PIPE. | 582 """Runs a git command as context manager yielding stdout as a PIPE. |
| 573 | 583 |
| 574 stderr is dropped to avoid races if the process outputs to both stdout and | 584 stderr is dropped to avoid races if the process outputs to both stdout and |
| 575 stderr. | 585 stderr. |
| 576 | 586 |
| 577 Raises subprocess2.CalledProcessError on nonzero return code. | 587 Raises subprocess2.CalledProcessError on nonzero return code. |
| 578 """ | 588 """ |
| 579 kwargs.setdefault('stderr', subprocess2.VOID) | 589 kwargs.setdefault('stderr', subprocess2.VOID) |
| 580 kwargs.setdefault('stdout', subprocess2.PIPE) | 590 kwargs.setdefault('stdout', subprocess2.PIPE) |
| 591 kwargs.setdefault('shell', False) |
| 581 cmd = (GIT_EXE, '-c', 'color.ui=never') + cmd | 592 cmd = (GIT_EXE, '-c', 'color.ui=never') + cmd |
| 582 try: | 593 try: |
| 583 proc = subprocess2.Popen(cmd, **kwargs) | 594 proc = subprocess2.Popen(cmd, **kwargs) |
| 584 yield proc.stdout | 595 yield proc.stdout |
| 585 finally: | 596 finally: |
| 586 retcode = proc.wait() | 597 retcode = proc.wait() |
| 587 if retcode != 0: | 598 if retcode != 0: |
| 588 raise subprocess2.CalledProcessError(retcode, cmd, os.getcwd(), | 599 raise subprocess2.CalledProcessError(retcode, cmd, os.getcwd(), |
| 589 None, None) | 600 None, None) |
| 590 | 601 |
| 591 | 602 |
| 592 def run_with_stderr(*cmd, **kwargs): | 603 def run_with_stderr(*cmd, **kwargs): |
| 593 """Runs a git command. | 604 """Runs a git command. |
| 594 | 605 |
| 595 Returns (stdout, stderr) as a pair of strings. | 606 Returns (stdout, stderr) as a pair of strings. |
| 596 | 607 |
| 597 kwargs | 608 kwargs |
| 598 autostrip (bool) - Strip the output. Defaults to True. | 609 autostrip (bool) - Strip the output. Defaults to True. |
| 599 indata (str) - Specifies stdin data for the process. | 610 indata (str) - Specifies stdin data for the process. |
| 600 """ | 611 """ |
| 601 kwargs.setdefault('stdin', subprocess2.PIPE) | 612 kwargs.setdefault('stdin', subprocess2.PIPE) |
| 602 kwargs.setdefault('stdout', subprocess2.PIPE) | 613 kwargs.setdefault('stdout', subprocess2.PIPE) |
| 603 kwargs.setdefault('stderr', subprocess2.PIPE) | 614 kwargs.setdefault('stderr', subprocess2.PIPE) |
| 615 kwargs.setdefault('shell', False) |
| 604 autostrip = kwargs.pop('autostrip', True) | 616 autostrip = kwargs.pop('autostrip', True) |
| 605 indata = kwargs.pop('indata', None) | 617 indata = kwargs.pop('indata', None) |
| 606 | 618 |
| 607 cmd = (GIT_EXE, '-c', 'color.ui=never') + cmd | 619 cmd = (GIT_EXE, '-c', 'color.ui=never') + cmd |
| 608 proc = subprocess2.Popen(cmd, **kwargs) | 620 proc = subprocess2.Popen(cmd, **kwargs) |
| 609 ret, err = proc.communicate(indata) | 621 ret, err = proc.communicate(indata) |
| 610 retcode = proc.wait() | 622 retcode = proc.wait() |
| 611 if retcode != 0: | 623 if retcode != 0: |
| 612 raise subprocess2.CalledProcessError(retcode, cmd, os.getcwd(), ret, err) | 624 raise subprocess2.CalledProcessError(retcode, cmd, os.getcwd(), ret, err) |
| 613 | 625 |
| (...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 848 ['HEAD']) | 860 ['HEAD']) |
| 849 | 861 |
| 850 | 862 |
| 851 def clone_file(repository, new_workdir, link, operation): | 863 def clone_file(repository, new_workdir, link, operation): |
| 852 if not os.path.exists(os.path.join(repository, link)): | 864 if not os.path.exists(os.path.join(repository, link)): |
| 853 return | 865 return |
| 854 link_dir = os.path.dirname(os.path.join(new_workdir, link)) | 866 link_dir = os.path.dirname(os.path.join(new_workdir, link)) |
| 855 if not os.path.exists(link_dir): | 867 if not os.path.exists(link_dir): |
| 856 os.makedirs(link_dir) | 868 os.makedirs(link_dir) |
| 857 operation(os.path.join(repository, link), os.path.join(new_workdir, link)) | 869 operation(os.path.join(repository, link), os.path.join(new_workdir, link)) |
| OLD | NEW |