예제 #1
0
파일: build_egg.py 프로젝트: dagss/Bento
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
예제 #2
0
파일: build_wheel.py 프로젝트: dholth/Bento
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
예제 #3
0
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)
예제 #4
0
파일: egg_utils.py 프로젝트: dagss/Bento
    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
예제 #5
0
    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
예제 #6
0
    def from_build_manifest(cls, build_manifest, src_node):
        meta = PackageMetadata.from_build_manifest(build_manifest)
        executables = build_manifest.executables

        file_sections = build_manifest.resolve_paths(src_node)
        sources = list([n.abspath() for n in iter_source_files(file_sections)])

        ret = cls(meta, executables, sources)
        ret.build_manifest = build_manifest
        return ret
예제 #7
0
파일: egg_utils.py 프로젝트: B-Rich/Bento
    def from_build_manifest(cls, build_manifest, src_node):
        meta = PackageMetadata.from_build_manifest(build_manifest)
        executables = build_manifest.executables

        file_sections = build_manifest.resolve_paths(src_node)
        sources = list([n.abspath() for n in iter_source_files(file_sections)])

        ret = cls(meta, executables, sources)
        ret.build_manifest = build_manifest
        return ret
def build_egg(build_manifest,
              build_node,
              source_root,
              output_dir=None,
              output_file=None):
    meta = PackageMetadata.from_build_manifest(build_manifest)
    egg_info = EggInfo.from_build_manifest(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
예제 #9
0
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)
예제 #10
0
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)
예제 #11
0
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
예제 #12
0
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")
예제 #13
0
파일: test_egg.py 프로젝트: B-Rich/Bento
    def _prepare_egg_info(self):
        create_fake_package(self.top_node, ["sphinx", "sphinx.builders"],
                            ["cat.py"], [Extension("_dog", [os.path.join("src", "dog.c")])])
        build_manifest_file = self.build_node.make_node(BUILD_MANIFEST_PATH)
        build_manifest_file.parent.mkdir()
        build_manifest_file.write("")

        files = [os.path.join("sphinx", "builders", "__init__.py"),
                 os.path.join("sphinx", "__init__.py"),
                 os.path.join("src", "dog.c"),
                 os.path.join("cat.py")]

        pkg = PackageDescription.from_string(DESCR)
        meta = PackageMetadata.from_package(pkg)
        executables = pkg.executables

        return EggInfo(meta, executables, files)
예제 #14
0
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
예제 #15
0
    def _prepare_egg_info(self):
        create_fake_package(
            self.top_node, ["sphinx", "sphinx.builders"], ["cat.py"],
            [Extension("_dog", [os.path.join("src", "dog.c")])])
        build_manifest_file = self.build_node.make_node(BUILD_MANIFEST_PATH)
        build_manifest_file.parent.mkdir()
        build_manifest_file.write("")

        files = [
            os.path.join("sphinx", "builders", "__init__.py"),
            os.path.join("sphinx", "__init__.py"),
            os.path.join("src", "dog.c"),
            os.path.join("cat.py")
        ]

        pkg = PackageDescription.from_string(DESCR)
        meta = PackageMetadata.from_package(pkg)
        executables = pkg.executables

        return EggInfo(meta, executables, files)
예제 #16
0
파일: build_egg.py 프로젝트: dholth/Bento
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
예제 #17
0
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)
예제 #18
0
파일: build_egg.py 프로젝트: abadger/Bento
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
예제 #19
0
        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
예제 #20
0
파일: build_wheel.py 프로젝트: dholth/Bento
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