bot_update: mooore refactor around _git_checkout.

Bug:
Change-Id: I7141022348cdfd4dafbd2fa00b5981faa0ba79e0
Reviewed-on: https://chromium-review.googlesource.com/771930
Commit-Queue: Andrii Shyshkalov <tandrii@chromium.org>
Reviewed-by: Jao-ke Chin-Lee <jchinlee@chromium.org>
changes/30/771930/5
Andrii Shyshkalov 8 years ago committed by Commit Bot
parent 75c0b4b715
commit ddfead3483

@ -545,23 +545,32 @@ def is_broken_repo_dir(repo_dir):
return not path.exists(os.path.join(repo_dir, '.git', 'config')) return not path.exists(os.path.join(repo_dir, '.git', 'config'))
def _maybe_break_locks(checkout_path): def _maybe_break_locks(checkout_path, tries=3):
"""This removes all .lock files from this repo's .git directory. """This removes all .lock files from this repo's .git directory.
In particular, this will cleanup index.lock files, as well as ref lock In particular, this will cleanup index.lock files, as well as ref lock
files. files.
""" """
git_dir = os.path.join(checkout_path, '.git') def attempt():
for dirpath, _, filenames in os.walk(git_dir): git_dir = os.path.join(checkout_path, '.git')
for filename in filenames: for dirpath, _, filenames in os.walk(git_dir):
if filename.endswith('.lock'): for filename in filenames:
to_break = os.path.join(dirpath, filename) if filename.endswith('.lock'):
print 'breaking lock: %s' % to_break to_break = os.path.join(dirpath, filename)
try: print 'breaking lock: %s' % to_break
os.remove(to_break) try:
except OSError as ex: os.remove(to_break)
print 'FAILED to break lock: %s: %s' % (to_break, ex) except OSError as ex:
raise print 'FAILED to break lock: %s: %s' % (to_break, ex)
raise
for _ in xrange(tries):
try:
attempt()
return
except Exception:
pass
def git_checkouts(solutions, revisions, shallow, refs, git_cache_dir, def git_checkouts(solutions, revisions, shallow, refs, git_cache_dir,
@ -577,7 +586,8 @@ def git_checkouts(solutions, revisions, shallow, refs, git_cache_dir,
raise Exception('%s exists after cache unlock' % filename) raise Exception('%s exists after cache unlock' % filename)
first_solution = True first_solution = True
for sln in solutions: for sln in solutions:
_git_checkout(sln, build_dir, revisions, shallow, refs, git_cache_dir, sln_dir = path.join(build_dir, sln['name'])
_git_checkout(sln, sln_dir, revisions, shallow, refs, git_cache_dir,
cleanup_dir) cleanup_dir)
if first_solution: if first_solution:
git_ref = git('log', '--format=%H', '--max-count=1', git_ref = git('log', '--format=%H', '--max-count=1',
@ -587,7 +597,7 @@ def git_checkouts(solutions, revisions, shallow, refs, git_cache_dir,
return git_ref return git_ref
def _git_checkout(sln, build_dir, revisions, shallow, refs, git_cache_dir, def _git_checkout(sln, sln_dir, revisions, shallow, refs, git_cache_dir,
cleanup_dir): cleanup_dir):
name = sln['name'] name = sln['name']
url = sln['url'] url = sln['url']
@ -595,7 +605,6 @@ def _git_checkout(sln, build_dir, revisions, shallow, refs, git_cache_dir,
# Experiments show there's little to be gained from # Experiments show there's little to be gained from
# a shallow clone of src. # a shallow clone of src.
shallow = False shallow = False
sln_dir = path.join(build_dir, name)
s = ['--shallow'] if shallow else [] s = ['--shallow'] if shallow else []
populate_cmd = (['cache', 'populate', '--ignore_locks', '-v', populate_cmd = (['cache', 'populate', '--ignore_locks', '-v',
'--cache-dir', git_cache_dir] + s + [url]) '--cache-dir', git_cache_dir] + s + [url])
@ -604,20 +613,17 @@ def _git_checkout(sln, build_dir, revisions, shallow, refs, git_cache_dir,
# Just in case we're hitting a different git server than the one from # Just in case we're hitting a different git server than the one from
# which the target revision was polled, we retry some. # which the target revision was polled, we retry some.
done = False
# One minute (5 tries with exp. backoff). We retry at least once regardless # One minute (5 tries with exp. backoff). We retry at least once regardless
# of deadline in case initial fetch takes longer than the deadline but does # of deadline in case initial fetch takes longer than the deadline but does
# not contain the required revision. # not contain the required revision.
deadline = time.time() + 60 deadline = time.time() + 60
tries = 0 tries = 0
while not done: while True:
git(*populate_cmd) git(*populate_cmd)
mirror_dir = git( mirror_dir = git(
'cache', 'exists', '--quiet', 'cache', 'exists', '--quiet',
'--cache-dir', git_cache_dir, url).strip() '--cache-dir', git_cache_dir, url).strip()
clone_cmd = (
'clone', '--no-checkout', '--local', '--shared', mirror_dir, sln_dir)
try: try:
# If repo deletion was aborted midway, it may have left .git in broken # If repo deletion was aborted midway, it may have left .git in broken
@ -628,7 +634,8 @@ def _git_checkout(sln, build_dir, revisions, shallow, refs, git_cache_dir,
# Use "tries=1", since we retry manually in this loop. # Use "tries=1", since we retry manually in this loop.
if not path.isdir(sln_dir): if not path.isdir(sln_dir):
git(*clone_cmd) git('clone', '--no-checkout', '--local', '--shared', mirror_dir,
sln_dir)
else: else:
git('remote', 'set-url', 'origin', mirror_dir, cwd=sln_dir) git('remote', 'set-url', 'origin', mirror_dir, cwd=sln_dir)
git('fetch', 'origin', cwd=sln_dir) git('fetch', 'origin', cwd=sln_dir)
@ -640,16 +647,11 @@ def _git_checkout(sln, build_dir, revisions, shallow, refs, git_cache_dir,
# This can make git commands that rely on locks fail. # This can make git commands that rely on locks fail.
# Try a few times in case Windows has trouble again (and again). # Try a few times in case Windows has trouble again (and again).
if sys.platform.startswith('win'): if sys.platform.startswith('win'):
tries = 3 _maybe_break_locks(sln_dir, tries=3)
while tries:
try:
_maybe_break_locks(sln_dir)
break
except Exception:
tries -= 1
force_solution_revision(name, url, revisions, sln_dir) force_solution_revision(name, url, revisions, sln_dir)
done = True git('clean', '-dff', cwd=sln_dir)
return
except SubprocessFailed as e: except SubprocessFailed as e:
# Exited abnormally, theres probably something wrong. # Exited abnormally, theres probably something wrong.
print 'Something failed: %s.' % str(e) print 'Something failed: %s.' % str(e)
@ -668,8 +670,6 @@ def _git_checkout(sln, build_dir, revisions, shallow, refs, git_cache_dir,
time.sleep(sleep_secs) time.sleep(sleep_secs)
remove(sln_dir, cleanup_dir) remove(sln_dir, cleanup_dir)
git('clean', '-dff', cwd=sln_dir)
def _download(url): def _download(url):
"""Fetch url and return content, with retries for flake.""" """Fetch url and return content, with retries for flake."""

Loading…
Cancel
Save