# Copyright (C) 2013 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.

# These definitions support building a runnable version of Gerrit.

DOCS_HTML = '//Documentation:html'
DOCS_LIB = '//Documentation:index_lib'
LIBS = [
  '//gerrit-war:log4j-config',
  '//gerrit-war:init',
  '//lib:postgresql',
  '//lib/log:impl_log4j',
]
PGMLIBS = ['//gerrit-pgm:pgm']

def scan_plugins():
  import os
  deps = []
  for n in os.listdir('plugins'):
    if os.path.exists(os.path.join('plugins', n, 'BUCK')):
      deps.append('//plugins/%s:%s__plugin' % (n, n))
  return deps

def war(
    name,
    libs = [],
    pgmlibs = [],
    context = [],
    visibility = [],
    docs = False
    ):
  cmd = ['$(exe //tools:pack_war)', '-o', '$OUT', '--tmp', '$TMP']
  for l in libs:
    cmd.extend(['--lib', '$(classpath %s)' % l])
  for l in pgmlibs:
    cmd.extend(['--pgmlib', '$(classpath %s)' % l])

  if docs:
    cmd.append('$(location %s)' % DOCS_HTML)
    cmd.extend(['--lib', '$(classpath %s)' % DOCS_LIB])
  if context:
    for t in context:
      cmd.append('$(location %s)' % t)

  genrule(
    name = name,
    cmd = ' '.join(cmd),
    out = name + '.war',
    visibility = visibility,
  )

def gerrit_war(name, ui = 'ui_optdbg', context = [], docs = False, visibility = []):
  ui_deps = []
  if ui:
    if ui == 'polygerrit' or ui == 'ui_optdbg' or ui == 'ui_optdbg_r':
      ui_deps.append('//polygerrit-ui/app:polygerrit_ui')
    if ui != 'polygerrit':
      ui_deps.append('//gerrit-gwtui:%s' % ui)
  war(
    name = name,
    libs = LIBS + ['//gerrit-war:version'],
    pgmlibs = PGMLIBS,
    context = ui_deps + context + [
      '//gerrit-main:main_bin',
      '//gerrit-war:webapp_assets',
    ],
    docs = docs,
    visibility = visibility,
  )
