Update buck build for strict dependencies

java_library() targets must now list every dependency they need for
an import. This permits buck to run more targets in parallel as it
has a better view of the dependency graph, and opens the door for
buck to make even more optimizations in the future.

Change-Id: I132bf47a725e44ba5950ba6ca76bfa72c3876906
diff --git a/.buckversion b/.buckversion
new file mode 100644
index 0000000..dcaab35
--- /dev/null
+++ b/.buckversion
@@ -0,0 +1 @@
+c4df74bef4e101a7e5d0176831825b7946ea64a3
diff --git a/BUCK b/BUCK
index baea9e1..d467528 100644
--- a/BUCK
+++ b/BUCK
@@ -26,6 +26,7 @@
     '//lib/guice:guice-servlet',
     '//lib:servlet-api-3_0',
   ],
+  export_deps = True,
   visibility = ['PUBLIC'],
 )
 
@@ -37,6 +38,7 @@
     '//gerrit-sshd:sshd',
     '//gerrit-httpd:httpd',
   ],
+  export_deps = True,
   visibility = ['PUBLIC'],
 )
 
diff --git a/gerrit-acceptance-tests/BUCK b/gerrit-acceptance-tests/BUCK
index dd93223..9e31d66 100644
--- a/gerrit-acceptance-tests/BUCK
+++ b/gerrit-acceptance-tests/BUCK
@@ -8,13 +8,27 @@
   name = 'acceptance_tests',
   srcs = glob(['src/test/java/**/*.java']),
   deps = TEST + [
+    '//gerrit-common:server',
+    '//gerrit-extension-api:api',
     '//gerrit-launcher:launcher',
     '//gerrit-pgm:pgm',
-    '//lib:servlet-api-3_0',
+    '//gerrit-reviewdb:server',
+
+    '//lib:args4j',
+    '//lib:gson',
+    '//lib:guava',
+    '//lib:gwtorm',
     '//lib:h2',
+    '//lib:jsch',
+    '//lib:jsr305',
     '//lib:junit',
+    '//lib:servlet-api-3_0',
+
+    '//lib/guice:guice',
+    '//lib/jgit:jgit',
     '//lib/jgit:junit',
     '//lib/openid:httpclient',
+    '//lib/openid:httpcore',
   ],
   source_under_test = TEST,
   labels = ['slow'],
diff --git a/gerrit-antlr/BUCK b/gerrit-antlr/BUCK
index a37da60..0e19320 100644
--- a/gerrit-antlr/BUCK
+++ b/gerrit-antlr/BUCK
@@ -2,16 +2,16 @@
   'QueryLexer.java',
   'QueryParser.java',
 ]
-
-java_library(
-  name = 'antlr',
-  deps = [':query'],
-  visibility = ['PUBLIC'],
-)
+PARSER_DEPS = [
+  ':query_antlr',
+  ':query_exception',
+  '//lib/antlr:java_runtime',
+]
 
 java_library(
   name = 'query_exception',
   srcs = ['src/main/java/com/google/gerrit/server/query/QueryParseException.java'],
+  visibility = ['PUBLIC'],
 )
 
 genantlr(
@@ -20,14 +20,11 @@
   outs = ANTLR_OUTS,
 )
 
+# Hack necessary to expose ANTLR generated code as JAR to Eclipse.
 java_library(
   name = 'lib',
   srcs = [genfile(f) for f in ANTLR_OUTS],
-  deps = [
-    ':query_antlr',
-    ':query_exception',
-    '//lib/antlr:java_runtime',
-  ],
+  deps = PARSER_DEPS,
 )
 
 genrule(
@@ -35,15 +32,12 @@
   cmd = 'ln -s $SRCS $OUT',
   srcs = [genfile('lib__lib__output/lib.jar')],
   deps = [':lib'],
-  out = 'query.jar',
+  out = 'query_parser.jar',
 )
 
 prebuilt_jar(
-  name = 'query',
-  binary_jar = genfile('query.jar'),
-  deps = [
-    ':query_link',
-    ':query_exception',
-    '//lib/antlr:java_runtime',
-  ],
+  name = 'query_parser',
+  binary_jar = genfile('query_parser.jar'),
+  deps = PARSER_DEPS + [':query_link'],
+  visibility = ['PUBLIC'],
 )
