docs: def deploy_files(local_dir, remote_dir, pattern = '',rsync_exclude=['*.pyc','.*'], use_sudo=False):
      """
      Generic deploy function for cases where one or more files are being deployed to a host.
      Wraps around ``rsync_project`` and stages files locally and/or remotely
      for network efficiency.
      
      ``local_dir`` is the directory that will be deployed.
     
      ``remote_dir`` is the directory the files will be deployed to.
      Directories will be created if necessary.
      
      Note: Unlike other ways of deploying files, all files under local_dir will be
      deployed into remote_dir. This is the equivalent to cp -R local_dir/* remote_dir.
  
      ``pattern`` finds all the pathnames matching a specified glob pattern relative
      to the local_dir according to the rules used by the Unix shell.
      ``pattern`` enhances the basic functionality by allowing the python | to include
      multiple patterns. eg '*.txt|Django*'
       
      ``rsync_exclude`` as per ``rsync_project``
      
      Returns a list of directories and files created on the host.
      
      """
      #normalise paths
      if local_dir[-1] == os.sep: local_dir = local_dir[:-1]
      if remote_dir[-1] == '/': remote_dir = remote_dir[:-1]
      created_list = []
      staging_dir = local_dir
      
      #resolve pattern into a dir:filename dict
      local_files = _get_local_files(local_dir,pattern)
      #If we are only copying specific files or rendering templates we need to stage locally
      if local_files: staging_dir = _stage_local_files(local_dir, local_files)
      remote_staging_dir = '/home/%s/.staging'% env.user
      if not exists(remote_staging_dir):
          run(' '.join(['mkdir -pv',remote_staging_dir])).split('\n')
          created_list = [remote_staging_dir]
      
      #upload into remote staging
      rsync_project(local_dir=staging_dir,remote_dir=remote_staging_dir,exclude=rsync_exclude,delete=True)
  
      #create the final destination
      created_dir_list = mkdirs(remote_dir, use_sudo)
      
      if not os.listdir(staging_dir): return created_list
  
      func = use_sudo and sudo or run
      #cp recursively -R from the staging to the destination and keep a list
      remote_base_path = '/'.join([remote_staging_dir,os.path.basename(local_dir),'*'])
      copy_file_list = func(' '.join(['cp -Ruv',remote_base_path,remote_dir])).split('\n')
      if copy_file_list[0]: created_list += [file.split(' ')[2][1:-1] for file in copy_file_list if file]
  
      #cleanup any tmp staging dir
      if staging_dir <> local_dir:
          shutil.rmtree(staging_dir,ignore_errors=True)
      
      return created_list