Chromium Code Reviews| 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 266 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 277 return _inner_gen().next | 277 return _inner_gen().next |
| 278 | 278 |
| 279 | 279 |
| 280 ## Git functions | 280 ## Git functions |
| 281 | 281 |
| 282 | 282 |
| 283 def branch_config(branch, option, default=None): | 283 def branch_config(branch, option, default=None): |
| 284 return config('branch.%s.%s' % (branch, option), default=default) | 284 return config('branch.%s.%s' % (branch, option), default=default) |
| 285 | 285 |
| 286 | 286 |
| 287 def config_regexp(pattern): | |
| 288 if sys.platform.startswith('win'): | |
|
M-A Ruel
2016/01/08 21:11:21
if sys.platform == 'win32':
the format you used w
| |
| 289 # this madness is because we call git.bat which calls git.exe which calls | |
| 290 # bash.exe (or something to that effect). Each layer divides the number of | |
| 291 # ^'s by 2. | |
| 292 pattern = pattern.replace('^', '^' * 8) | |
| 293 return run('config', '--get-regexp', pattern).splitlines() | |
| 294 | |
| 295 | |
| 287 def branch_config_map(option): | 296 def branch_config_map(option): |
| 288 """Return {branch: <|option| value>} for all branches.""" | 297 """Return {branch: <|option| value>} for all branches.""" |
| 289 try: | 298 try: |
| 290 reg = re.compile(r'^branch\.(.*)\.%s$' % option) | 299 reg = re.compile(r'^branch\.(.*)\.%s$' % option) |
| 291 lines = run('config', '--get-regexp', reg.pattern).splitlines() | 300 lines = config_regexp(reg.pattern) |
| 292 return {reg.match(k).group(1): v for k, v in (l.split() for l in lines)} | 301 return {reg.match(k).group(1): v for k, v in (l.split() for l in lines)} |
| 293 except subprocess2.CalledProcessError: | 302 except subprocess2.CalledProcessError: |
| 294 return {} | 303 return {} |
| 295 | 304 |
| 296 | 305 |
| 297 def branches(*args): | 306 def branches(*args): |
| 298 NO_BRANCH = ('* (no branch', '* (detached', '* (HEAD detached') | 307 NO_BRANCH = ('* (no branch', '* (detached', '* (HEAD detached') |
| 299 | 308 |
| 300 key = 'depot-tools.branch-limit' | 309 key = 'depot-tools.branch-limit' |
| 301 limit = 20 | 310 limit = 20 |
| (...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 546 | 555 |
| 547 | 556 |
| 548 def run_with_retcode(*cmd, **kwargs): | 557 def run_with_retcode(*cmd, **kwargs): |
| 549 """Run a command but only return the status code.""" | 558 """Run a command but only return the status code.""" |
| 550 try: | 559 try: |
| 551 run(*cmd, **kwargs) | 560 run(*cmd, **kwargs) |
| 552 return 0 | 561 return 0 |
| 553 except subprocess2.CalledProcessError as cpe: | 562 except subprocess2.CalledProcessError as cpe: |
| 554 return cpe.returncode | 563 return cpe.returncode |
| 555 | 564 |
| 556 | |
| 557 def run_stream(*cmd, **kwargs): | 565 def run_stream(*cmd, **kwargs): |
| 558 """Runs a git command. Returns stdout as a PIPE (file-like object). | 566 """Runs a git command. Returns stdout as a PIPE (file-like object). |
| 559 | 567 |
| 560 stderr is dropped to avoid races if the process outputs to both stdout and | 568 stderr is dropped to avoid races if the process outputs to both stdout and |
| 561 stderr. | 569 stderr. |
| 562 """ | 570 """ |
| 563 kwargs.setdefault('stderr', subprocess2.VOID) | 571 kwargs.setdefault('stderr', subprocess2.VOID) |
| 564 kwargs.setdefault('stdout', subprocess2.PIPE) | 572 kwargs.setdefault('stdout', subprocess2.PIPE) |
| 573 kwargs.setdefault('shell', False) | |
|
iannucci
2016/01/08 02:14:56
GIT_EXE is always an absolute path, so we don't ne
| |
| 565 cmd = (GIT_EXE, '-c', 'color.ui=never') + cmd | 574 cmd = (GIT_EXE, '-c', 'color.ui=never') + cmd |
| 566 proc = subprocess2.Popen(cmd, **kwargs) | 575 proc = subprocess2.Popen(cmd, **kwargs) |
| 567 return proc.stdout | 576 return proc.stdout |
| 568 | 577 |
| 569 | 578 |
| 570 @contextlib.contextmanager | 579 @contextlib.contextmanager |
| 571 def run_stream_with_retcode(*cmd, **kwargs): | 580 def run_stream_with_retcode(*cmd, **kwargs): |
| 572 """Runs a git command as context manager yielding stdout as a PIPE. | 581 """Runs a git command as context manager yielding stdout as a PIPE. |
| 573 | 582 |
| 574 stderr is dropped to avoid races if the process outputs to both stdout and | 583 stderr is dropped to avoid races if the process outputs to both stdout and |
| 575 stderr. | 584 stderr. |
| 576 | 585 |
| 577 Raises subprocess2.CalledProcessError on nonzero return code. | 586 Raises subprocess2.CalledProcessError on nonzero return code. |
| 578 """ | 587 """ |
| 579 kwargs.setdefault('stderr', subprocess2.VOID) | 588 kwargs.setdefault('stderr', subprocess2.VOID) |
| 580 kwargs.setdefault('stdout', subprocess2.PIPE) | 589 kwargs.setdefault('stdout', subprocess2.PIPE) |
| 590 kwargs.setdefault('shell', False) | |
| 581 cmd = (GIT_EXE, '-c', 'color.ui=never') + cmd | 591 cmd = (GIT_EXE, '-c', 'color.ui=never') + cmd |
| 582 try: | 592 try: |
| 583 proc = subprocess2.Popen(cmd, **kwargs) | 593 proc = subprocess2.Popen(cmd, **kwargs) |
| 584 yield proc.stdout | 594 yield proc.stdout |
| 585 finally: | 595 finally: |
| 586 retcode = proc.wait() | 596 retcode = proc.wait() |
| 587 if retcode != 0: | 597 if retcode != 0: |
| 588 raise subprocess2.CalledProcessError(retcode, cmd, os.getcwd(), | 598 raise subprocess2.CalledProcessError(retcode, cmd, os.getcwd(), |
| 589 None, None) | 599 None, None) |
| 590 | 600 |
| 591 | 601 |
| 592 def run_with_stderr(*cmd, **kwargs): | 602 def run_with_stderr(*cmd, **kwargs): |
| 593 """Runs a git command. | 603 """Runs a git command. |
| 594 | 604 |
| 595 Returns (stdout, stderr) as a pair of strings. | 605 Returns (stdout, stderr) as a pair of strings. |
| 596 | 606 |
| 597 kwargs | 607 kwargs |
| 598 autostrip (bool) - Strip the output. Defaults to True. | 608 autostrip (bool) - Strip the output. Defaults to True. |
| 599 indata (str) - Specifies stdin data for the process. | 609 indata (str) - Specifies stdin data for the process. |
| 600 """ | 610 """ |
| 601 kwargs.setdefault('stdin', subprocess2.PIPE) | 611 kwargs.setdefault('stdin', subprocess2.PIPE) |
| 602 kwargs.setdefault('stdout', subprocess2.PIPE) | 612 kwargs.setdefault('stdout', subprocess2.PIPE) |
| 603 kwargs.setdefault('stderr', subprocess2.PIPE) | 613 kwargs.setdefault('stderr', subprocess2.PIPE) |
| 614 kwargs.setdefault('shell', False) | |
| 604 autostrip = kwargs.pop('autostrip', True) | 615 autostrip = kwargs.pop('autostrip', True) |
| 605 indata = kwargs.pop('indata', None) | 616 indata = kwargs.pop('indata', None) |
| 606 | 617 |
| 607 cmd = (GIT_EXE, '-c', 'color.ui=never') + cmd | 618 cmd = (GIT_EXE, '-c', 'color.ui=never') + cmd |
| 608 proc = subprocess2.Popen(cmd, **kwargs) | 619 proc = subprocess2.Popen(cmd, **kwargs) |
| 609 ret, err = proc.communicate(indata) | 620 ret, err = proc.communicate(indata) |
| 610 retcode = proc.wait() | 621 retcode = proc.wait() |
| 611 if retcode != 0: | 622 if retcode != 0: |
| 612 raise subprocess2.CalledProcessError(retcode, cmd, os.getcwd(), ret, err) | 623 raise subprocess2.CalledProcessError(retcode, cmd, os.getcwd(), ret, err) |
| 613 | 624 |
| (...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 848 ['HEAD']) | 859 ['HEAD']) |
| 849 | 860 |
| 850 | 861 |
| 851 def clone_file(repository, new_workdir, link, operation): | 862 def clone_file(repository, new_workdir, link, operation): |
| 852 if not os.path.exists(os.path.join(repository, link)): | 863 if not os.path.exists(os.path.join(repository, link)): |
| 853 return | 864 return |
| 854 link_dir = os.path.dirname(os.path.join(new_workdir, link)) | 865 link_dir = os.path.dirname(os.path.join(new_workdir, link)) |
| 855 if not os.path.exists(link_dir): | 866 if not os.path.exists(link_dir): |
| 856 os.makedirs(link_dir) | 867 os.makedirs(link_dir) |
| 857 operation(os.path.join(repository, link), os.path.join(new_workdir, link)) | 868 operation(os.path.join(repository, link), os.path.join(new_workdir, link)) |
| OLD | NEW |