Find the installed version of the specified package, and as much
        information about it as possible (source URL, git ref or tag, etc.)

        This attempts, to the best of our ability, to find out if the package
        was installed from git, and if so, provide information on the origin
        of that git repository and status of the clone. Otherwise, it uses
        pip and pkg_resources to find the version and homepage of the installed
        distribution.

        This class is not a sure-fire method of identifying the source of
        the distribution or ensuring AGPL compliance; it simply helps with this
        process _iff_ a modified version is installed from an editable git URL
        _and_ all changes are pushed up to the publicly-visible origin.

        Returns a dict with keys 'version', 'tag', 'commit', and 'url'.
        Values are strings or None.

        :param package_name: name of the package to find information for
        :type package_name: str
        :returns: information about the installed version of the package
        :rtype: :py:class:`~versionfinder.versioninfo.VersionInfo`

def find_package_version(self):
        """
        Find the installed version of the specified package, and as much
        information about it as possible (source URL, git ref or tag, etc.)

        This attempts, to the best of our ability, to find out if the package
        was installed from git, and if so, provide information on the origin
        of that git repository and status of the clone. Otherwise, it uses
        pip and pkg_resources to find the version and homepage of the installed
        distribution.

        This class is not a sure-fire method of identifying the source of
        the distribution or ensuring AGPL compliance; it simply helps with this
        process _iff_ a modified version is installed from an editable git URL
        _and_ all changes are pushed up to the publicly-visible origin.

        Returns a dict with keys 'version', 'tag', 'commit', and 'url'.
        Values are strings or None.

        :param package_name: name of the package to find information for
        :type package_name: str
        :returns: information about the installed version of the package
        :rtype: :py:class:`~versionfinder.versioninfo.VersionInfo`
        """
        res = {
            'pip_version': None,
            'pip_url': None,
            'pip_requirement': None,
            'pkg_resources_version': None,
            'pkg_resources_url': None,
            'git_tag': None,
            'git_commit': None,
            'git_remotes': None,
            'git_is_dirty': None
        }
        try:
            pip_info = self._find_pip_info()
        except Exception:
            # we NEVER want this to crash the program
            logger.debug('Caught exception running _find_pip_info()')
            pip_info = {}
        logger.debug("pip info: %s", pip_info)
        for k, v in pip_info.items():
            if v is not None:
                res['pip_' + k] = v
        try:
            pkg_info = self._find_pkg_info()
        except Exception:
            logger.debug('Caught exception running _find_pkg_info()')
            pkg_info = {}
        logger.debug("pkg_resources info: %s", pkg_info)
        for k, v in pkg_info.items():
            res['pkg_resources_' + k] = v
        gitdir = self._git_repo_path
        if gitdir is not None:
            git_info = self._find_git_info(gitdir)
            logger.debug("Git info: %s", git_info)
            for k, v in git_info.items():
                if k == 'dirty':
                    res['git_is_dirty'] = v
                elif k == 'commit':
                    res['git_commit'] = v
                elif k == 'remotes':
                    res['git_remotes'] = v
                elif k == 'tag':
                    res['git_tag'] = v
        else:
            logger.debug("Install does not appear to be a git clone")
        logger.debug("Final package info: %s", res)
        return VersionInfo(**res)