diff --git a/gerrit-cache-h2/BUCK b/gerrit-cache-h2/BUCK
index 638f3dc..d3e8994 100644
--- a/gerrit-cache-h2/BUCK
+++ b/gerrit-cache-h2/BUCK
@@ -2,9 +2,13 @@
   name = 'cache-h2',
   srcs = glob(['src/main/java/**/*.java']),
   deps = [
+    '//gerrit-extension-api:api',
     '//gerrit-server:server',
     '//lib:guava',
     '//lib:h2',
+    '//lib/guice:guice',
+    '//lib/jgit:jgit',
+    '//lib/log:api',
   ],
   visibility = ['PUBLIC'],
 )
diff --git a/gerrit-common/BUCK b/gerrit-common/BUCK
index 8dfdbb7..07bbcae 100644
--- a/gerrit-common/BUCK
+++ b/gerrit-common/BUCK
@@ -9,7 +9,10 @@
     '//gerrit-patch-jgit:client',
     '//gerrit-prettify:client',
     '//gerrit-reviewdb:client',
+    '//lib:gwtjsonrpc',
+    '//lib:gwtorm',
     '//lib:jsr305',
+    '//lib/jgit:jgit',
   ],
   visibility = ['PUBLIC'],
 )
@@ -21,7 +24,10 @@
     '//gerrit-patch-jgit:server',
     '//gerrit-prettify:server',
     '//gerrit-reviewdb:server',
+    '//lib:gwtjsonrpc',
+    '//lib:gwtorm',
     '//lib:jsr305',
+    '//lib/jgit:jgit',
   ],
   visibility = ['PUBLIC'],
 )
diff --git a/gerrit-extension-api/BUCK b/gerrit-extension-api/BUCK
index 25aba72..75539f6 100644
--- a/gerrit-extension-api/BUCK
+++ b/gerrit-extension-api/BUCK
@@ -1,10 +1,6 @@
 java_library2(
   name = 'api',
   srcs = glob(['src/main/java/com/google/gerrit/extensions/**/*.java']),
-  compile_deps = [
-    '//lib/guice:guice',
-    '//lib/guice:guice-servlet',
-    '//lib:servlet-api-3_0',
-  ],
+  compile_deps = ['//lib/guice:guice'],
   visibility = ['PUBLIC'],
 )
diff --git a/gerrit-gwtui/BUCK b/gerrit-gwtui/BUCK
index c9d87c4..dc47d82 100644
--- a/gerrit-gwtui/BUCK
+++ b/gerrit-gwtui/BUCK
@@ -72,7 +72,10 @@
     '//gerrit-reviewdb:client',
     '//lib:gwtjsonrpc',
     '//lib:gwtjsonrpc_src',
+    '//lib:gwtorm',
+    '//lib:jsr305',
     '//lib/gwt:user',
+    '//lib/jgit:jgit',
   ],
   visibility = [
     '//tools/eclipse:classpath',
@@ -87,6 +90,7 @@
     ':ui_module',
     '//lib:junit',
     '//lib/gwt:dev',
+    '//lib/jgit:jgit',
   ],
   source_under_test = [':ui_module'],
 )
diff --git a/gerrit-httpd/BUCK b/gerrit-httpd/BUCK
index 4b1981b..51f951d 100644
--- a/gerrit-httpd/BUCK
+++ b/gerrit-httpd/BUCK
@@ -3,16 +3,33 @@
   srcs = glob(['src/main/java/**/*.java']),
   resources = glob(['src/main/resources/**/*']),
   deps = [
+    '//gerrit-antlr:query_exception',
+    '//gerrit-common:server',
+    '//gerrit-extension-api:api',
     '//gerrit-gwtexpui:linker_server',
     '//gerrit-gwtexpui:server',
+    '//gerrit-patch-jgit:server',
     '//gerrit-prettify:server',
+    '//gerrit-reviewdb:server',
     '//gerrit-server:server',
+    '//gerrit-util-cli:cli',
+    '//lib:args4j',
+    '//lib:gson',
+    '//lib:guava',
     '//lib:gwtjsonrpc',
+    '//lib:gwtorm',
+    '//lib:jsch',
     '//lib:jsr305',
     '//lib:mime-util',
-    '//lib:servlet-api-3_0',
+    '//lib/commons:codec',
+    '//lib/guice:guice',
+    '//lib/guice:guice-assistedinject',
+    '//lib/guice:guice-servlet',
+    '//lib/jgit:jgit',
     '//lib/jgit:jgit-servlet',
+    '//lib/log:api',
   ],
+  compile_deps = ['//lib:servlet-api-3_0'],
   visibility = ['PUBLIC'],
 )
 
