def update(self) -> None:
        """
        Ensures that all remote sources are up-to-date.
        """
        for source_old in self:
            if isinstance(source_old, RemoteSource):
                repo = git.Repo(source_old.location)
                origin = repo.remotes.origin
                origin.pull()

                sha = repo.head.object.hexsha
                version = repo.git.rev_parse(sha, short=8)

                if version != source_old.version:
                    source_new  = RemoteSource(source_old.name,
                                               source_old.location,
                                               source_old.url,
                                               version)
                    logger.info("updated source: %s [%s -> %s]", source_old.name,
                                                                 source_old.version,
                                                                 source_new.version)
                    self.load(source_new)

                else:
                    logger.debug("no updates for source: %s", source_old.name)

        # write to disk
        # TODO local directory may be corrupted if program terminates between
        #   repo being updated and registry being saved; could add a "fix"
        #   command to recalculate versions for remote sources
        self.save()
Ensures that all remote sources are up-to-date.