blob: 6bcd1ba4db8da6a7d94e72c5359ecdf81617e062 [file] [log] [blame]
#!/usr/bin/env python2
# -*- coding: utf-8 -*-
# Copyright 2017 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Git bisector to bisect a range of git commits.
Example:
$ ./bisect_git.py init --old rev1 --new rev2 --git_repo /path/to/git/repo
$ ./bisect_git.py config switch ./switch_git.py
$ ./bisect_git.py config eval ./eval-manually.sh
$ ./bisect_git.py run
"""
from __future__ import print_function
from bisect_kit import cli
from bisect_kit import core
from bisect_kit import git_util
class GitDomain(core.BisectDomain):
"""BisectDomain for git revisions."""
revtype = staticmethod(git_util.argtype_git_rev)
help = globals()['__doc__']
@staticmethod
def add_init_arguments(parser):
parser.add_argument(
'--git_repo',
required=True,
type=cli.argtype_dir_path,
help='Git repository path')
@staticmethod
def init(opts):
for rev in (opts.old, opts.new):
if not git_util.is_containing_commit(opts.git_repo, rev):
raise ValueError('rev=%s is not in git_repo=%r' % (rev, opts.git_repo))
config = dict(git_repo=opts.git_repo)
revlist = git_util.get_revlist(opts.git_repo, opts.old, opts.new)
return config, revlist
def __init__(self, config):
self.config = config
def setenv(self, env, rev):
env['GIT_REPO'] = self.config['git_repo']
env['GIT_REV'] = rev
def view(self, old, new):
print('git log %s..%s' % (old, new))
if __name__ == '__main__':
cli.BisectorCommandLine(GitDomain).main()