| Index: appengine/findit/crash/changelist_classifier.py | 
| diff --git a/appengine/findit/crash/changelist_classifier.py b/appengine/findit/crash/changelist_classifier.py | 
| index 0bb80faa3cbd8adee6a573bfbeec1916443d15c5..0f7ad501f62f7c1308e9512755f156f31a0a01c8 100644 | 
| --- a/appengine/findit/crash/changelist_classifier.py | 
| +++ b/appengine/findit/crash/changelist_classifier.py | 
| @@ -20,14 +20,11 @@ from libs.gitiles.diff import ChangeType | 
|  | 
|  | 
| class ChangelistClassifier(namedtuple('ChangelistClassifier', | 
| -    ['repository', 'get_repository', 'top_n_results', 'confidence_threshold'])): | 
| +    ['get_repository', 'top_n_results', 'confidence_threshold'])): | 
| __slots__ = () | 
|  | 
| -  def __new__(cls, repository, get_repository, top_n_results=3, | 
| -              confidence_threshold=0.999): | 
| +  def __new__(cls, get_repository, top_n_results=3, confidence_threshold=0.999): | 
| """Args: | 
| -      repository (Repository): the Git repository of the main project | 
| -        we're trying to classify CLs from. | 
| get_repository (callable): a function from DEP urls to ``Repository`` | 
| objects, so we can get changelogs and blame for each dep. Notably, | 
| to keep the code here generic, we make no assumptions about | 
| @@ -40,7 +37,7 @@ class ChangelistClassifier(namedtuple('ChangelistClassifier', | 
| the first suspect. | 
| """ | 
| return super(cls, ChangelistClassifier).__new__( | 
| -        cls, repository, get_repository, top_n_results, confidence_threshold) | 
| +        cls, get_repository, top_n_results, confidence_threshold) | 
|  | 
| def __str__(self): # pragma: no cover | 
| return ('%s(top_n_results=%d, confidence_threshold=%g)' | 
| @@ -68,7 +65,7 @@ class ChangelistClassifier(namedtuple('ChangelistClassifier', | 
| logging.info('ChangelistClassifier.__call__: Regression range %s:%s', | 
| last_good_version, first_bad_version) | 
|  | 
| -    dependency_fetcher = ChromeDependencyFetcher(self.repository) | 
| +    dependency_fetcher = ChromeDependencyFetcher(self.get_repository) | 
|  | 
| # We are only interested in the deps in crash stack (the callstack that | 
| # caused the crash). | 
| @@ -96,7 +93,7 @@ class ChangelistClassifier(namedtuple('ChangelistClassifier', | 
| regression_deps_rolls[dep_path] = dep_roll | 
|  | 
| dep_to_file_to_changelogs, ignore_cls = GetChangeLogsForFilesGroupedByDeps( | 
| -        regression_deps_rolls, stack_deps, self.repository) | 
| +        regression_deps_rolls, stack_deps, self.get_repository) | 
| dep_to_file_to_stack_infos = GetStackInfosForFilesGroupedByDeps( | 
| report.stacktrace, stack_deps) | 
|  | 
| @@ -138,7 +135,7 @@ def GetDepsInCrashStack(crash_stack, crash_deps): | 
|  | 
| # TODO(katesonia): Remove the repository argument after refatoring cl committed. | 
| def GetChangeLogsForFilesGroupedByDeps(regression_deps_rolls, stack_deps, | 
| -                                       repository): | 
| +                                       get_repository): | 
| """Gets a dict containing files touched by changelogs for deps in stack_deps. | 
|  | 
| Regression ranges for each dep is determined by regression_deps_rolls. | 
| @@ -149,7 +146,13 @@ def GetChangeLogsForFilesGroupedByDeps(regression_deps_rolls, stack_deps, | 
| regression range. | 
| stack_deps (dict): Represents all the dependencies shown in | 
| the crash stack. | 
| -    repository (Repository): Repository to get changelogs from. | 
| +    get_repository (callable): a function from DEP urls to ``Repository`` | 
| +      objects, so we can get changelogs and blame for each dep. Notably, | 
| +      to keep the code here generic, we make no assumptions about | 
| +      which subclass of ``Repository`` this function returns. Thus, | 
| +      it is up to the caller to decide what class to return and handle | 
| +      any other arguments that class may require (e.g., an http client | 
| +      for ``GitilesRepository``). | 
|  | 
| Returns: | 
| A tuple (dep_to_file_to_changelogs, reverted_cls). | 
| @@ -199,7 +202,7 @@ def GetChangeLogsForFilesGroupedByDeps(regression_deps_rolls, stack_deps, | 
| if not dep_roll: | 
| continue | 
|  | 
| -    repository.repo_url = dep_roll.repo_url | 
| +    repository = get_repository(dep_roll.repo_url) | 
| changelogs = repository.GetChangeLogs(dep_roll.old_revision, | 
| dep_roll.new_revision) | 
|  | 
|  |