# 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', l])
  for l in pgmlibs:
    cmd.extend(['--pgmlib', l])

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

  genrule(
    name = name,
    cmd = ' '.join(cmd),
    deps = libs + pgmlibs + dep,
    out = name + '.war',
    visibility = visibility,
  )

def gerrit_war(name, ui = 'ui_optdbg', context = [], docs = False, visibility = []):
  war(
    name = name,
    libs = LIBS + ['//gerrit-war:version'],
    pgmlibs = PGMLIBS,
    context = [
      '//gerrit-main:main_bin',
      '//gerrit-war:webapp_assets',
      '//gerrit-gwtui:' + ui,
    ] + context,
    docs = docs,
    visibility = visibility,
  )
