# Copyright (C) 2016 The Android Open Source Project # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # War packaging. jar_filetype = FileType([".jar"]) LIBS = [ "//gerrit-war:init", "//gerrit-war:log4j-config", "//gerrit-war:version", "//lib:postgresql", "//lib/bouncycastle:bcpkix", "//lib/bouncycastle:bcprov", "//lib/bouncycastle:bcpg", "//lib/log:impl-log4j", ] PGMLIBS = [ "//gerrit-pgm:pgm", ] def _add_context(in_file, output): input_path = in_file.path return [ "unzip -qd %s %s" % (output, input_path), ] def _add_file(in_file, output): output_path = output input_path = in_file.path short_path = in_file.short_path n = in_file.basename if short_path.startswith("gerrit-"): n = short_path.split("/")[0] + "-" + n output_path += n return [ "test -L %s || ln -s $(pwd)/%s %s" % (output_path, input_path, output_path), ] def _make_war(input_dir, output): return "(%s)" % " && ".join([ "root=$(pwd)", "TZ=UTC", "export TZ", "cd %s" % input_dir, "find . -exec touch -t 198001010000 '{}' ';' 2> /dev/null", "zip -X -9qr ${root}/%s ." % (output.path), ]) def _war_impl(ctx): war = ctx.outputs.war build_output = war.path + ".build_output" inputs = [] # Create war layout cmd = [ "set -e;rm -rf " + build_output, "mkdir -p " + build_output, "mkdir -p %s/WEB-INF/lib" % build_output, "mkdir -p %s/WEB-INF/pgm-lib" % build_output, ] # Add lib transitive_lib_deps = depset() for l in ctx.attr.libs: if hasattr(l, "java"): transitive_lib_deps += l.java.transitive_runtime_deps elif hasattr(l, "files"): transitive_lib_deps += l.files for dep in transitive_lib_deps: cmd += _add_file(dep, build_output + "/WEB-INF/lib/") inputs.append(dep) # Add pgm lib transitive_pgmlib_deps = depset() for l in ctx.attr.pgmlibs: transitive_pgmlib_deps += l.java.transitive_runtime_deps for dep in transitive_pgmlib_deps: if dep not in inputs: cmd += _add_file(dep, build_output + "/WEB-INF/pgm-lib/") inputs.append(dep) # Add context transitive_context_deps = depset() if ctx.attr.context: for jar in ctx.attr.context: if hasattr(jar, "java"): transitive_context_deps += jar.java.transitive_runtime_deps elif hasattr(jar, "files"): transitive_context_deps += jar.files for dep in transitive_context_deps: cmd += _add_context(dep, build_output) inputs.append(dep) # Add zip war cmd.append(_make_war(build_output, war)) ctx.action( inputs = inputs, outputs = [war], mnemonic = "WAR", command = "\n".join(cmd), use_default_shell_env = True, ) # context: go to the root directory # libs: go to the WEB-INF/lib directory # pgmlibs: go to the WEB-INF/pgm-lib directory _pkg_war = rule( attrs = { "context": attr.label_list(allow_files = True), "libs": attr.label_list(allow_files = jar_filetype), "pgmlibs": attr.label_list(allow_files = False), }, outputs = {"war": "%{name}.war"}, implementation = _war_impl, ) def pkg_war(name, ui = "ui_optdbg", context = [], doc = False, **kwargs): doc_ctx = [] doc_lib = [] ui_deps = [] if ui == "polygerrit" or ui == "ui_optdbg" or ui == "ui_optdbg_r": ui_deps.append("//polygerrit-ui/app:polygerrit_ui") if ui and ui != "polygerrit": ui_deps.append("//gerrit-gwtui:%s" % ui) if doc: doc_ctx.append("//Documentation:html") doc_lib.append("//Documentation:index") _pkg_war( name = name, libs = LIBS + doc_lib, pgmlibs = PGMLIBS, context = doc_ctx + context + ui_deps + [ "//gerrit-main:main_bin_deploy.jar", "//gerrit-war:webapp_assets", ], **kwargs )