code: def _get_start_revision(self, graph, benchmark, entry_name):
          
          start_revision = min(six.itervalues(self.revisions))
  
          if graph.params.get('branch'):
              branch_suffix = '@' + graph.params.get('branch')
          else:
              branch_suffix = ''
  
          for regex, start_commit in six.iteritems(self.conf.regressions_first_commits):
              if re.match(regex, entry_name + branch_suffix):
                  if start_commit is None:
                      # Disable regression detection completely
                      return None
  
                  if self.conf.branches == [None]:
                      key = (start_commit, None)
                  else:
                      key = (start_commit, graph.params.get('branch'))
  
                  if key not in self._start_revisions:
                      spec = self.repo.get_new_range_spec(*key)
                      start_hash = self.repo.get_hash_from_name(start_commit)
  
                      for commit in [start_hash] + self.repo.get_hashes_from_range(spec):
                          rev = self.revisions.get(commit)
                          if rev is not None:
                              self._start_revisions[key] = rev
                              break
                      else:
                          # Commit not found in the branch --- warn and ignore.
                          log.warning(("Commit {0} specified in `regressions_first_commits` "
                                    "not found in branch").format(start_commit))
                          self._start_revisions[key] = -1
  
                  start_revision = max(start_revision, self._start_revisions[key] + 1)
  
          return start_revision
docs: Compute the first revision allowed by asv.conf.json.
  
          Revisions correspond to linearized commit history and the
          regression detection runs on this order --- the starting commit
          thus corresponds to a specific starting revision.