Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(358)

Side by Side Diff: git_common.py

Issue 240203005: Implement git-drover. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/tools/depot_tools
Patch Set: address feedback Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « git_cache.py ('k') | git_drover.py » ('j') | git_drover.py » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 12 matching lines...) Expand all
23 import os 23 import os
24 import re 24 import re
25 import signal 25 import signal
26 import sys 26 import sys
27 import tempfile 27 import tempfile
28 import textwrap 28 import textwrap
29 import threading 29 import threading
30 30
31 import subprocess2 31 import subprocess2
32 32
33 import git_cache
34
33 35
34 GIT_EXE = 'git.bat' if sys.platform.startswith('win') else 'git' 36 GIT_EXE = 'git.bat' if sys.platform.startswith('win') else 'git'
35 TEST_MODE = False 37 TEST_MODE = False
36 38
37 FREEZE = 'FREEZE' 39 FREEZE = 'FREEZE'
38 FREEZE_SECTIONS = { 40 FREEZE_SECTIONS = {
39 'indexed': 'soft', 41 'indexed': 'soft',
40 'unindexed': 'mixed' 42 'unindexed': 'mixed'
41 } 43 }
42 FREEZE_MATCHER = re.compile(r'%s.(%s)' % (FREEZE, '|'.join(FREEZE_SECTIONS))) 44 FREEZE_MATCHER = re.compile(r'%s.(%s)' % (FREEZE, '|'.join(FREEZE_SECTIONS)))
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after
208 with self._dead_cond: 210 with self._dead_cond:
209 self._dead_cond.notifyAll() 211 self._dead_cond.notifyAll()
210 self._thread.join() 212 self._thread.join()
211 del self._thread 213 del self._thread
212 214
213 215
214 def once(function): 216 def once(function):
215 """@Decorates |function| so that it only performs its action once, no matter 217 """@Decorates |function| so that it only performs its action once, no matter
216 how many times the decorated |function| is called.""" 218 how many times the decorated |function| is called."""
217 def _inner_gen(): 219 def _inner_gen():
218 yield function() 220 ret = function()
221 yield ret
219 while True: 222 while True:
220 yield 223 yield ret
221 return _inner_gen().next 224 return _inner_gen().next
222 225
223 226
224 ## Git functions 227 ## Git functions
225 228
226 229
227 def branch_config(branch, option, default=None): 230 def branch_config(branch, option, default=None):
228 return config('branch.%s.%s' % (branch, option), default=default) 231 return config('branch.%s.%s' % (branch, option), default=default)
229 232
230 233
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
268 271
269 def run_with_retcode(*cmd, **kwargs): 272 def run_with_retcode(*cmd, **kwargs):
270 """Run a command but only return the status code.""" 273 """Run a command but only return the status code."""
271 try: 274 try:
272 run(*cmd, **kwargs) 275 run(*cmd, **kwargs)
273 return 0 276 return 0
274 except subprocess2.CalledProcessError as cpe: 277 except subprocess2.CalledProcessError as cpe:
275 return cpe.returncode 278 return cpe.returncode
276 279
277 280
281 def cached_fetch(commits):
282 m = git_cache.Mirror.from_repo('.')
283 if m:
284 m.populate(fetch_specs=commits)
285 else:
286 for commit in commits:
287 run('fetch', 'origin', commit)
288
289
290 def check(*args, **kwargs):
291 try:
292 run(*args, **kwargs)
293 return True
294 except subprocess2.CalledProcessError:
295 return False
296
297
278 def config(option, default=None): 298 def config(option, default=None):
279 try: 299 try:
280 return run('config', '--get', option) or default 300 return run('config', '--get', option) or default
281 except subprocess2.CalledProcessError: 301 except subprocess2.CalledProcessError:
282 return default 302 return default
283 303
284 304
285 def config_list(option): 305 def config_list(option):
286 try: 306 try:
287 return run('config', '--get-all', option).split() 307 return run('config', '--get-all', option).split()
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
368 else: 388 else:
369 logging.debug('Found pre-set merge-base for %s: %s', branch, base) 389 logging.debug('Found pre-set merge-base for %s: %s', branch, base)
370 390
371 if not base: 391 if not base:
372 base = actual_merge_base 392 base = actual_merge_base
373 manual_merge_base(branch, base) 393 manual_merge_base(branch, base)
374 394
375 return base 395 return base
376 396
377 397
398 def get_remote_url(remote):
399 m = git_cache.Mirror.from_repo('.')
400 if m:
401 return m.url
402
403 return config('remote.%s.url' % remote)
404
405
378 def hash_multi(*reflike): 406 def hash_multi(*reflike):
379 return run('rev-parse', *reflike).splitlines() 407 return run('rev-parse', *reflike).splitlines()
380 408
381 409
382 def hash_one(reflike): 410 def hash_one(reflike):
383 return run('rev-parse', reflike) 411 return run('rev-parse', reflike)
384 412
385 413
386 def in_rebase(): 414 def in_rebase():
387 git_dir = run('rev-parse', '--git-dir') 415 git_dir = run('rev-parse', '--git-dir')
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
505 Returns (stdout, stderr) as a pair of strings. 533 Returns (stdout, stderr) as a pair of strings.
506 534
507 kwargs 535 kwargs
508 autostrip (bool) - Strip the output. Defaults to True. 536 autostrip (bool) - Strip the output. Defaults to True.
509 indata (str) - Specifies stdin data for the process. 537 indata (str) - Specifies stdin data for the process.
510 """ 538 """
511 kwargs.setdefault('stdin', subprocess2.PIPE) 539 kwargs.setdefault('stdin', subprocess2.PIPE)
512 kwargs.setdefault('stdout', subprocess2.PIPE) 540 kwargs.setdefault('stdout', subprocess2.PIPE)
513 kwargs.setdefault('stderr', subprocess2.PIPE) 541 kwargs.setdefault('stderr', subprocess2.PIPE)
514 autostrip = kwargs.pop('autostrip', True) 542 autostrip = kwargs.pop('autostrip', True)
543 verbose = kwargs.pop('verbose', False)
515 indata = kwargs.pop('indata', None) 544 indata = kwargs.pop('indata', None)
516 545
517 cmd = (GIT_EXE, '-c', 'color.ui=never') + cmd 546 cmd = (GIT_EXE, '-c', 'color.ui=never') + cmd
547 if verbose:
548 print "running `%s`" % (cmd,)
518 proc = subprocess2.Popen(cmd, **kwargs) 549 proc = subprocess2.Popen(cmd, **kwargs)
519 ret, err = proc.communicate(indata) 550 ret, err = proc.communicate(indata)
520 retcode = proc.wait() 551 retcode = proc.wait()
521 if retcode != 0: 552 if retcode != 0:
522 raise subprocess2.CalledProcessError(retcode, cmd, os.getcwd(), ret, err) 553 raise subprocess2.CalledProcessError(retcode, cmd, os.getcwd(), ret, err)
523 554
524 if autostrip: 555 if autostrip:
525 ret = (ret or '').strip() 556 ret = (ret or '').strip()
526 err = (err or '').strip() 557 err = (err or '').strip()
527 558
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
650 return None 681 return None
651 return ret 682 return ret
652 683
653 684
654 def upstream(branch): 685 def upstream(branch):
655 try: 686 try:
656 return run('rev-parse', '--abbrev-ref', '--symbolic-full-name', 687 return run('rev-parse', '--abbrev-ref', '--symbolic-full-name',
657 branch+'@{upstream}') 688 branch+'@{upstream}')
658 except subprocess2.CalledProcessError: 689 except subprocess2.CalledProcessError:
659 return None 690 return None
691
692
693 def verify_commit(commit):
694 return check('rev-parse', '--quiet', '--verify', '%s^{commit}' % commit)
OLDNEW
« no previous file with comments | « git_cache.py ('k') | git_drover.py » ('j') | git_drover.py » ('J')

Powered by Google App Engine
This is Rietveld 408576698