[docs]defupload_directory(project:str,asset:str,version:str,directory:str,staging:str,url:str,probation:bool=False):""" Upload a directory as a new versioned asset of a project in the registry. Args: project: The name of an existing project. asset: The name of a new or existing asset in ``project``. version: The name of a new version of ``asset``. directory: Path to a directory to be uploaded. For best performace, this should be a subdirectory of ``staging``, e.g., as created by :py:func:`~.allocate_upload_directory`. staging: Path to the staging directory. url: URL for the Gobbler REST API. probation: Whether to upload a probational version. """directory=os.path.normpath(directory)staging=os.path.normpath(staging)ifos.path.dirname(directory)!=staging:newdir=allocate_upload_directory(staging)forroot,dirs,filesinos.walk(directory):forfinfiles:src=os.path.join(root,f)rel=os.path.relpath(src,directory)dest=os.path.join(newdir,rel)os.makedirs(os.path.dirname(dest),exist_ok=True)slink=""ifos.path.islink(src):slink=os.readlink(src)ifslink==""ornotos.path.isabs(slink):try:os.link(src,dest)except:importshutilshutil.copy(src,dest)else:os.symlink(slink,dest)directory=newdirreq={"source":os.path.basename(directory),"project":project,"asset":asset,"version":version,"on_probation":probation}ut.dump_request(staging,url,"upload",req)return