Add Buck build
Change-Id: I0549da0db48aeb1c22360ea0729441e860051b72
Signed-off-by: Edwin Kempin <edwin.kempin@sap.com>
diff --git a/.buckconfig b/.buckconfig
new file mode 100644
index 0000000..9f228b8
--- /dev/null
+++ b/.buckconfig
@@ -0,0 +1,11 @@
+[alias]
+ plugin = //:server-config
+
+[buildfile]
+ includes = //tools/buck.defs
+
+[java]
+ src_roots = java, resources
+
+[project]
+ ignore = .git
diff --git a/.gitignore b/.gitignore
index 80d6257..a45e726 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,4 @@
+/buck-out
/target
/.classpath
/.project
diff --git a/BUCK b/BUCK
new file mode 100644
index 0000000..4aaaec6
--- /dev/null
+++ b/BUCK
@@ -0,0 +1,21 @@
+include_defs('//lib/maven.defs')
+
+API_VERSION = '2.9-SNAPSHOT'
+REPO = MAVEN_LOCAL
+
+gerrit_plugin(
+ name = 'server-config',
+ srcs = glob(['src/main/java/**/*.java']),
+ resources = glob(['src/main/resources/**/*']),
+ manifest_entries = [
+ 'Gerrit-PluginName: server-config',
+ 'Gerrit-HttpModule: com.googlesource.gerrit.plugins.serverconfig.HttpModule',
+ ]
+)
+
+maven_jar(
+ name = 'plugin-lib',
+ id = 'com.google.gerrit:gerrit-plugin-api:' + API_VERSION,
+ repository = REPO,
+ license = 'Apache2.0',
+)
diff --git a/VERSION b/VERSION
new file mode 100644
index 0000000..44ed74b
--- /dev/null
+++ b/VERSION
@@ -0,0 +1 @@
+2.9-SNAPSHOT
diff --git a/lib/build.defs b/lib/build.defs
new file mode 100644
index 0000000..08418d0
--- /dev/null
+++ b/lib/build.defs
@@ -0,0 +1,76 @@
+include_defs('//lib/maven.defs')
+
+def java_library2(
+ name,
+ srcs = [],
+ resources = [],
+ deps = [],
+ compile_deps = [],
+ visibility = []):
+ c = name + '__compile'
+ t = name + '__link'
+ j = 'lib__%s__output/%s.jar' % (c, c)
+ o = 'lib__%s__output/%s.jar' % (name, name)
+ java_library(
+ name = c,
+ srcs = srcs,
+ resources = resources,
+ deps = deps + compile_deps,
+ visibility = visibility,
+ )
+ genrule(
+ name = t,
+ cmd = 'mkdir -p $(dirname $OUT);ln -s $SRCS $OUT',
+ srcs = [genfile(j)],
+ deps = [':' + c],
+ out = o,
+ )
+ prebuilt_jar(
+ name = name,
+ binary_jar = genfile(o),
+ deps = deps + [':' + t],
+ visibility = visibility,
+ )
+
+def gerrit_plugin(
+ name,
+ deps = [],
+ srcs = [],
+ resources = [],
+ manifest_file = None,
+ manifest_entries = [],
+ type = 'plugin',
+ visibility = ['PUBLIC']):
+ mf_cmd = 'v=$(cat VERSION);'
+ if manifest_file:
+ mf_src = [manifest_file]
+ mf_cmd += 'sed "s:@VERSION@:$v:g" $SRCS >$OUT'
+ else:
+ mf_src = []
+ mf_cmd += 'echo "Manifest-Version: 1.0" >$OUT;'
+ mf_cmd += 'echo "Gerrit-ApiType: %s" >>$OUT;' % type
+ mf_cmd += 'echo "Implementation-Version: $v" >>$OUT'
+ for line in manifest_entries:
+ mf_cmd += ';echo "%s" >> $OUT' % line
+ genrule(
+ name = name + '__manifest',
+ cmd = mf_cmd,
+ srcs = mf_src,
+ out = 'MANIFEST.MF',
+ )
+ java_library2(
+ name = name + '__plugin',
+ srcs = srcs,
+ resources = resources,
+ deps = deps,
+ compile_deps = ['//:%s-lib' % type],
+ )
+ java_binary(
+ name = name,
+ manifest_file = genfile('MANIFEST.MF'),
+ deps = [
+ ':%s__plugin' % name,
+ ':%s__manifest' % name,
+ ],
+ visibility = visibility,
+ )
diff --git a/lib/maven.defs b/lib/maven.defs
new file mode 100644
index 0000000..689040a
--- /dev/null
+++ b/lib/maven.defs
@@ -0,0 +1,63 @@
+GERRIT = 'GERRIT:'
+GERRIT_API = 'GERRIT_API:'
+MAVEN_LOCAL = 'MAVEN_LOCAL:'
+
+def maven_jar(
+ name,
+ id,
+ license,
+ deps = [],
+ sha1 = '',
+ bin_sha1 = '',
+ src_sha1 = '',
+ repository = GERRIT,
+ attach_source = True,
+ visibility = ['PUBLIC']):
+ from os import path
+
+ parts = id.split(':')
+ if len(parts) != 3:
+ raise NameError('expected id="groupId:artifactId:version"')
+ group, artifact, version = parts
+
+ file_version = version
+
+ jar = path.join(name, artifact.lower() + '-' + file_version)
+ url = '/'.join([
+ repository,
+ group.replace('.', '/'), artifact, version,
+ artifact + '-' + file_version])
+
+ binjar = jar + '.jar'
+ binurl = url + '.jar'
+
+ srcjar = jar + '-src.jar'
+ srcurl = url + '-sources.jar'
+
+ cmd = ['$(exe //tools:download_file)', '-o', '$OUT', '-u', binurl]
+ if sha1:
+ cmd.extend(['-v', sha1])
+ elif bin_sha1:
+ cmd.extend(['-v', bin_sha1])
+
+ genrule(
+ name = name + '__download_bin',
+ cmd = ' '.join(cmd),
+ deps = ['//tools:download_file'],
+ out = binjar,
+ )
+
+ srcjar = None
+ genrule(
+ name = name + '__download_src',
+ cmd = ':>$OUT',
+ out = '__' + name + '__no_src',
+ )
+
+ prebuilt_jar(
+ name = name,
+ deps = deps + [':' + name + '__download_bin'],
+ binary_jar = genfile(binjar),
+ source_jar = genfile(srcjar) if srcjar else None,
+ visibility = visibility,
+ )
diff --git a/tools/BUCK b/tools/BUCK
new file mode 100644
index 0000000..1b1175c
--- /dev/null
+++ b/tools/BUCK
@@ -0,0 +1,5 @@
+python_binary(
+ name = 'download_file',
+ main = 'download_file.py',
+ visibility = ['PUBLIC'],
+)
diff --git a/tools/buck.defs b/tools/buck.defs
new file mode 100644
index 0000000..41eeeca
--- /dev/null
+++ b/tools/buck.defs
@@ -0,0 +1,67 @@
+# Copyright (C) 2014 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.
+
+include_defs('//lib/build.defs')
+
+original_java_library = java_library
+def java_library(
+ name,
+ srcs=[],
+ resources=[],
+ source='7',
+ target='7',
+ proguard_config=None,
+ deps=[],
+ exported_deps=[],
+ visibility=[],
+ ):
+ original_java_library(
+ name=name,
+ srcs=srcs,
+ resources=resources,
+ source=source,
+ target=target,
+ proguard_config=proguard_config,
+ deps=deps,
+ exported_deps=exported_deps,
+ visibility=visibility,
+ )
+
+original_java_test = java_test
+def java_test(
+ name,
+ srcs=[],
+ labels=[],
+ resources=[],
+ source='7',
+ target='7',
+ vm_args=[],
+ source_under_test=[],
+ contacts=[],
+ deps=[],
+ visibility=[],
+ ):
+ original_java_test(
+ name=name,
+ srcs=srcs,
+ labels=labels,
+ resources=resources,
+ source=source,
+ target=target,
+ vm_args=vm_args,
+ source_under_test=source_under_test,
+ contacts=contacts,
+ deps=deps,
+ visibility=visibility,
+ )
diff --git a/tools/download_file.py b/tools/download_file.py
new file mode 100755
index 0000000..d71c3ac
--- /dev/null
+++ b/tools/download_file.py
@@ -0,0 +1,209 @@
+#!/usr/bin/python
+# 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.
+
+from __future__ import print_function
+
+from hashlib import sha1
+from optparse import OptionParser
+from os import link, makedirs, path, remove
+import shutil
+from subprocess import check_call, CalledProcessError
+from sys import stderr
+from zipfile import ZipFile, BadZipfile, LargeZipFile
+
+REPO_ROOTS = {
+ 'GERRIT': 'http://gerrit-maven.storage.googleapis.com',
+ 'GERRIT_API': 'https://gerrit-api.commondatastorage.googleapis.com/release',
+ 'ECLIPSE': 'https://repo.eclipse.org/content/groups/releases',
+ 'MAVEN_CENTRAL': 'http://repo1.maven.org/maven2',
+ 'MAVEN_LOCAL': 'file://' + path.expanduser('~/.m2/repository'),
+}
+
+GERRIT_HOME = path.expanduser('~/.gerritcodereview')
+CACHE_DIR = path.join(GERRIT_HOME, 'buck-cache')
+LOCAL_PROPERTIES = 'local.properties'
+
+
+def hashfile(p):
+ d = sha1()
+ with open(p, 'rb') as f:
+ while True:
+ b = f.read(8192)
+ if not b:
+ break
+ d.update(b)
+ return d.hexdigest()
+
+def safe_mkdirs(d):
+ if path.isdir(d):
+ return
+ try:
+ makedirs(d)
+ except OSError as err:
+ if not path.isdir(d):
+ raise err
+
+def download_properties(root_dir):
+ """ Get the download properties.
+
+ First tries to find the properties file in the given root directory,
+ and if not found there, tries in the Gerrit settings folder in the
+ user's home directory.
+
+ Returns a set of download properties, which may be empty.
+
+ """
+ p = {}
+ local_prop = path.join(root_dir, LOCAL_PROPERTIES)
+ if not path.isfile(local_prop):
+ local_prop = path.join(GERRIT_HOME, LOCAL_PROPERTIES)
+ if path.isfile(local_prop):
+ try:
+ with open(local_prop) as fd:
+ for line in fd:
+ if line.startswith('download.'):
+ d = [e.strip() for e in line.split('=', 1)]
+ name, url = d[0], d[1]
+ p[name[len('download.'):]] = url
+ except OSError:
+ pass
+ return p
+
+def cache_entry(args):
+ if args.v:
+ h = args.v
+ else:
+ h = sha1(args.u).hexdigest()
+ name = '%s-%s' % (path.basename(args.o), h)
+ return path.join(CACHE_DIR, name)
+
+def resolve_url(url, redirects):
+ s = url.find(':')
+ if s < 0:
+ return url
+ scheme, rest = url[:s], url[s+1:]
+ if scheme not in REPO_ROOTS:
+ return url
+ if scheme in redirects:
+ root = redirects[scheme]
+ else:
+ root = REPO_ROOTS[scheme]
+ root = root.rstrip('/')
+ rest = rest.lstrip('/')
+ return '/'.join([root, rest])
+
+opts = OptionParser()
+opts.add_option('-o', help='local output file')
+opts.add_option('-u', help='URL to download')
+opts.add_option('-v', help='expected content SHA-1')
+opts.add_option('-x', action='append', help='file to delete from ZIP')
+opts.add_option('--exclude_java_sources', action='store_true')
+opts.add_option('--unsign', action='store_true')
+args, _ = opts.parse_args()
+
+root_dir = args.o
+while root_dir:
+ root_dir, n = path.split(root_dir)
+ if n == 'buck-out':
+ break
+
+redirects = download_properties(root_dir)
+cache_ent = cache_entry(args)
+src_url = resolve_url(args.u, redirects)
+
+if not path.exists(cache_ent):
+ try:
+ safe_mkdirs(path.dirname(cache_ent))
+ except OSError as err:
+ print('error creating directory %s: %s' %
+ (path.dirname(cache_ent), err), file=stderr)
+ exit(1)
+
+ print('Download %s' % src_url, file=stderr)
+ try:
+ check_call(['curl', '--proxy-anyauth', '-sfo', cache_ent, src_url])
+ except OSError as err:
+ print('could not invoke curl: %s\nis curl installed?' % err, file=stderr)
+ exit(1)
+ except CalledProcessError as err:
+ print('error using curl: %s' % err, file=stderr)
+ exit(1)
+
+if args.v:
+ have = hashfile(cache_ent)
+ if args.v != have:
+ print((
+ '%s:\n' +
+ 'expected %s\n' +
+ 'received %s\n') % (src_url, args.v, have), file=stderr)
+ try:
+ remove(cache_ent)
+ except OSError as err:
+ if path.exists(cache_ent):
+ print('error removing %s: %s' % (cache_ent, err), file=stderr)
+ exit(1)
+
+exclude = []
+if args.x:
+ exclude += args.x
+if args.exclude_java_sources:
+ try:
+ zf = ZipFile(cache_ent, 'r')
+ try:
+ for n in zf.namelist():
+ if n.endswith('.java'):
+ exclude.append(n)
+ finally:
+ zf.close()
+ except (BadZipfile, LargeZipFile) as err:
+ print('error opening %s: %s' % (cache_ent, err), file=stderr)
+ exit(1)
+
+if args.unsign:
+ try:
+ zf = ZipFile(cache_ent, 'r')
+ try:
+ for n in zf.namelist():
+ if (n.endswith('.RSA')
+ or n.endswith('.SF')
+ or n.endswith('.LIST')):
+ exclude.append(n)
+ finally:
+ zf.close()
+ except (BadZipfile, LargeZipFile) as err:
+ print('error opening %s: %s' % (cache_ent, err), file=stderr)
+ exit(1)
+
+safe_mkdirs(path.dirname(args.o))
+if exclude:
+ try:
+ shutil.copyfile(cache_ent, args.o)
+ except (shutil.Error, IOError) as err:
+ print('error copying to %s: %s' % (args.o, err), file=stderr)
+ exit(1)
+ try:
+ check_call(['zip', '-d', args.o] + exclude)
+ except CalledProcessError as err:
+ print('error removing files from zip: %s' % err, file=stderr)
+ exit(1)
+else:
+ try:
+ link(cache_ent, args.o)
+ except OSError as err:
+ try:
+ shutil.copyfile(cache_ent, args.o)
+ except (shutil.Error, IOError) as err:
+ print('error copying to %s: %s' % (args.o, err), file=stderr)
+ exit(1)