def build_wheel(build_manifest, build_node, source_root, output_dir=None, output_file=None): meta = PackageMetadata.from_ipkg(build_manifest) egg_info = WheelInfo.from_ipkg(build_manifest, build_node) assert not '_' in meta.version # FIXME: fix egg name if output_dir is None: if output_file is None: egg = wheel_filename(os.path.join("dist", meta.fullname)) else: egg = os.path.join("dist", output_file) else: if output_file is None: egg = wheel_filename(os.path.join(output_dir, meta.fullname)) else: egg = os.path.join(output_dir, output_file) bento.utils.path.ensure_dir(egg) egg_scheme = {"prefix": source_root.abspath(), "eprefix": source_root.abspath(), "sitedir": source_root.abspath()} record = [] zid = compat.ZipFile(egg, "w", compat.ZIP_DEFLATED) try: for kind, source, target in build_manifest.iter_built_files(source_root, egg_scheme): if not kind in ["executables"]: abspath = source.abspath() target_path = target.path_from(source_root).replace(os.path.sep, '/') zid.write(abspath, target_path) hash, length = hash_and_length(abspath) digest = "sha256="+urlsafe_b64encode(hash) record.append((target_path, digest, length)) for filename, cnt in egg_info.iter_meta(build_node): name = '/'.join((meta.fullname + ".dist-info", filename)) digest = "sha256="+urlsafe_b64encode(hashlib.sha256(cnt).digest()) zid.writestr(name, cnt) record.append((name, digest, len(cnt))) name = '/'.join((meta.fullname + ".dist-info", "WHEEL")) wheelfile = b'Wheel-Version: 0.1\nGenerator: bento\nRoot-Is-Purelib: true\n\n' zid.writestr(name, wheelfile) digest = "sha256="+urlsafe_b64encode(hashlib.sha256(wheelfile).digest()) record.append((name, digest, len(wheelfile))) name = '/'.join((meta.fullname + ".dist-info", "RECORD")) sio = cStringIO.StringIO() writer = csv.writer(sio) for row in record: writer.writerow(row) writer.writerow((name, '', '')) zid.writestr(name, sio.getvalue()) finally: zid.close() return
def create_wininst(ipkg, egg_info=None, src_root_dir=".", wininst=None): meta = PackageMetadata.from_ipkg(ipkg) if egg_info is None: egg_info = EggInfo.from_ipkg(ipkg) # XXX: do this correctly, maybe use same as distutils ? if wininst is None: wininst = wininst_filename(os.path.join("dist", meta.fullname)) ensure_dir(wininst) egg_info_dir = os.path.join("PURELIB", egg_info_dirname(meta.fullname)) fid, arcname = tempfile.mkstemp(prefix="zip") zid = compat.ZipFile(arcname, "w", compat.ZIP_DEFLATED) try: for filename, cnt in egg_info.iter_meta(): zid.writestr(os.path.join(egg_info_dir, filename), cnt) ipkg.path_variables["bindir"] = "SCRIPTS" ipkg.path_variables["sitedir"] = "PURELIB" ipkg.path_variables["gendatadir"] = "$sitedir" file_sections = ipkg.resolve_paths(src_root_dir) def write_content(source, target, kind): zid.write(source, target) for kind, source, target in iter_files(file_sections): write_content(source, target, kind) finally: zid.close() os.close(fid) create_exe(ipkg, arcname, wininst)
def build_egg(ipkg, source_root=".", path=None): meta = PackageMetadata.from_ipkg(ipkg) egg_info = EggInfo.from_ipkg(ipkg) # FIXME: fix egg name if path is None: egg = egg_filename(os.path.join("dist", meta.fullname)) else: egg = egg_filename(os.path.join(path, meta.fullname)) ensure_dir(egg) egg_info = EggInfo.from_ipkg(ipkg) zid = compat.ZipFile(egg, "w", compat.ZIP_DEFLATED) try: for filename, cnt in egg_info.iter_meta(): zid.writestr(os.path.join("EGG-INFO", filename), cnt) ipkg.path_variables["sitedir"] = "." file_sections = ipkg.resolve_paths(source_root) for kind, source, target in iter_files(file_sections): if not kind in ["executables"]: zid.write(source, target) pprint("PINK", "Byte-compiling ...") for kind, source, target in iter_files(file_sections): if kind in ["pythonfiles"]: zid.writestr("%sc" % target, bcompile(source)) finally: zid.close() return
def from_ipkg(cls, ipkg): meta = PackageMetadata.from_ipkg(ipkg) executables = ipkg.executables file_sections = ipkg.resolve_paths() sources = list(iter_source_files(file_sections)) ret = cls(meta, executables, sources) ret.ipkg = ipkg return ret
def from_ipkg(cls, ipkg, src_node): meta = PackageMetadata.from_ipkg(ipkg) executables = ipkg.executables file_sections = ipkg.resolve_paths(src_node) sources = list([n.abspath() for n in iter_source_files(file_sections)]) ret = cls(meta, executables, sources) ret.ipkg = ipkg return ret
def get_inidata(ipkg): # Return data describing the installation. meta = PackageMetadata.from_ipkg(ipkg) # Write the [metadata] section. lines = [] lines.append("[metadata]") # 'info' will be displayed in the installer's dialog box, # describing the items to be installed. info = meta.description + '\n' # Escape newline characters def escape(s): return s.replace("\n", "\\n") for name in [ "author", "author_email", "summary", "maintainer", "maintainer_email", "name", "url", "version" ]: data = getattr(meta, name) if name == "summary": name = "description" if data: info = info + ("\n %s: %s" % \ (name.capitalize(), escape(data))) lines.append("%s=%s" % (name, escape(data))) # The [setup] section contains entries controlling # the installer runtime. lines.append("\n[Setup]") # FIXME: handle install scripts #if self.install_script: # lines.append("install_script=%s" % self.install_script) lines.append("info=%s" % escape(info)) # FIXME: handle this correctly lines.append("target_compile=1") lines.append("target_optimize=1") #if self.target_version: # lines.append("target_version=%s" % self.target_version) #if self.user_access_control: # lines.append("user_access_control=%s" % self.user_access_control) title = meta.fullname lines.append("title=%s" % escape(title)) build_info = "Built %s with bento-%s" % \ (time.ctime(time.time()), bento.__version__) lines.append("build_info=%s" % build_info) return "\n".join(lines)
def create_wininst(ipkg, src_root_node, build_node, egg_info=None, wininst=None, output_dir=None): meta = PackageMetadata.from_ipkg(ipkg) if egg_info is None: egg_info = EggInfo.from_ipkg(ipkg, build_node) # XXX: do this correctly, maybe use same as distutils ? if wininst is None: wininst = os.path.join(output_dir, wininst_filename(meta)) else: wininst = os.path.join(output_dir, wininst) bento.utils.path.ensure_dir(wininst) egg_info_dir = os.path.join("PURELIB", egg_info_dirname(meta.fullname)) fid, arcname = tempfile.mkstemp(prefix="zip") zid = compat.ZipFile(arcname, "w", compat.ZIP_DEFLATED) try: for filename, cnt in egg_info.iter_meta(build_node): zid.writestr(os.path.join(egg_info_dir, filename), cnt) wininst_paths = compat.defaultdict(lambda: r"DATA\share\$pkgname") wininst_paths.update({ "bindir": "SCRIPTS", "sitedir": "PURELIB", "gendatadir": "$sitedir" }) d = {} for k in ipkg._path_variables: d[k] = wininst_paths[k] ipkg.update_paths(d) file_sections = ipkg.resolve_paths(src_root_node) def write_content(source, target, kind): zid.write(source.abspath(), target.abspath()) for kind, source, target in iter_files(file_sections): write_content(source, target, kind) finally: zid.close() os.close(fid) create_exe(ipkg, arcname, wininst)
def get_inidata(ipkg): # Return data describing the installation. meta = PackageMetadata.from_ipkg(ipkg) # Write the [metadata] section. lines = [] lines.append("[metadata]") # 'info' will be displayed in the installer's dialog box, # describing the items to be installed. info = meta.description + '\n' # Escape newline characters def escape(s): return string.replace(s, "\n", "\\n") for name in ["author", "author_email", "summary", "maintainer", "maintainer_email", "name", "url", "version"]: data = getattr(meta, name) if name == "summary": name = "description" if data: info = info + ("\n %s: %s" % \ (string.capitalize(name), escape(data))) lines.append("%s=%s" % (name, escape(data))) # The [setup] section contains entries controlling # the installer runtime. lines.append("\n[Setup]") # FIXME: handle install scripts #if self.install_script: # lines.append("install_script=%s" % self.install_script) lines.append("info=%s" % escape(info)) # FIXME: handle this correctly lines.append("target_compile=1") lines.append("target_optimize=1") #if self.target_version: # lines.append("target_version=%s" % self.target_version) #if self.user_access_control: # lines.append("user_access_control=%s" % self.user_access_control) title = meta.fullname lines.append("title=%s" % escape(title)) build_info = "Built %s with bento-%s" % \ (time.ctime(time.time()), bento.__version__) lines.append("build_info=%s" % build_info) return string.join(lines, "\n")
def build_egg(ipkg, ctx, source_root, output_dir=None, output_file=None): meta = PackageMetadata.from_ipkg(ipkg) egg_info = EggInfo.from_ipkg(ipkg, ctx.build_node) # FIXME: fix egg name if output_dir is None: if output_file is None: egg = egg_filename(os.path.join("dist", meta.fullname)) else: egg = os.path.join("dist", output_file) else: if output_file is None: egg = egg_filename(os.path.join(output_dir, meta.fullname)) else: egg = os.path.join(output_dir, output_file) bento.utils.path.ensure_dir(egg) zid = compat.ZipFile(egg, "w", compat.ZIP_DEFLATED) try: ipkg.update_paths({ "prefix": source_root.abspath(), "eprefix": source_root.abspath(), "sitedir": source_root.abspath() }) for filename, cnt in egg_info.iter_meta(ctx.build_node): zid.writestr(os.path.join("EGG-INFO", filename), cnt) file_sections = ipkg.resolve_paths(source_root) for kind, source, target in iter_files(file_sections): if not kind in ["executables"]: zid.write(source.abspath(), target.path_from(source_root)) pprint("PINK", "Byte-compiling ...") for kind, source, target in iter_files(file_sections): if kind in ["pythonfiles"]: try: bytecode = bcompile(source.abspath()) except PyCompileError: e = extract_exception() warnings.warn("Error byte-compiling %r" % source.abspath()) else: zid.writestr("%sc" % target.path_from(source_root), bcompile(source.abspath())) finally: zid.close() return
def build_egg(ipkg, ctx, source_root, output_dir=None, output_file=None): meta = PackageMetadata.from_ipkg(ipkg) egg_info = EggInfo.from_ipkg(ipkg, ctx.build_node) # FIXME: fix egg name if output_dir is None: if output_file is None: egg = egg_filename(os.path.join("dist", meta.fullname)) else: egg = os.path.join("dist", output_file) else: if output_file is None: egg = egg_filename(os.path.join(output_dir, meta.fullname)) else: egg = os.path.join(output_dir, output_file) bento.utils.path.ensure_dir(egg) zid = compat.ZipFile(egg, "w", compat.ZIP_DEFLATED) try: ipkg.update_paths({"prefix": source_root.abspath(), "eprefix": source_root.abspath(), "sitedir": source_root.abspath()}) for filename, cnt in egg_info.iter_meta(ctx.build_node): zid.writestr(os.path.join("EGG-INFO", filename), cnt) file_sections = ipkg.resolve_paths(source_root) for kind, source, target in iter_files(file_sections): if not kind in ["executables"]: zid.write(source.abspath(), target.path_from(source_root)) pprint("PINK", "Byte-compiling ...") for kind, source, target in iter_files(file_sections): if kind in ["pythonfiles"]: try: bytecode = bcompile(source.abspath()) except PyCompileError: e = extract_exception() warnings.warn("Error byte-compiling %r" % source.abspath()) else: zid.writestr("%sc" % target.path_from(source_root), bcompile(source.abspath())) finally: zid.close() return
def build_egg(build_manifest, build_node, source_root, output_dir=None, output_file=None): meta = PackageMetadata.from_ipkg(build_manifest) egg_info = EggInfo.from_ipkg(build_manifest, build_node) # FIXME: fix egg name if output_dir is None: if output_file is None: egg = egg_filename(os.path.join("dist", meta.fullname)) else: egg = os.path.join("dist", output_file) else: if output_file is None: egg = egg_filename(os.path.join(output_dir, meta.fullname)) else: egg = os.path.join(output_dir, output_file) bento.utils.path.ensure_dir(egg) egg_scheme = {"prefix": source_root.abspath(), "eprefix": source_root.abspath(), "sitedir": source_root.abspath()} zid = compat.ZipFile(egg, "w", compat.ZIP_DEFLATED) try: for filename, cnt in egg_info.iter_meta(build_node): zid.writestr(os.path.join("EGG-INFO", filename), cnt) for kind, source, target in build_manifest.iter_built_files(source_root, egg_scheme): if not kind in ["executables"]: zid.write(source.abspath(), target.path_from(source_root)) if kind == "pythonfiles": try: bytecode = bcompile(source.abspath()) except PyCompileError: e = extract_exception() warnings.warn("Error byte-compiling %r" % source.abspath()) else: zid.writestr("%sc" % target.path_from(source_root), bcompile(source.abspath())) finally: zid.close() return
def create_wininst(ipkg, src_root_node, build_node, egg_info=None, wininst=None, output_dir=None): meta = PackageMetadata.from_ipkg(ipkg) if egg_info is None: egg_info = EggInfo.from_ipkg(ipkg, build_node) # XXX: do this correctly, maybe use same as distutils ? if wininst is None: wininst = os.path.join(output_dir, wininst_filename(meta)) else: wininst = os.path.join(output_dir, wininst) bento.utils.path.ensure_dir(wininst) egg_info_dir = os.path.join("PURELIB", egg_info_dirname(meta.fullname)) fid, arcname = tempfile.mkstemp(prefix="zip") zid = compat.ZipFile(arcname, "w", compat.ZIP_DEFLATED) try: for filename, cnt in egg_info.iter_meta(build_node): zid.writestr(os.path.join(egg_info_dir, filename), cnt) wininst_paths = compat.defaultdict(lambda: r"DATA\share\$pkgname") wininst_paths.update({"bindir": "SCRIPTS", "sitedir": "PURELIB", "gendatadir": "$sitedir"}) d = {} for k in ipkg._path_variables: d[k] = wininst_paths[k] ipkg.update_paths(d) file_sections = ipkg.resolve_paths(src_root_node) def write_content(source, target, kind): zid.write(source.abspath(), target.abspath()) for kind, source, target in iter_files(file_sections): write_content(source, target, kind) finally: zid.close() os.close(fid) create_exe(ipkg, arcname, wininst)
def build_egg(ipkg, ctx, source_root, path=None): meta = PackageMetadata.from_ipkg(ipkg) egg_info = EggInfo.from_ipkg(ipkg) # FIXME: fix egg name if path is None: egg = egg_filename(os.path.join("dist", meta.fullname)) else: egg = egg_filename(os.path.join(path, meta.fullname)) ensure_dir(egg) egg_info = EggInfo.from_ipkg(ipkg) zid = compat.ZipFile(egg, "w", compat.ZIP_DEFLATED) try: ipkg.update_paths({"prefix": ".", "eprefix": ".", "sitedir": "."}) for filename, cnt in egg_info.iter_meta(ctx.build_node): zid.writestr(os.path.join("EGG-INFO", filename), cnt) file_sections = ipkg.resolve_paths(source_root) for kind, source, target in iter_files(file_sections): if not kind in ["executables"]: zid.write(source, target) pprint("PINK", "Byte-compiling ...") for kind, source, target in iter_files(file_sections): if kind in ["pythonfiles"]: try: bytecode = bcompile(source) except PyCompileError, e: warnings.warn("Error byte-compiling %r" % source) else: zid.writestr("%sc" % target, bcompile(source)) finally: zid.close() return
create_scripts if __name__ == "__main__": import tempfile TMPDIR = tempfile.mkdtemp() try: EGG_PATH = sys.argv[1] zid = zipfile.ZipFile(EGG_PATH) try: zid.extractall(path=TMPDIR) finally: zid.close() ipkg = InstalledPkgDescription.from_egg(EGG_PATH) # Build executables bdir = os.path.join(TMPDIR, "SCRIPTS") os.makedirs(bdir) create_scripts(ipkg.executables, bdir) # XXX: use internal API for k in ipkg.files["executables"]: ipkg.files["executables"][k].source_dir = bdir meta = PackageMetadata.from_ipkg(ipkg) wininst = wininst_filename(meta.fullname) create_wininst(ipkg, src_root_dir=TMPDIR, wininst=wininst) finally: #shutil.rmtree(TMPDIR) pass
def build_wheel(build_manifest, build_node, source_root, output_dir=None, output_file=None): meta = PackageMetadata.from_ipkg(build_manifest) egg_info = WheelInfo.from_ipkg(build_manifest, build_node) assert not '_' in meta.version # FIXME: fix egg name if output_dir is None: if output_file is None: egg = wheel_filename(os.path.join("dist", meta.fullname)) else: egg = os.path.join("dist", output_file) else: if output_file is None: egg = wheel_filename(os.path.join(output_dir, meta.fullname)) else: egg = os.path.join(output_dir, output_file) bento.utils.path.ensure_dir(egg) egg_scheme = { "prefix": source_root.abspath(), "eprefix": source_root.abspath(), "sitedir": source_root.abspath() } record = [] zid = compat.ZipFile(egg, "w", compat.ZIP_DEFLATED) try: for kind, source, target in build_manifest.iter_built_files( source_root, egg_scheme): if not kind in ["executables"]: abspath = source.abspath() target_path = target.path_from(source_root).replace( os.path.sep, '/') zid.write(abspath, target_path) hash, length = hash_and_length(abspath) digest = "sha256=" + urlsafe_b64encode(hash) record.append((target_path, digest, length)) for filename, cnt in egg_info.iter_meta(build_node): name = '/'.join((meta.fullname + ".dist-info", filename)) digest = "sha256=" + urlsafe_b64encode( hashlib.sha256(cnt).digest()) zid.writestr(name, cnt) record.append((name, digest, len(cnt))) name = '/'.join((meta.fullname + ".dist-info", "WHEEL")) wheelfile = b'Wheel-Version: 0.1\nGenerator: bento\nRoot-Is-Purelib: true\n\n' zid.writestr(name, wheelfile) digest = "sha256=" + urlsafe_b64encode( hashlib.sha256(wheelfile).digest()) record.append((name, digest, len(wheelfile))) name = '/'.join((meta.fullname + ".dist-info", "RECORD")) sio = cStringIO.StringIO() writer = csv.writer(sio) for row in record: writer.writerow(row) writer.writerow((name, '', '')) zid.writestr(name, sio.getvalue()) finally: zid.close() return