def get_files_info(request, linkstore, show_toxresults=False): files = [] filedata = linkstore.get_links(rel='releasefile') if not filedata: log.warn("project %r version %r has no files", linkstore.projectname, linkstore.version) for link in sorted(filedata, key=attrgetter('basename')): url = url_for_entrypath(request, link.entrypath) entry = link.entry if entry.eggfragment: url += "#egg=%s" % entry.eggfragment elif entry.md5: url += "#md5=%s" % entry.md5 py_version, file_type = get_pyversion_filetype(link.basename) if py_version == 'source': py_version = '' size = '' if entry.file_exists(): size = "%.0f %s" % sizeof_fmt(entry.file_size()) fileinfo = dict( title=link.basename, url=url, basename=link.basename, md5=entry.md5, dist_type=dist_file_types.get(file_type, ''), py_version=py_version, size=size) if show_toxresults: toxresults = get_toxresults_info(linkstore, link) if toxresults: fileinfo['toxresults'] = toxresults files.append(fileinfo) return files
def upload_release_file(self, path, pkginfo): meta = {} for attr in pkginfo: meta[attr] = getattr(pkginfo, attr) self.post("register", None, meta=meta) pyver = get_pyversion_filetype(path.basename) meta["pyversion"], meta["filetype"] = pyver self.post("file_upload", path, meta=meta)
def get_files_info(request, linkstore, show_toxresults=False): files = [] filedata = linkstore.get_links(rel='releasefile') if not filedata: log.warn("project %r version %r has no files", linkstore.project, linkstore.version) for link in sorted(filedata, key=attrgetter('basename')): url = url_for_entrypath(request, link.entrypath) entry = link.entry if entry.hash_spec: url += "#" + entry.hash_spec py_version, file_type = get_pyversion_filetype(link.basename) if py_version == 'source': py_version = '' size = '' if entry.file_exists(): size = "%.0f %s" % sizeof_fmt(entry.file_size()) try: history = [ make_history_view_item(request, x) for x in link.get_logs()] except AttributeError: history = [] last_modified = format_timetuple(parsedate(entry.last_modified)) fileinfo = dict( title=link.basename, url=url, basename=link.basename, hash_spec=entry.hash_spec, dist_type=dist_file_types.get(file_type, ''), py_version=py_version, last_modified=last_modified, history=history, size=size) if show_toxresults: toxresults = get_toxresults_info(linkstore, link) if toxresults: fileinfo['toxresults'] = toxresults fileinfo['toxresults_state'] = get_toxresults_state(toxresults) files.append(fileinfo) return files
def test_get_pyversion_filetype(releasename, expected): result = get_pyversion_filetype(releasename) assert result == expected
def pushrelease(self): request = self.request stage = self.context.stage pushdata = getjson(request) try: name = pushdata["name"] version = pushdata["version"] except KeyError: apireturn(400, message="no name/version specified in json") # first, get all the links related to the source "to push" release try: linkstore = stage.get_linkstore_perstage(name, version) except stage.MissesRegistration: apireturn(400, "there are no files for %s-%s on stage %s" %( name, version, stage.name)) links = dict([(rel, linkstore.get_links(rel=rel)) for rel in ('releasefile', 'doczip', 'toxresult')]) if not links["releasefile"]: self.log.info("%s: no release files for version %s-%s" % (stage.name, name, version)) apireturn(404, message="no release/files found for %s-%s" %( name, version)) metadata = get_pure_metadata(linkstore.verdata) results = [] targetindex = pushdata.get("targetindex", None) if targetindex is not None: # in-server push parts = targetindex.split("/") if len(parts) != 2: apireturn(400, message="targetindex not in format user/index") target_stage = self.context.getstage(*parts) auth_user = request.authenticated_userid self.log.debug("targetindex %r, auth_user %r", targetindex, auth_user) if not request.has_permission("pypi_submit", context=target_stage): apireturn(401, message="user %r cannot upload to %r" %(auth_user, targetindex)) self._set_versiondata_dict(target_stage, metadata) results.append((200, "register", name, version, "->", target_stage.name)) try: results.extend(self._push_links(links, target_stage, name, version)) except target_stage.NonVolatile as e: apireturn(409, "%s already exists in non-volatile index" % ( e.link.basename,)) apireturn(200, result=results, type="actionlog") else: posturl = pushdata["posturl"] username = pushdata["username"] password = pushdata["password"] pypiauth = (username, password) # prepare metadata for submission metadata[":action"] = "submit" self.log.info("registering %s-%s to %s", name, version, posturl) session = new_requests_session(agent=("server", server_version)) r = session.post(posturl, data=metadata, auth=pypiauth) self.log.debug("register returned: %s", r.status_code) ok_codes = (200, 201) results.append((r.status_code, "register", name, version)) if r.status_code in ok_codes: for link in links["releasefile"]: entry = link.entry file_metadata = metadata.copy() file_metadata[":action"] = "file_upload" basename = link.basename pyver, filetype = get_pyversion_filetype(basename) file_metadata["filetype"] = filetype file_metadata["pyversion"] = pyver content = entry.file_get_content() self.log.info("sending %s to %s, metadata %s", basename, posturl, file_metadata) r = session.post(posturl, data=file_metadata, auth=pypiauth, files={"content": (basename, content)}) self.log.debug("send finished, status: %s", r.status_code) results.append((r.status_code, "upload", entry.relpath, r.text)) if links["doczip"]: doc_metadata = metadata.copy() doc_metadata[":action"] = "doc_upload" doczip = links["doczip"][0].entry.file_get_content() r = session.post(posturl, data=doc_metadata, auth=pypiauth, files={"content": (name + ".zip", doczip)}) self.log.debug("send finished, status: %s", r.status_code) results.append((r.status_code, "docfile", name)) # if r.status_code in ok_codes: apireturn(200, result=results, type="actionlog") else: apireturn(502, result=results, type="actionlog")
def pushrelease(self): request = self.request stage = self.context.stage pushdata = getjson(request) try: name = pushdata["name"] version = pushdata["version"] except KeyError: apireturn(400, message="no name/version specified in json") # first, get all the links related to the source "to push" release try: linkstore = stage.get_linkstore_perstage(name, version) except stage.MissesRegistration: apireturn( 400, "there are no files for %s-%s on stage %s" % (name, version, stage.name)) links = dict([(rel, linkstore.get_links(rel=rel)) for rel in ('releasefile', 'doczip', 'toxresult')]) if not links["releasefile"]: self.log.info("%s: no release files for version %s-%s" % (stage.name, name, version)) apireturn(404, message="no release/files found for %s-%s" % (name, version)) metadata = get_pure_metadata(linkstore.verdata) # prepare metadata for submission metadata[":action"] = "submit" results = [] targetindex = pushdata.get("targetindex", None) if targetindex is not None: # in-server push parts = targetindex.split("/") if len(parts) != 2: apireturn(400, message="targetindex not in format user/index") target_stage = self.context.getstage(*parts) auth_user = request.authenticated_userid self.log.debug("targetindex %r, auth_user %r", targetindex, auth_user) if not target_stage.can_upload(auth_user): apireturn(401, message="user %r cannot upload to %r" % (auth_user, targetindex)) self._set_versiondata_dict(target_stage, metadata) results.append( (200, "register", name, version, "->", target_stage.name)) results.extend(self._push_links(links, target_stage, name, version)) apireturn(200, result=results, type="actionlog") else: posturl = pushdata["posturl"] username = pushdata["username"] password = pushdata["password"] pypiauth = (username, password) self.log.info("registering %s-%s to %s", name, version, posturl) session = new_requests_session(agent=("server", server_version)) r = session.post(posturl, data=metadata, auth=pypiauth) self.log.debug("register returned: %s", r.status_code) ok_codes = (200, 201) results.append((r.status_code, "register", name, version)) if r.status_code in ok_codes: for link in links["releasefile"]: entry = link.entry file_metadata = metadata.copy() file_metadata[":action"] = "file_upload" basename = link.basename pyver, filetype = get_pyversion_filetype(basename) file_metadata["filetype"] = filetype file_metadata["pyversion"] = pyver content = entry.file_get_content() self.log.info("sending %s to %s, metadata %s", basename, posturl, file_metadata) r = session.post(posturl, data=file_metadata, auth=pypiauth, files={"content": (basename, content)}) self.log.debug("send finished, status: %s", r.status_code) results.append( (r.status_code, "upload", entry.relpath, r.text)) if links["doczip"]: doc_metadata = metadata.copy() doc_metadata[":action"] = "doc_upload" doczip = links["doczip"][0].entry.file_get_content() r = session.post( posturl, data=doc_metadata, auth=pypiauth, files={"content": (name + ".zip", doczip)}) self.log.debug("send finished, status: %s", r.status_code) results.append((r.status_code, "docfile", name)) # if r.status_code in ok_codes: apireturn(200, result=results, type="actionlog") else: apireturn(502, result=results, type="actionlog")
def pushrelease(self, user, index): stage = self.getstage(user, index) pushdata = getjson(request) try: name = pushdata["name"] version = pushdata["version"] except KeyError: apireturn(400, message="no name/version specified in json") projectconfig = stage.get_projectconfig(name) matches = [] if projectconfig: verdata = projectconfig.get(version) if verdata: files = verdata.get("+files") for basename, relpath in files.items(): entry = stage.xom.filestore.getentry(relpath) if not entry.iscached(): abort(400, "cannot push non-cached files") matches.append(entry) metadata = get_pure_metadata(verdata) if not matches: log.info("%s: no release files %s-%s" %(stage.name, name, version)) apireturn(404, message="no release/files found for %s-%s" %( name, version)) doczip = stage.get_doczip(name, version) # prepare metadata for submission metadata[":action"] = "submit" results = [] targetindex = pushdata.get("targetindex", None) if targetindex is not None: parts = targetindex.split("/") if len(parts) != 2: apireturn(400, message="targetindex not in format user/index") target_stage = self.getstage(*parts) auth_user = self.auth.get_auth_user(request.auth, raising=False) log.debug("targetindex %r, auth_user %r", targetindex, auth_user) if not target_stage.can_upload(auth_user): apireturn(401, message="user %r cannot upload to %r" %(auth_user, targetindex)) #results = stage.copy_release(metadata, target_stage) #results.append((r.status_code, "upload", entry.relpath)) #apireturn(200, results=results, type="actionlog") if not target_stage.get_metadata(name, version): self._register_metadata_dict(target_stage, metadata) results.append((200, "register", name, version, "->", target_stage.name)) for entry in matches: res = target_stage.store_releasefile( entry.basename, entry.FILE.filepath.read(mode="rb")) if not isinstance(res, int): res = 200 results.append((res, "store_releasefile", entry.basename, "->", target_stage.name)) if doczip: target_stage.store_doczip(name, version, doczip) results.append((200, "uploaded documentation", name, "->", target_stage.name)) apireturn(200, result=results, type="actionlog") else: posturl = pushdata["posturl"] username = pushdata["username"] password = pushdata["password"] pypiauth = (username, password) log.info("registering %s-%s to %s", name, version, posturl) session = new_requests_session(agent=("server", server_version)) r = session.post(posturl, data=metadata, auth=pypiauth) log.debug("register returned: %s", r.status_code) ok_codes = (200, 201) results.append((r.status_code, "register", name, version)) if r.status_code in ok_codes: for entry in matches: file_metadata = metadata.copy() file_metadata[":action"] = "file_upload" basename = entry.basename pyver, filetype = get_pyversion_filetype(basename) file_metadata["filetype"] = filetype file_metadata["pyversion"] = pyver openfile = entry.FILE.filepath.open("rb") log.info("sending %s to %s, metadata %s", basename, posturl, file_metadata) r = session.post(posturl, data=file_metadata, auth=pypiauth, files={"content": (basename, openfile)}) log.debug("send finished, status: %s", r.status_code) results.append((r.status_code, "upload", entry.relpath, r.content)) if doczip: doc_metadata = metadata.copy() doc_metadata[":action"] = "doc_upload" r = session.post(posturl, data=doc_metadata, auth=pypiauth, files={"content": (name + ".zip", doczip)}) log.debug("send finished, status: %s", r.status_code) results.append((r.status_code, "docfile", name)) # if r.status_code in ok_codes: apireturn(200, result=results, type="actionlog") else: apireturn(502, result=results, type="actionlog")
def pushrelease(self, user, index): stage = self.getstage(user, index) pushdata = getjson(request) try: name = pushdata["name"] version = pushdata["version"] except KeyError: apireturn(400, message="no name/version specified in json") projectconfig = stage.get_projectconfig(name) matches = [] if projectconfig: verdata = projectconfig.get(version) if verdata: files = verdata.get("+files") for basename, relpath in files.items(): entry = stage.xom.filestore.getentry(relpath) if not entry.iscached(): abort(400, "cannot push non-cached files") matches.append(entry) metadata = get_pure_metadata(verdata) if not matches: log.info("%s: no release files %s-%s" % (stage.name, name, version)) apireturn(404, message="no release/files found for %s-%s" % (name, version)) doczip = stage.get_doczip(name, version) # prepare metadata for submission metadata[":action"] = "submit" results = [] targetindex = pushdata.get("targetindex", None) if targetindex is not None: parts = targetindex.split("/") if len(parts) != 2: apireturn(400, message="targetindex not in format user/index") target_stage = self.getstage(*parts) auth_user = self.auth.get_auth_user(request.auth, raising=False) log.debug("targetindex %r, auth_user %r", targetindex, auth_user) if not target_stage.can_upload(auth_user): apireturn(401, message="user %r cannot upload to %r" % (auth_user, targetindex)) #results = stage.copy_release(metadata, target_stage) #results.append((r.status_code, "upload", entry.relpath)) #apireturn(200, results=results, type="actionlog") if not target_stage.get_metadata(name, version): self._register_metadata_dict(target_stage, metadata) results.append( (200, "register", name, version, "->", target_stage.name)) for entry in matches: res = target_stage.store_releasefile( entry.basename, entry.FILE.filepath.read(mode="rb")) if not isinstance(res, int): res = 200 results.append((res, "store_releasefile", entry.basename, "->", target_stage.name)) if doczip: target_stage.store_doczip(name, version, doczip) results.append((200, "uploaded documentation", name, "->", target_stage.name)) apireturn(200, result=results, type="actionlog") else: posturl = pushdata["posturl"] username = pushdata["username"] password = pushdata["password"] pypiauth = (username, password) log.info("registering %s-%s to %s", name, version, posturl) session = new_requests_session(agent=("server", server_version)) r = session.post(posturl, data=metadata, auth=pypiauth) log.debug("register returned: %s", r.status_code) ok_codes = (200, 201) results.append((r.status_code, "register", name, version)) if r.status_code in ok_codes: for entry in matches: file_metadata = metadata.copy() file_metadata[":action"] = "file_upload" basename = entry.basename pyver, filetype = get_pyversion_filetype(basename) file_metadata["filetype"] = filetype file_metadata["pyversion"] = pyver openfile = entry.FILE.filepath.open("rb") log.info("sending %s to %s, metadata %s", basename, posturl, file_metadata) r = session.post(posturl, data=file_metadata, auth=pypiauth, files={"content": (basename, openfile)}) log.debug("send finished, status: %s", r.status_code) results.append( (r.status_code, "upload", entry.relpath, r.content)) if doczip: doc_metadata = metadata.copy() doc_metadata[":action"] = "doc_upload" r = session.post( posturl, data=doc_metadata, auth=pypiauth, files={"content": (name + ".zip", doczip)}) log.debug("send finished, status: %s", r.status_code) results.append((r.status_code, "docfile", name)) # if r.status_code in ok_codes: apireturn(200, result=results, type="actionlog") else: apireturn(502, result=results, type="actionlog")