code: def run(self, repo: str, branch: str, task: Task, *,
              depth: DepthDefinitionType=1,
              reference: ReferenceDefinitionType=None
              ) -> Result:
          
          self.validate_repo_url(repo)
          depth = self.validate_depth(depth)
          reference = self.validate_reference(reference)
  
          logger.info("Running Arca task %r for repo '%s' in branch '%s'", task, repo, branch)
  
          git_repo, repo_path = self.get_files(repo, branch, depth=depth, reference=reference)
  
          def create_value():
              logger.debug("Value not in cache, creating.")
              return self.backend.run(repo, branch, task, git_repo, repo_path)
  
          cache_key = self.cache_key(repo, branch, task, git_repo)
  
          logger.debug("Cache key is %s", cache_key)
  
          return self.region.get_or_create(
              cache_key,
              create_value,
              should_cache_fn=self.should_cache_fn
          )
docs: Runs the ``task`` using the configured backend.
  
          :param repo: Target git repository
          :param branch: Target git branch
          :param task: Task which will be run in the target repository
          :param depth: How many commits back should the repo be cloned in case the target repository isn't cloned yet.
                        Defaults to 1, must be bigger than 0. No limit will be used if ``None`` is set.
          :param reference: A path to a repository from which the target repository is forked,
                            to save bandwidth, `--dissociate` is used if set.
  
          :return: A :class:`Result` instance with the output of the task.
  
          :raise PullError: If the repository can't be cloned or pulled
          :raise BuildError: If the task fails.