bazelbuild / rules_pkg

Bazel rules for creating packages of many types (zip, tar, deb, rpm, ...)
Apache License 2.0
221 stars 174 forks source link

version_file's content not getting appended to the deb package's name #845

Open taytayallday opened 6 months ago

taytayallday commented 6 months ago

The version_file attribute of pkg_deb is not working correctly. The name of the debian package that bazel generates should be in the form of name_version_arch.deb which is true when you have a pkg_deb with "version". But for some reason, you end up with name__arch.deb when you have the "version_file" attribute. The .changes file does contain the version in the text file, but the name does not end up with it

On a bazel build with pkg_deb that has version:

builder@container:~/mybazel/bazel-bin$ ls
mydeb.deb  mydeb_1.1.1_amd64.changes  mydeb_1.1.1_amd64.deb  mytar.manifest  mytar.tar.gz  src

On a bazel build with pkg_deb that has version_file:

builder@container:~/mybazel/bazel-bin$ ls
mydeb.deb             mydeb__amd64.changes  mydeb__amd64.deb      mytar.manifest        mytar.tar.gz
builder@container:~/mybazel/bazel-bin$ cat mydeb__amd64.changes 
Format: 1.8
Date: Thu Jan  1 00:00:00 1970
Source: mydeb
Binary: mydeb
Architecture: amd64
Version: 1.1.1
taytayallday commented 6 months ago

In [rules_pkg/pkg/private/deb/deb.bzl], we have

def _pkg_deb_impl(ctx):
    """The implementation for the pkg_deb rule."""

    package_file_name = ctx.attr.package_file_name
    if not package_file_name:
        package_file_name = "%s_%s_%s.deb" % (
            ctx.attr.package,
            ctx.attr.version,
            ctx.attr.architecture,
        )

    outputs, output_file, output_name = setup_output_files(
        ctx,
        package_file_name = package_file_name,
    )

but in the case where we use version_file, version is empty.

aiuto commented 6 months ago

This not possible given the relative ordering of analysis and execution in Bazel. The file name is defined at analysis time, which must complete before we execute the actions required by the rule. Reading the content of the version file happens in that execution phase.

It would be possible to detect that the user specified the version file and neither the file name or the version, os that the file name would be mydeb_XXXX_x86.deb. Or maybe it could fail hard.