@@ -21,9 +38,18 @@
   srcs = glob(['src/test/java/**/*.java']),
   deps = [
     ':httpd',
+    '//gerrit-common:server',
+    '//gerrit-extension-api:api',
+    '//gerrit-reviewdb:server',
+    '//gerrit-server:server',
     '//lib:easymock',
     '//lib:junit',
+    '//lib:gson',
+    '//lib:gwtorm',
+    '//lib:guava',
     '//lib:servlet-api-3_0',
+    '//lib/guice:guice',
+    '//lib/jgit:jgit',
     '//lib/jgit:junit',
   ],
   source_under_test = [':httpd'],
diff --git a/gerrit-openid/BUCK b/gerrit-openid/BUCK
index 582a7de..0801534 100644
--- a/gerrit-openid/BUCK
+++ b/gerrit-openid/BUCK
@@ -1,17 +1,23 @@
-java_library(
+java_library2(
   name = 'openid',
   srcs = glob(['src/main/java/**/*.java']),
   resources = glob(['src/main/resources/**/*']),
   deps = [
     '//gerrit-common:server',
     '//gerrit-extension-api:api',
+    '//gerrit-gwtexpui:server',
     '//gerrit-httpd:httpd',
+    '//gerrit-reviewdb:server',
+    '//gerrit-server:server',
     '//lib:guava',
+    '//lib:gwtorm',
     '//lib:jsr305',
-    '//lib:servlet-api-3_0',
     '//lib/guice:guice',
+    '//lib/guice:guice-servlet',
+    '//lib/jgit:jgit',
     '//lib/log:api',
     '//lib/openid:consumer',
   ],
+  compile_deps = ['//lib:servlet-api-3_0'],
   visibility = ['PUBLIC'],
 )
diff --git a/gerrit-pgm/BUCK b/gerrit-pgm/BUCK
index daed401..ef0b532 100644
--- a/gerrit-pgm/BUCK
+++ b/gerrit-pgm/BUCK
@@ -3,21 +3,36 @@
   srcs = glob(['src/main/java/**/*.java']),
   resources = glob(['src/main/resources/**/*']),
   deps = [
-    '//gerrit-server:common_rules',
-    '//gerrit-server:server',
-    '//gerrit-httpd:httpd',
-    '//gerrit-sshd:sshd',
-
     '//gerrit-cache-h2:cache-h2',
+    '//gerrit-common:server',
+    '//gerrit-extension-api:api',
+    '//gerrit-httpd:httpd',
     '//gerrit-openid:openid',
-
+    '//gerrit-server:common_rules',
+    '//gerrit-reviewdb:server',
+    '//gerrit-server:server',
+    '//gerrit-sshd:sshd',
     '//gerrit-util-cli:cli',
+    '//lib:args4j',
+    '//lib:guava',
+    '//lib:gwtorm',
+    '//lib:gwtjsonrpc',
+    '//lib:h2',
+    '//lib:jsr305',
+    '//lib:servlet-api-3_0',
+    '//lib/commons:dbcp',
+    '//lib/guice:guice',
+    '//lib/guice:guice-assistedinject',
+    '//lib/guice:guice-servlet',
+    '//lib/jetty:server',
     '//lib/jetty:servlet',
+    '//lib/jgit:jgit',
+    '//lib/log:api',
     '//lib/log:log4j',
+    '//lib/mina:sshd',
+    '//lib/prolog:prolog-cafe',
   ],
-  compile_deps = [
-    '//gerrit-launcher:launcher',
-  ],
+  compile_deps = ['//gerrit-launcher:launcher'],
   visibility = [
     '//:',
     '//gerrit-acceptance-tests:',
diff --git a/gerrit-server/BUCK b/gerrit-server/BUCK
index 86cad4e..3132075 100644
--- a/gerrit-server/BUCK
+++ b/gerrit-server/BUCK
@@ -1,18 +1,26 @@
 include_defs('//lib/prolog/DEFS')
 
+# TODO(sop) break up gerrit-server java_library(), its too big
 java_library2(
   name = 'server',
   srcs = glob(['src/main/java/**/*.java']),
   resources = glob(['src/main/resources/**/*']),
   deps = [
-    '//gerrit-antlr:antlr',
+    '//gerrit-antlr:query_exception',
+    '//gerrit-antlr:query_parser',
     '//gerrit-common:server',
     '//gerrit-extension-api:api',
+    '//gerrit-patch-commonsnet:commons-net',
+    '//gerrit-patch-jgit:server',
+    '//gerrit-reviewdb:server',
     '//gerrit-util-cli:cli',
     '//gerrit-util-ssl:ssl',
-    '//gerrit-patch-commonsnet:commons-net',
+    '//lib:args4j',
     '//lib:automaton',
+    '//lib:gson',
     '//lib:guava',
+    '//lib:gwtjsonrpc',
+    '//lib:gwtorm',
     '//lib:jsch',
     '//lib:jsr305',
     '//lib:juniversalchardet',
@@ -20,8 +28,11 @@
     '//lib:ow2-asm',
     '//lib:ow2-asm-tree',
     '//lib:ow2-asm-util',
+    '//lib:parboiled-core',
     '//lib:pegdown',
     '//lib:velocity',
+    '//lib/antlr:java_runtime',
+    '//lib/commons:codec',
     '//lib/commons:dbcp',
     '//lib/commons:lang',
     '//lib/commons:net',
@@ -33,6 +44,7 @@
     '//lib/prolog:prolog-cafe',
   ],
   compile_deps = [
+    '//lib/bouncycastle:bcprov',
     '//lib/bouncycastle:bcpg',
   ],
   visibility = ['PUBLIC'],
@@ -52,10 +64,21 @@
   deps = [
     ':server',
     ':common_rules',
+    '//gerrit-antlr:query_exception',
+    '//gerrit-antlr:query_parser',
+    '//gerrit-common:server',
+    '//gerrit-extension-api:api',
+    '//gerrit-reviewdb:server',
+    '//lib:easymock',
+    '//lib:guava',
+    '//lib:gwtorm',
     '//lib:h2',
     '//lib:junit',
-    '//lib:easymock',
+    '//lib/antlr:java_runtime',
+    '//lib/guice:guice',
+    '//lib/jgit:jgit',
     '//lib/jgit:junit',
+    '//lib/prolog:prolog-cafe',
   ],
   source_under_test = [':server'],
 )
diff --git a/gerrit-sshd/BUCK b/gerrit-sshd/BUCK
index 72e63cb..769be58 100644
--- a/gerrit-sshd/BUCK
+++ b/gerrit-sshd/BUCK
@@ -2,13 +2,27 @@
   name = 'sshd',
   srcs = glob(['src/main/java/**/*.java']),
   deps = [
+    '//gerrit-extension-api:api',
     '//gerrit-cache-h2:cache-h2',
+    '//gerrit-common:server',
+    '//gerrit-patch-jgit:server',
+    '//gerrit-reviewdb:server',
     '//gerrit-server:server',
     '//gerrit-util-cli:cli',
+    '//lib:args4j',
+    '//lib:gson',
+    '//lib:guava',
+    '//lib:gwtorm',
+    '//lib:jsch',
+    '//lib/commons:codec',
+    '//lib/guice:guice',
+    '//lib/guice:guice-assistedinject',
+    '//lib/guice:guice-servlet',  # SSH should not depend on servlet
     '//lib/log:api',
     '//lib/log:log4j',
     '//lib/mina:core',
     '//lib/mina:sshd',
+    '//lib/jgit:jgit',
   ],
   compile_deps = [
     '//lib/bouncycastle:bcprov',
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/Commands.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/Commands.java
index 929a895..1a5e62cc 100644
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/Commands.java
+++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/Commands.java
@@ -16,7 +16,6 @@
 
 import com.google.inject.Key;
 
-import org.apache.commons.lang.StringUtils;
 import org.apache.sshd.server.Command;
 
 import java.lang.annotation.Annotation;
@@ -124,7 +123,7 @@
     NestedCommandNameImpl(final CommandName parent, final String name) {
       this.parent = parent;
       this.name = name;
-      this.descr = StringUtils.EMPTY;
+      this.descr = "";
     }
 
     NestedCommandNameImpl(final CommandName parent, final String name,
diff --git a/gerrit-war/BUCK b/gerrit-war/BUCK
index 2f2b34c..8cf24ad 100644
--- a/gerrit-war/BUCK
+++ b/gerrit-war/BUCK
@@ -1,14 +1,22 @@
-java_library(
+java_library2(
   name = 'init',
   srcs = glob(['src/main/java/**/*.java']),
   deps = [
+    '//gerrit-cache-h2:cache-h2',
+    '//gerrit-extension-api:api',
+    '//gerrit-httpd:httpd',
+    '//gerrit-openid:openid',
+    '//gerrit-reviewdb:server',
     '//gerrit-server:common_rules',
     '//gerrit-server:server',
-    '//gerrit-httpd:httpd',
     '//gerrit-sshd:sshd',
-    '//gerrit-cache-h2:cache-h2',
-    '//gerrit-openid:openid',
+    '//lib:gwtorm',
+    '//lib/guice:guice',
+    '//lib/guice:guice-servlet',
+    '//lib/log:api',
+    '//lib/jgit:jgit',
   ],
+  compile_deps = ['//lib:servlet-api-3_0'],
   visibility = [
     '//:',
     '//gerrit-gwtdebug:gwtdebug',
diff --git a/lib/BUCK b/lib/BUCK
index c4de186..9f24e6f 100644
--- a/lib/BUCK
+++ b/lib/BUCK
@@ -169,7 +169,6 @@
   sha1 = '3fc3013adf98701efcc594a1ea99a3f841dc81bb',
   license = 'Apache2.0',
   attach_source = False,
-  visibility = [],
 )
 
 maven_jar(
diff --git a/lib/guice/BUCK b/lib/guice/BUCK
index 0cfe5f5..48c3be3 100644
--- a/lib/guice/BUCK
+++ b/lib/guice/BUCK
@@ -7,16 +7,24 @@
   'META-INF/NOTICE',
 ]
 
-maven_jar(
+java_library(
   name = 'guice',
+  deps = [
+    ':guice_library',
+    ':javax-inject',
+  ],
+  export_deps = True,
+  visibility = ['PUBLIC'],
+)
+
+maven_jar(
+  name = 'guice_library',
   id = 'com.google.inject:guice:' + VERSION,
   sha1 = '9d84f15fe35e2c716a02979fb62f50a29f38aefa',
   license = 'Apache2.0',
-  deps = [
-    ':javax-inject',
-    ':aopalliance',
-  ],
+  deps = [':aopalliance'],
   exclude = EXCLUDE,
+  visibility = [],
 )
 
 maven_jar(
@@ -37,7 +45,6 @@
   exclude = EXCLUDE,
 )
 
-
 maven_jar(
   name = 'aopalliance',
   id = 'aopalliance:aopalliance:1.0',
diff --git a/lib/jetty/BUCK b/lib/jetty/BUCK
index b7bdbac..6eac1a9 100644
--- a/lib/jetty/BUCK
+++ b/lib/jetty/BUCK
@@ -34,8 +34,8 @@
     ':continuation',
     ':http',
   ],
+  export_deps = True,
   exclude = EXCLUDE,
-  visibility = [],
 )
 
 maven_jar(
@@ -44,7 +44,6 @@
   sha1 = 'f60cfe6267038000b459508529c88737601081e4',
   license = 'Apache2.0',
   exclude = EXCLUDE,
-  visibility = [],
 )
 
 maven_jar(
@@ -54,7 +53,6 @@
   license = 'Apache2.0',
   deps = [':io'],
   exclude = EXCLUDE,
-  visibility = [],
 )
 
 maven_jar(
diff --git a/lib/maven.defs b/lib/maven.defs
index c7bf11c..3aeb891 100644
--- a/lib/maven.defs
+++ b/lib/maven.defs
@@ -35,6 +35,7 @@
     sha1 = '', bin_sha1 = '', src_sha1 = '',
     repository = MAVEN_CENTRAL,
     attach_source = True,
+    export_deps = False,
     visibility = ['PUBLIC']):
   from os import path
 
@@ -101,10 +102,24 @@
       out = '__' + name + '__no_src',
     )
 
-  prebuilt_jar(
-    name = name,
-    deps = deps + license + [':' + name + '__download_bin'],
-    binary_jar = genfile(binjar),
-    source_jar = genfile(srcjar) if srcjar else None,
-    visibility = visibility,
-  )
+  if export_deps:
+    prebuilt_jar(
+      name = name + '__jar',
+      deps = deps + license + [':' + name + '__download_bin'],
+      binary_jar = genfile(binjar),
+      source_jar = genfile(srcjar) if srcjar else None,
+    )
+    java_library(
+      name = name,
+      deps = [':' + name + '__jar'],
+      export_deps = True,
+      visibility = visibility,
+    )
+  else:
+    prebuilt_jar(
+      name = name,
+      deps = deps + license + [':' + name + '__download_bin'],
+      binary_jar = genfile(binjar),
+      source_jar = genfile(srcjar) if srcjar else None,
+      visibility = visibility,
+    )
diff --git a/lib/openid/BUCK b/lib/openid/BUCK
index 0327a90..b766532 100644
--- a/lib/openid/BUCK
+++ b/lib/openid/BUCK
@@ -60,5 +60,4 @@
     'META-INF/LICENSE.txt',
     'META-INF/NOTICE.txt',
   ],
-  visibility = [],
 )