Get a package repository.

        Args:
            path (str): Entry from the 'packages_path' config setting. This may
                simply be a path (which is managed by the 'filesystem' package
                repository plugin), or a string in the form "type@location",
                where 'type' identifies the repository plugin type to use.

        Returns:
            `PackageRepository` instance.

def get_repository(self, path):
        """Get a package repository.

        Args:
            path (str): Entry from the 'packages_path' config setting. This may
                simply be a path (which is managed by the 'filesystem' package
                repository plugin), or a string in the form "type@location",
                where 'type' identifies the repository plugin type to use.

        Returns:
            `PackageRepository` instance.
        """
        # normalise
        parts = path.split('@', 1)
        if len(parts) == 1:
            parts = ("filesystem", parts[0])

        repo_type, location = parts
        if repo_type == "filesystem":
            # choice of abspath here vs realpath is deliberate. Realpath gives
            # canonical path, which can be a problem if two studios are sharing
            # packages, and have mirrored package paths, but some are actually
            # different paths, symlinked to look the same. It happened!
            location = os.path.abspath(location)

        normalised_path = "%s@%s" % (repo_type, location)
        return self._get_repository(normalised_path)