code: def make_tmp_dir(tmp_path_factory, request, worker_id):
      def make(name, *, scm=False, dvc=False, subdir=False):
          from shutil import copytree, ignore_patterns
  
          from dvc.repo import Repo
          from dvc.scm import Git
  
          from .tmp_dir import TmpDir
  
          cache = CACHE.get((scm, dvc, subdir))
          if not cache:
              cache_dir = tmp_path_factory.mktemp(
                  "dvc-test-cache" + worker_id
              )
              TmpDir(cache_dir).init(scm=scm, dvc=dvc, subdir=subdir)
              CACHE[(scm, dvc, subdir)] = cache = os.fspath(cache_dir)
  
          assert cache
          path = (
              tmp_path_factory.mktemp(name)
              if isinstance(name, str)
              else name
          )
  
          # ignore sqlite files from .dvc/tmp. We might not be closing the cache
          # connection resulting in PermissionErrors in Windows.
          ignore = ignore_patterns("cache.db*")
          copytree(cache, path, dirs_exist_ok=True, ignore=ignore)
          new_dir = TmpDir(path)
          str_path = os.fspath(new_dir)
          if dvc:
              new_dir.dvc = Repo(str_path)
          if scm:
              new_dir.scm = (
                  new_dir.dvc.scm
                  if hasattr(new_dir, "dvc")
                  else Git(str_path)
              )
          request.addfinalizer(new_dir.close)
          return new_dir
  
      return make
  
imports: import os
  import pathlib
  import subprocess
  from typing import Dict, Tuple
  import pytest
  from .scripts import copy_script
label_desc: Use image node_id 1 for calling a global function with example usage: make_tmp_dir(tmp_path_factory, request, worker_id) and returns: make, new_dir