docs: 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()