async def analyze(self, update: bool=False) -> List[Update]:
    'Analyze a tree and return needed Python frozen dependency updates.\n\n        Parameters\n        ----------\n        update : `bool`, optional\n            If set to `True`, leave the update applied.  This avoids having\n            to run ``make update-deps`` twice, once to see if an update is\n            needed and again to apply it properly.\n\n        Returns\n        -------\n        results : List[`neophile.update.base.Update`]\n            Will contain either no elements (no updates needed) or a single\n            element (an update needed).\n\n        Raises\n        ------\n        neophile.exceptions.UncommittedChangesError\n            The repository being analyzed has uncommitted changes and\n            therefore cannot be checked for updates.\n        subprocess.CalledProcessError\n            Running ``make update-deps`` failed.\n        '
    for name in ('Makefile', 'requirements/main.in'):
        if (not (self._root / name).exists()):
            return []
    repo = Repo(str(self._root))
    if repo.is_dirty():
        msg = 'Working tree contains uncommitted changes'
        raise UncommittedChangesError(msg)
    try:
        if self._virtualenv:
            self._virtualenv.run(['make', 'update-deps'], cwd=str(self._root), check=True, capture_output=True)
        else:
            subprocess.run(['make', 'update-deps'], cwd=str(self._root), check=True, capture_output=True)
    except subprocess.CalledProcessError as e:
        logging.error('make update-deps failed: %s%s', e.stdout, e.stderr)
        return []
    if (not repo.is_dirty()):
        return []
    if (not update):
        repo.git.restore('.')
    return [PythonFrozenUpdate(path=(self._root / 'requirements'), applied=update, virtualenv=self._virtualenv)]
Analyze a tree and return needed Python frozen dependency updates.

Parameters
----------
update : `bool`, optional
    If set to `True`, leave the update applied.  This avoids having
    to run ``make update-deps`` twice, once to see if an update is
    needed and again to apply it properly.

Returns
-------
results : List[`neophile.update.base.Update`]
    Will contain either no elements (no updates needed) or a single
    element (an update needed).

Raises
------
neophile.exceptions.UncommittedChangesError
    The repository being analyzed has uncommitted changes and
    therefore cannot be checked for updates.
subprocess.CalledProcessError
    Running ``make update-deps`` failed.
async def analyze(self, update: bool=False) -> List[Update]:
    'Analyze a tree and return needed Python frozen dependency updates.\n\n        Parameters\n        ----------\n        update : `bool`, optional\n            If set to `True`, leave the update applied.  This avoids having\n            to run ``make update-deps`` twice, once to see if an update is\n            needed and again to apply it properly.\n\n        Returns\n        -------\n        results : List[`neophile.update.base.Update`]\n            Will contain either no elements (no updates needed) or a single\n            element (an update needed).\n\n        Raises\n        ------\n        neophile.exceptions.UncommittedChangesError\n            The repository being analyzed has uncommitted changes and\n            therefore cannot be checked for updates.\n        subprocess.CalledProcessError\n            Running ``make update-deps`` failed.\n        '
    for name in ('Makefile', 'requirements/main.in'):
        if (not (self._root / name).exists()):
            return []
    repo = Repo(str(self._root))
    if repo.is_dirty():
        msg = 'Working tree contains uncommitted changes'
        raise UncommittedChangesError(msg)
    try:
        if self._virtualenv:
            self._virtualenv.run(['make', 'update-deps'], cwd=str(self._root), check=True, capture_output=True)
        else:
            subprocess.run(['make', 'update-deps'], cwd=str(self._root), check=True, capture_output=True)
    except subprocess.CalledProcessError as e:
        logging.error('make update-deps failed: %s%s', e.stdout, e.stderr)
        return []
    if (not repo.is_dirty()):
        return []
    if (not update):
        repo.git.restore('.')
    return [PythonFrozenUpdate(path=(self._root / 'requirements'), applied=update, virtualenv=self._virtualenv)]