| Index: tools/bisect-builds.py
|
| diff --git a/tools/bisect-builds.py b/tools/bisect-builds.py
|
| index 299aade2277ccca5d8598619e2d3cdf40f91ebce..02ce053dba0202d7910137dd663f1d94b7b5f3d7 100644
|
| --- a/tools/bisect-builds.py
|
| +++ b/tools/bisect-builds.py
|
| @@ -199,21 +199,37 @@ def UnzipFilenameToDir(filename, dir):
|
| sys.exit(1)
|
|
|
|
|
| -def FetchRevision(context, rev, filename, quit_event=None):
|
| +def FetchRevision(context, rev, filename, quit_event=None, progress_event=None):
|
| """Downloads and unzips revision |rev|.
|
| @param context A PathContext instance.
|
| @param rev The Chromium revision number/tag to download.
|
| @param filename The destination for the downloaded file.
|
| @param quit_event A threading.Event which will be set by the master thread to
|
| indicate that the download should be aborted.
|
| + @param progress_event A threading.Event which will be set by the master thread
|
| + to indicate that the progress of the download should be
|
| + displayed.
|
| """
|
| def ReportHook(blocknum, blocksize, totalsize):
|
| if quit_event and quit_event.is_set():
|
| raise RuntimeError("Aborting download of revision %d" % rev)
|
| + if progress_event and progress_event.is_set():
|
| + size = blocknum * blocksize
|
| + if totalsize == -1: # Total size not known.
|
| + progress = "Received %d bytes" % size
|
| + else:
|
| + size = min(totalsize, size)
|
| + progress = "Received %d of %d bytes, %.2f%%" % (
|
| + size, totalsize, 100.0 * size / totalsize)
|
| + # Send a \r to let all progress messages use just one line of output.
|
| + sys.stdout.write("\r" + progress)
|
| + sys.stdout.flush()
|
|
|
| download_url = context.GetDownloadURL(rev)
|
| try:
|
| urllib.urlretrieve(download_url, filename, ReportHook)
|
| + if progress_event and progress_event.is_set():
|
| + print()
|
| except RuntimeError, e:
|
| pass
|
|
|
| @@ -248,7 +264,7 @@ def AskIsGoodBuild(rev, status, stdout, stderr):
|
| """Ask the user whether build |rev| is good or bad."""
|
| # Loop until we get a response that we can parse.
|
| while True:
|
| - response = raw_input('\nRevision %d is [(g)ood/(b)ad/(q)uit]: ' % int(rev))
|
| + response = raw_input('Revision %d is [(g)ood/(b)ad/(q)uit]: ' % int(rev))
|
| if response and response in ('g', 'b'):
|
| return response == 'g'
|
| if response and response == 'q':
|
| @@ -295,6 +311,8 @@ def Bisect(platform,
|
| _GetDownloadPath = lambda rev: os.path.join(cwd,
|
| '%d-%s' % (rev, context.archive_name))
|
|
|
| + print "Downloading list of known revisions..."
|
| +
|
| revlist = context.GetRevList()
|
|
|
| # Get a list of revisions to bisect across.
|
| @@ -308,8 +326,11 @@ def Bisect(platform,
|
| pivot = bad / 2
|
| rev = revlist[pivot]
|
| zipfile = _GetDownloadPath(rev)
|
| + progress_event = threading.Event()
|
| + progress_event.set()
|
| print "Downloading revision %d..." % rev
|
| - FetchRevision(context, rev, zipfile)
|
| + FetchRevision(context, rev, zipfile,
|
| + quit_event=None, progress_event=progress_event)
|
|
|
| # Binary search time!
|
| while zipfile and bad - good > 1:
|
| @@ -323,8 +344,13 @@ def Bisect(platform,
|
| if down_pivot != pivot and down_pivot != good:
|
| down_rev = revlist[down_pivot]
|
| down_zipfile = _GetDownloadPath(down_rev)
|
| - down_event = threading.Event()
|
| - fetchargs = (context, down_rev, down_zipfile, down_event)
|
| + down_quit_event = threading.Event()
|
| + down_progress_event = threading.Event()
|
| + fetchargs = (context,
|
| + down_rev,
|
| + down_zipfile,
|
| + down_quit_event,
|
| + down_progress_event)
|
| down_thread = threading.Thread(target=FetchRevision,
|
| name='down_fetch',
|
| args=fetchargs)
|
| @@ -335,8 +361,13 @@ def Bisect(platform,
|
| if up_pivot != pivot and up_pivot != bad:
|
| up_rev = revlist[up_pivot]
|
| up_zipfile = _GetDownloadPath(up_rev)
|
| - up_event = threading.Event()
|
| - fetchargs = (context, up_rev, up_zipfile, up_event)
|
| + up_quit_event = threading.Event()
|
| + up_progress_event = threading.Event()
|
| + fetchargs = (context,
|
| + up_rev,
|
| + up_zipfile,
|
| + up_quit_event,
|
| + up_progress_event)
|
| up_thread = threading.Thread(target=FetchRevision,
|
| name='up_fetch',
|
| args=fetchargs)
|
| @@ -358,26 +389,29 @@ def Bisect(platform,
|
| if predicate(rev, status, stdout, stderr):
|
| good = pivot
|
| if down_thread:
|
| - down_event.set() # Kill the download of older revision.
|
| + down_quit_event.set() # Kill the download of older revision.
|
| down_thread.join()
|
| os.unlink(down_zipfile)
|
| if up_thread:
|
| print "Downloading revision %d..." % up_rev
|
| + up_progress_event.set() # Display progress of download.
|
| up_thread.join() # Wait for newer revision to finish downloading.
|
| pivot = up_pivot
|
| zipfile = up_zipfile
|
| else:
|
| bad = pivot
|
| if up_thread:
|
| - up_event.set() # Kill download of newer revision.
|
| + up_quit_event.set() # Kill download of newer revision.
|
| up_thread.join()
|
| os.unlink(up_zipfile)
|
| if down_thread:
|
| print "Downloading revision %d..." % down_rev
|
| + down_progress_event.set() # Display progress of download.
|
| down_thread.join() # Wait for older revision to finish downloading.
|
| pivot = down_pivot
|
| zipfile = down_zipfile
|
| except SystemExit:
|
| + print "Cleaning up..."
|
| for f in [down_zipfile, up_zipfile]:
|
| try:
|
| os.unlink(f)
|
|
|