blob: 46a4f9bfeb9de9fc13b241d48ef014dd647177e7 [file] [log] [blame]
# 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 = [
"//java/com/google/gerrit/common:version",
"//java/com/google/gerrit/httpd/init",
"//lib:postgresql",
"//lib/bouncycastle:bcpkix",
"//lib/bouncycastle:bcprov",
"//lib/bouncycastle:bcpg",
"//lib/log:impl-log4j",
"//resources:log4j-config",
]
PGMLIBS = [
"//java/com/google/gerrit/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
elif short_path.startswith('java/'):
n = short_path[5:].replace('/', '_')
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.actions.run_shell(
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 + [
'//java:gerrit-main-class_deploy.jar',
'//webapp:assets',
],
**kwargs
)