code: def temporary_heroku_directory(
      files,
      name,
      metadata,
      extra_options,
      branch,
      template_dir,
      plugins_dir,
      static,
      install,
      version_note,
      secret,
      extra_metadata=None,
  ):
      extra_metadata = extra_metadata or {}
      tmp = tempfile.TemporaryDirectory()
      saved_cwd = os.getcwd()
  
      file_paths = [
          os.path.join(saved_cwd, file_path) for file_path in files
      ]
      file_names = [os.path.split(f)[-1] for f in files]
  
      if metadata:
          metadata_content = parse_metadata(metadata.read())
      else:
          metadata_content = {}
      for key, value in extra_metadata.items():
          if value:
              metadata_content[key] = value
  
      try:
          os.chdir(tmp.name)
  
          if metadata_content:
              with open("metadata.json", "w") as fp:
                  fp.write(json.dumps(metadata_content, indent=2))
  
          with open("runtime.txt", "w") as fp:
              fp.write("python-3.11.0")
  
          if branch:
              install = [
                  f"https://github.com/simonw/datasette/archive/{branch}.zip"
              ] + list(install)
          else:
              install = ["datasette"] + list(install)
  
          with open("requirements.txt", "w") as fp:
              fp.write("\n".join(install))
          os.mkdir("bin")
          with open("bin/post_compile", "w") as fp:
              fp.write(
                  "datasette inspect --inspect-file inspect-data.json"
              )
  
          extras = []
          if template_dir:
              link_or_copy_directory(
                  os.path.join(saved_cwd, template_dir),
                  os.path.join(tmp.name, "templates"),
              )
              extras.extend(["--template-dir", "templates/"])
          if plugins_dir:
              link_or_copy_directory(
                  os.path.join(saved_cwd, plugins_dir),
                  os.path.join(tmp.name, "plugins"),
              )
              extras.extend(["--plugins-dir", "plugins/"])
          if version_note:
              extras.extend(["--version-note", version_note])
          if metadata_content:
              extras.extend(["--metadata", "metadata.json"])
          if extra_options:
              extras.extend(extra_options.split())
          for mount_point, path in static:
              link_or_copy_directory(
                  os.path.join(saved_cwd, path),
                  os.path.join(tmp.name, mount_point),
              )
              extras.extend(
                  ["--static", f"{mount_point}:{mount_point}"]
              )
  
          quoted_files = " ".join(
              [
                  "-i {}".format(shlex.quote(file_name))
                  for file_name in file_names
              ]
          )
          procfile_cmd = "web: datasette serve --host 0.0.0.0 {quoted_files} --cors --port $PORT --inspect-file inspect-data.json {extras}".format(
              quoted_files=quoted_files, extras=" ".join(extras)
          )
          with open("Procfile", "w") as fp:
              fp.write(procfile_cmd)
  
          for path, filename in zip(file_paths, file_names):
              link_or_copy(path, os.path.join(tmp.name, filename))
  
          yield
  
      finally:
          tmp.cleanup()
          os.chdir(saved_cwd)
  
file_path: datasette/datasette/publish/heroku.py
imports: from contextlib import contextmanager
  from datasette import hookimpl
  import click
  import json
  import os
  import pathlib
  import shlex
  import shutil
  from subprocess import call, check_output
  import tempfile
  from .common import add_common_publish_arguments_and_options, fail_if_publish_binary_not_installed
  from datasette.utils import link_or_copy, link_or_copy_directory, parse_metadata
label_desc: Use image node_id 2 for calling a global function with example usage: temporary_heroku_directory(files, name, metadata, extra_options, branch, template_dir, plugins_dir, static, install, version_note, secret, extra_metadata) without return types