Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

pkg_zip: overlapping TreeArtifact and file inputs result in duplicated directory entries #932

Open
rbeasley-avgo opened this issue Feb 5, 2025 · 0 comments
Labels
bug P2 An issue that should be worked on when time is available

Comments

@rbeasley-avgo
Copy link

Looks like more fallout from #640 .

Suppose a pkg_zip with two inputs, a TreeArtifact and a file where their destinations overlap and are expected to be merged in the resulting .zip file. The directories implicitly created by #640 may duplicate those already provided by the TreeArtifact, resulting in warnings to stderr and undefined downstream behavior.

# MODULE.bazel
bazel_dep(name = "bazel_skylib", version = "1.7.1")
bazel_dep(name = "rules_pkg", version = "1.0.1")
# defs.bzl
def _directory_impl(ctx):
    out = ctx.actions.declare_directory(ctx.attr.out)
    args = ctx.actions.args()
    args.add(out.path)
    args.add_all(ctx.attr.contents)
    ctx.actions.run_shell(
        outputs = [out],
        command = """
outdir=$1; shift
mkdir -p $outdir
for f in $@; do
    mkdir -p ${outdir}/$(dirname $f)
    touch ${outdir}/$f
done
""",
        arguments = [args],
    )
    return DefaultInfo(files = depset([out]))

directory = rule(
    _directory_impl,
    attrs = {
        "contents": attr.string_list(),
        "out": attr.string(),
    },
)
# BUILD
load("@bazel_skylib//rules:write_file.bzl", "write_file")
load("@rules_pkg//pkg:mappings.bzl", "pkg_files")
load("@rules_pkg//pkg:zip.bzl", "pkg_zip")
load(":defs.bzl", "directory")

directory(
    name = "metainf",
    out = "META-INF",
    contents = [
        "MANIFEST.MF",
        "com/example/foo/pom.xml",
    ],
)

write_file(
    name = "pom_properties",
    out = "pom.properties",
    content = [],
)

pkg_files(
    name = "metainf_pkg",
    srcs = ["metainf"],
)

pkg_files(
    name = "pom_pkg",
    srcs = [":pom_properties"],
    prefix = "META-INF/com/example/foo",
)

pkg_zip(
    name = "foo",
    out = "foo.jar",
    srcs = [
        ":metainf_pkg",
        ":pom_pkg",
    ],
)
$ bazelisk build :foo
INFO: Invocation ID: 1dcc898b-e2fe-4543-95b0-4b45f2f59cb8
INFO: Analyzed target //:foo (77 packages loaded, 2836 targets configured).
INFO: From PackageZip foo.jar:
.../execroot/_main/external/rules_python++python+python_3_11_x86_64-unknown-linux-gnu/lib/python3.11/zipfile.py:1567: UserWarning: Duplicate name: 'META-INF/com/'
  return self._open_to_write(zinfo, force_zip64=force_zip64)
.../execroot/_main/external/rules_python++python+python_3_11_x86_64-unknown-linux-gnu/lib/python3.11/zipfile.py:1567: UserWarning: Duplicate name: 'META-INF/com/example/'
  return self._open_to_write(zinfo, force_zip64=force_zip64)
.../execroot/_main/external/rules_python++python+python_3_11_x86_64-unknown-linux-gnu/lib/python3.11/zipfile.py:1567: UserWarning: Duplicate name: 'META-INF/com/example/foo/'
  return self._open_to_write(zinfo, force_zip64=force_zip64)
INFO: Found 1 target...
Target //:foo up-to-date:
  bazel-bin/foo.jar
INFO: Elapsed time: 0.912s, Critical Path: 0.30s
INFO: 3 processes: 7 action cache hit, 2 internal, 1 linux-sandbox.
INFO: Build completed successfully, 3 total actions
$ zipinfo  -1 bazel-bin/foo.jar
META-INF/
META-INF/MANIFEST.MF
META-INF/com/
META-INF/com/example/
META-INF/com/example/foo/
META-INF/com/example/foo/pom.xml
META-INF/com/
META-INF/com/example/
META-INF/com/example/foo/
META-INF/com/example/foo/pom.properties
Exception in thread "main" java.lang.RuntimeException: java.util.zip.ZipException: duplicate entry: META-INF/com/
        at org.eclipse.virgo.bundlor.support.manifestwriter.JarFileManifestWriter.write(JarFileManifestWriter.java:83)
        at org.eclipse.virgo.bundlor.commandline.internal.CommandLineBundlorExecutor.execute(CommandLineBundlorExecutor.java:64)
        at org.eclipse.virgo.bundlor.commandline.Bundlor.run(Bundlor.java:51)
        at org.eclipse.virgo.bundlor.commandline.Bundlor.main(Bundlor.java:37)
@aiuto aiuto added bug P2 An issue that should be worked on when time is available labels Feb 21, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug P2 An issue that should be worked on when time is available
Projects
None yet
Development

No branches or pull requests

2 participants