docs: def cp(src_hdfs_path, dest_hdfs_path, **kwargs):
      """\
      Copy the contents of ``src_hdfs_path`` to ``dest_hdfs_path``.
  
      If ``src_hdfs_path`` is a directory, its contents will be copied
      recursively. Source file(s) are opened for reading and copies are
      opened for writing. Additional keyword arguments, if any, are
      handled like in :func:`open`.
      """
      src, dest = {}, {}
      try:
          for d, p in ((src, src_hdfs_path), (dest, dest_hdfs_path)):
              d["host"], d["port"], d["path"] = path.split(p)
              d["fs"] = hdfs(d["host"], d["port"])
          # --- does src exist? ---
          try:
              src["info"] = src["fs"].get_path_info(src["path"])
          except IOError:
              raise IOError("no such file or directory: %r" % (src["path"]))
          # --- src exists. Does dest exist? ---
          try:
              dest["info"] = dest["fs"].get_path_info(dest["path"])
          except IOError:
              if src["info"]["kind"] == "file":
                  _cp_file(src["fs"], src["path"], dest["fs"], dest["path"],
                           **kwargs)
                  return
              else:
                  dest["fs"].create_directory(dest["path"])
                  dest_hdfs_path = dest["fs"].get_path_info(dest["path"])["name"]
                  for item in src["fs"].list_directory(src["path"]):
                      cp(item["name"], dest_hdfs_path, **kwargs)
                  return
          # --- dest exists. Is it a file? ---
          if dest["info"]["kind"] == "file":
              raise IOError("%r already exists" % (dest["path"]))
          # --- dest is a directory ---
          dest["path"] = path.join(dest["path"], path.basename(src["path"]))
          if dest["fs"].exists(dest["path"]):
              raise IOError("%r already exists" % (dest["path"]))
          if src["info"]["kind"] == "file":
              _cp_file(src["fs"], src["path"], dest["fs"], dest["path"],
                       **kwargs)
          else:
              dest["fs"].create_directory(dest["path"])
              dest_hdfs_path = dest["fs"].get_path_info(dest["path"])["name"]
              for item in src["fs"].list_directory(src["path"]):
                  cp(item["name"], dest_hdfs_path, **kwargs)
      finally:
          for d in src, dest:
              try:
                  d["fs"].close()
              except KeyError:
                  pass