code: def copy_tree(
      src,
      dst,
      preserve_mode=1,
      preserve_times=1,
      preserve_symlinks=0,
      update=0,
      verbose=1,
      dry_run=0,
  ):
      """Copy an entire directory tree 'src' to a new location 'dst'.
  
      Both 'src' and 'dst' must be directory names.  If 'src' is not a
      directory, raise DistutilsFileError.  If 'dst' does not exist, it is
      created with 'mkpath()'.  The end result of the copy is that every
      file in 'src' is copied to 'dst', and directories under 'src' are
      recursively copied to 'dst'.  Return the list of files that were
      copied or might have been copied, using their output name.  The
      return value is unaffected by 'update' or 'dry_run': it is simply
      the list of all files under 'src', with the names changed to be
      under 'dst'.
  
      'preserve_mode' and 'preserve_times' are the same as for
      'copy_file'; note that they only apply to regular files, not to
      directories.  If 'preserve_symlinks' is true, symlinks will be
      copied as symlinks (on platforms that support them!); otherwise
      (the default), the destination of the symlink will be copied.
      'update' and 'verbose' are the same as for 'copy_file'.
      """
      from distutils.file_util import copy_file
  
      if not dry_run and not os.path.isdir(src):
          raise DistutilsFileError(
              "cannot copy tree '%s': not a directory" % src
          )
      try:
          names = os.listdir(src)
      except OSError as e:
          if dry_run:
              names = []
          else:
              raise DistutilsFileError(
                  "error listing files in '%s': %s" % (src, e.strerror)
              )
  
      if not dry_run:
          mkpath(dst, verbose=verbose)
  
      outputs = []
  
      for n in names:
          src_name = os.path.join(src, n)
          dst_name = os.path.join(dst, n)
  
          if n.startswith(".nfs"):
              # skip NFS rename files
              continue
  
          if preserve_symlinks and os.path.islink(src_name):
              link_dest = os.readlink(src_name)
              if verbose >= 1:
                  log.info("linking %s -> %s", dst_name, link_dest)
              if not dry_run:
                  os.symlink(link_dest, dst_name)
              outputs.append(dst_name)
  
          elif os.path.isdir(src_name):
              outputs.extend(
                  copy_tree(
                      src_name,
                      dst_name,
                      preserve_mode,
                      preserve_times,
                      preserve_symlinks,
                      update,
                      verbose=verbose,
                      dry_run=dry_run,
                  )
              )
          else:
              copy_file(
                  src_name,
                  dst_name,
                  preserve_mode,
                  preserve_times,
                  update,
                  verbose=verbose,
                  dry_run=dry_run,
              )
              outputs.append(dst_name)
  
      return outputs
  
file_path: catboost/contrib/tools/python3/src/Lib/distutils/dir_util.py
imports: import os
  import errno
  from distutils.errors import DistutilsFileError, DistutilsInternalError
  from distutils import log
label_desc: Use image node_id 3 for calling a global function with example usage: copy_tree(src, dst, preserve_mode, preserve_times, preserve_symlinks, update, verbose, dry_run) and returns: outputs