def _NeedsSnapshot(repo_root, project):
    """Test if project's revision is reachable from its upstream ref."""
    # Some projects don't have an upstream set. Try 'master' anyway.
    branch = _GetUpstreamBranch(project) or 'master'
    upstream_ref = 'refs/remotes/%s/%s' % (project.Remote().GitName(), branch)
    project_path = os.path.join(repo_root, project.Path())
    try:
        if git.IsReachable(project_path, project.revision, upstream_ref):
            return False
    except cros_build_lib.RunCommandError as e:
        logging.debug('Reachability check failed: %s', e)
    logging.info('Project %s revision %s not reachable from upstream %r.',
                 project.name, project.revision, upstream_ref)
    return True
 def testIsReachableFalse(self):
     git1 = self._MakeRepo('git1', self.source)
     patch1 = self.CommitFile(git1, 'foo', 'foo')
     patch2 = self.CommitFile(git1, 'bar', 'bar')
     self.assertFalse(git.IsReachable(git1, patch2.sha1, patch1.sha1))