Merge changes from topic 'javadoc'

* changes:
  Allow to provide URLs for docs of external classes
  Allow to create javadocs for multiple packages
  Remove unnecessary reference to $SRCDIR in Buck genrules
diff --git a/buckversion b/buckversion
index 6686020..b2b427a 100644
--- a/buckversion
+++ b/buckversion
@@ -1 +1 @@
-d1be554f51fb9b2f090a85fcdbcef3b4dbbef8d7
+75b74ccf90a590b284b1a1553dc48af8844a9ca7
diff --git a/gerrit_plugin.bucklet b/gerrit_plugin.bucklet
index 2c374c8..922bd77 100644
--- a/gerrit_plugin.bucklet
+++ b/gerrit_plugin.bucklet
@@ -73,7 +73,8 @@
     gwt_module = None,
     manifest_entries = [],
     type = 'plugin',
-    visibility = ['PUBLIC']):
+    visibility = ['PUBLIC'],
+    target_suffix = ''):
   from multiprocessing import cpu_count
   from os import path,getcwd
   # TODO(davido): Remove this hack and replace all this mess with just
@@ -151,7 +152,7 @@
     )
 
   java_binary(
-    name = name,
+    name = name + target_suffix,
     manifest_file = ':%s__manifest' % name,
     merge_manifests = False,
     deps = [
diff --git a/java_doc.bucklet b/java_doc.bucklet
index 64b8d87..72122f1 100644
--- a/java_doc.bucklet
+++ b/java_doc.bucklet
@@ -63,7 +63,6 @@
       '-d $TMP',
     ]) + ';jar cf $OUT -C $TMP .',
     srcs = srcs,
-    deps = deps,
     out = name + '.jar',
     visibility = visibility,
 )
diff --git a/local_jar.bucklet b/local_jar.bucklet
deleted file mode 100644
index a7bd35b..0000000
--- a/local_jar.bucklet
+++ /dev/null
@@ -1,64 +0,0 @@
-# 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.
-#
-# If a dependent library is undergoing active development it must be
-# recompiled and the change must be reflected in the Buck build process. For
-# example testing Gerrit against changed JGit snapshot version. After building
-# JGit library, the artifacts are created in local Maven build directory.
-#
-# To shorten that workflow and take the installation of the artifacts to the
-# local Maven repository and fetching it again from there out of the picture,
-# `local_jar()` method is used:
-#
-# Example:
-#
-# local_jar(
-#   name = 'jgit',
-#   jar = '/home/<user>/projects/jgit/org.eclipse.jgit/target/org.eclipse.jgit-3.3.0-SNAPSHOT.jar',
-#   src_jar = '/home/<user>/projects/jgit/org.eclipse.jgit/target/org.eclipse.jgit-3.3.0-SNAPSHOT-sources.jar',
-#   deps = [':ewah']
-# )
-#
-def local_jar(
-    name,
-    jar,
-    src_jar = None,
-    deps = [],
-    visibility = ['PUBLIC']):
-  binjar = name + '.jar'
-  srcjar = name + '-src.jar'
-  genrule(
-    name = name + '__local_bin',
-    cmd = 'ln -s %s $OUT' % jar,
-    out = binjar)
-  if src_jar:
-    genrule(
-      name = name + '__local_src',
-      cmd = 'ln -s %s $OUT' % src_jar,
-      out = srcjar)
-    prebuilt_jar(
-      name = name + '_src',
-      binary_jar = ':' + name + '__local_src',
-      visibility = visibility,
-    )
-  else:
-    srcjar = None
-
-  prebuilt_jar(
-    name = name,
-    deps = deps,
-    binary_jar = ':' + name + '__local_bin',
-    source_jar = ':' + name + '__local_src' if srcjar else None,
-    visibility = visibility,
-  )
diff --git a/maven_jar.bucklet b/maven_jar.bucklet
index 0692fc4..3a26a66 100644
--- a/maven_jar.bucklet
+++ b/maven_jar.bucklet
@@ -44,7 +44,6 @@
 
 GERRIT = 'GERRIT:'
 GERRIT_API = 'GERRIT_API:'
-ECLIPSE = 'ECLIPSE:'
 MAVEN_CENTRAL = 'MAVEN_CENTRAL:'
 MAVEN_LOCAL = 'MAVEN_LOCAL:'
 
@@ -84,7 +83,13 @@
     group, artifact, version = parts
     classifier = None
 
-  if 'SNAPSHOT' in version and repository != MAVEN_LOCAL:
+  # SNAPSHOT artifacts are handled differently on Google storage bucket:
+  # 'SNAPSHOT' is discarded from the directory name. However on other
+  # Maven repositories, most notable local repository located in
+  # ~/.m2/repository (and is supported through MAVEN_LOCAL repository)
+  # it must be preserved, otherwise the artifact wouldn't be found.
+  # Atm the SNAPSHOT part is only discarded for Google storage bucket.
+  if 'SNAPSHOT' in version and repository.startswith(GERRIT):
     file_version = version.replace('-SNAPSHOT', '')
     version = version.split('-SNAPSHOT')[0] + '-SNAPSHOT'
   else:
@@ -94,6 +99,7 @@
     file_version += '-' + classifier
 
   jar = path.join(name, artifact.lower() + '-' + file_version)
+
   url = '/'.join([
     repository,
     group.replace('.', '/'), artifact, version,
@@ -118,12 +124,10 @@
     cmd.append('--unsign')
 
   genrule(
-    name = name + '__download_bin',
+    name = '%s__download_bin' % name,
     cmd = ' '.join(cmd),
-    deps = ['//bucklets/tools:download_file'],
     out = binjar,
   )
-
   license = ':LICENSE-' + license
   if not local_license:
     license = '//lib' + license
@@ -134,30 +138,30 @@
     if src_sha1:
       cmd.extend(['-v', src_sha1])
     genrule(
-      name = name + '__download_src',
+      name = '%s__download_src' % name,
       cmd = ' '.join(cmd),
-      deps = ['//bucklets/tools:download_file'],
       out = srcjar,
     )
     prebuilt_jar(
-      name = name + '_src',
-      binary_jar = ':' + name + '__download_src',
+      name = '%s_src' % name,
+      binary_jar = ':%s__download_src' % name,
       visibility = visibility,
     )
   else:
     srcjar = None
     genrule(
-      name = name + '__download_src',
+      name = '%s_src' % name,
       cmd = ':>$OUT',
-      out = '__' + name + '__no_src',
+      out = '__%s__no_src' % name,
     )
 
   if exported_deps:
     prebuilt_jar(
-      name = name + '__jar',
+      name = '%s__jar' % name,
       deps = deps,
-      binary_jar = ':' + name + '__download_bin',
-      source_jar = ':' + name + '__download_src' if srcjar else None,
+      binary_jar = ':%s__download_bin' % name,
+      source_jar = ':%s__download_src' % name if srcjar else None,
+      visibility = visibility,
     )
     java_library(
       name = name,
@@ -168,7 +172,7 @@
     prebuilt_jar(
       name = name,
       deps = deps,
-      binary_jar = ':' + name + '__download_bin',
-      source_jar = ':' + name + '__download_src' if srcjar else None,
+      binary_jar = ':%s__download_bin' % name,
+      source_jar = ':%s__download_src' % name if srcjar else None,
       visibility = visibility,
     )
diff --git a/maven_package.bucklet b/maven_package.bucklet
index e8c855d..f758fcb 100644
--- a/maven_package.bucklet
+++ b/maven_package.bucklet
@@ -40,17 +40,14 @@
     '-v', version,
     '-o', '$OUT',
   ]
-  dep = []
 
   for type,d in [('jar', jar), ('java-source', src), ('javadoc', doc)]:
     for a,t in d.iteritems():
       cmd.append('-s %s:%s:$(location %s)' % (a,type,t))
-      dep.append(t)
 
   genrule(
     name = 'install',
     cmd = ' '.join(cmd + ['-a', 'install']),
-    deps = dep + ['//bucklets/tools:mvn'],
     out = 'install.info',
   )
 
@@ -61,6 +58,5 @@
         '-a', 'deploy',
         '--repository', repository,
         '--url', url]),
-      deps = dep + ['//bucklets/tools:mvn'],
       out = 'deploy.info',
     )
diff --git a/tools/BUCK b/tools/BUCK
index 4bdfe5a..8899928 100644
--- a/tools/BUCK
+++ b/tools/BUCK
@@ -36,11 +36,10 @@
   return environ.get('PATH')
 
 genrule(
-  name = 'buck.properties',
+  name = 'buck',
   cmd = 'echo buck=`which buck`>$OUT;' +
     ("echo PATH=\''%s'\' >>$OUT;" % shquote(os_path())),
-  deps = [],
-  out = 'buck.properties',
+  out = 'buck',
   visibility = ['PUBLIC'],
 )
 
diff --git a/tools/buckToJUnit.xsl b/tools/buckToJUnit.xsl
index 424c050..f336520 100644
--- a/tools/buckToJUnit.xsl
+++ b/tools/buckToJUnit.xsl
@@ -31,8 +31,10 @@
       <xsl:variable name="nonEmptyStacks" select="count(testresult[stacktrace != ''])"/>
       <xsl:variable name="failures"
           select="count(testresult[contains(stacktrace, 'java.lang.AssertionError')])"/>
-      <xsl:variable name="errors" select="$nonEmptyStacks - $failures"/>
-      <testsuite failures="{$failures}" time="{func:toMS(@time)}" errors="{$errors}" skipped="0"
+      <xsl:variable name="skipped"
+          select="count(testresult[contains(stacktrace, 'org.junit.internal.AssumptionViolatedException')])"/>
+      <xsl:variable name="errors" select="$nonEmptyStacks - $failures - $skipped"/>
+      <testsuite failures="{$failures}" time="{func:toMS(@time)}" errors="{$errors}" skipped="{$skipped}"
           tests="{$testCount}" name="{@name}">
         <xsl:apply-templates/>
       </testsuite>
@@ -47,7 +49,11 @@
 
   <xsl:template match="message"/>
 
-  <xsl:template match="stacktrace[. != '']">
+  <xsl:template match="stacktrace[contains(.,'org.junit.internal.AssumptionViolatedException')]">
+    <skipped/>
+  </xsl:template>
+
+  <xsl:template match="stacktrace[. != '' and not(contains(.,'org.junit.internal.AssumptionViolatedException'))]">
     <failure message="{../message}" type="{substring-before(., ':')}">
       <xsl:value-of select="."/>
     </failure>
diff --git a/tools/download_all.py b/tools/download_all.py
index 17e7ab0..0c46655 100755
--- a/tools/download_all.py
+++ b/tools/download_all.py
@@ -32,7 +32,7 @@
   if m:
     n = m.group(1)
     if args.src and n.endswith('__download_bin'):
-      n = n[:-4] + '_src'
+      n = n[:-13] + 'src'
     targets.add(n)
 r = p.wait()
 if r != 0:
diff --git a/tools/eclipse.py b/tools/eclipse.py
index 3195b2a..2d62759 100755
--- a/tools/eclipse.py
+++ b/tools/eclipse.py
@@ -31,7 +31,7 @@
 ])
 
 ROOT = path.abspath(__file__)
-for _ in range(0, 3):
+while not path.exists(path.join(ROOT, '.buckconfig')):
   ROOT = path.dirname(ROOT)
 
 opts = OptionParser()
@@ -39,14 +39,24 @@
 opts.add_option('-n', '--name')
 args, _ = opts.parse_args()
 
-def gen_project():
-  p = path.join(ROOT, '.project')
-  name = args.name if args.name else path.basename(ROOT)
+def _query_classpath(targets):
+  deps = []
+  p = Popen(['buck', 'audit', 'classpath'] + targets, stdout=PIPE)
+  for line in p.stdout:
+    deps.append(line.strip())
+  s = p.wait()
+  if s != 0:
+    exit(s)
+  return deps
+
+
+def gen_project(name, root=ROOT):
+  p = path.join(root, '.project')
   with open(p, 'w') as fd:
     print("""\
 <?xml version="1.0" encoding="UTF-8"?>
 <projectDescription>
-  <name>%s</name>
+  <name>""" + name + """</name>
   <buildSpec>
     <buildCommand>
       <name>org.eclipse.jdt.core.javabuilder</name>
@@ -56,19 +66,9 @@
     <nature>org.eclipse.jdt.core.javanature</nature>
   </natures>
 </projectDescription>\
-""" % (name,), file=fd)
+""", file=fd)
 
 def gen_classpath():
-  def query_classpath(targets):
-    deps = []
-    p = Popen(['buck', 'audit', 'classpath'] + targets, stdout=PIPE)
-    for line in p.stdout:
-      deps.append(line.strip())
-    s = p.wait()
-    if s != 0:
-      exit(s)
-    return deps
-
   def make_classpath():
     impl = minidom.getDOMImplementation()
     return impl.createDocument(None, 'classpath', None)
@@ -87,11 +87,11 @@
   src = set()
   lib = set()
 
-  java_library = re.compile(r'[^/]+/gen(.*)/lib__[^/]+__output/[^/]+[.]jar$')
-  for p in query_classpath(MAIN):
+  java_library = re.compile(r'[^/]+/gen/(.*)/lib__[^/]+__output/[^/]+[.]jar$')
+  for p in _query_classpath(MAIN):
     m = java_library.match(p)
     if m:
-      src.add(m.group(1).lstrip('/'))
+      src.add(m.group(1))
     else:
       lib.add(p)
 
@@ -99,9 +99,9 @@
     out = None
 
     if s.startswith('lib/'):
-      out = 'buck-out/eclipse/lib'
+      out = 'eclipse-out/lib'
     elif s.startswith('plugins/'):
-      out = 'buck-out/eclipse/' + s
+      out = 'eclipse-out/' + s
 
     p = path.join(s, 'java')
     if path.exists(p):
@@ -113,7 +113,7 @@
       if out:
         o = out + '/' + env
       elif env == 'test':
-        o = 'buck-out/eclipse/test'
+        o = 'eclipse-out/test'
 
       for srctype in ['java', 'resources']:
         p = path.join(s, 'src', env, srctype)
@@ -124,13 +124,13 @@
     for j in sorted(libs):
       s = None
       if j.endswith('.jar'):
-        s = j[:-4] + '-src.jar'
+        s = j[:-4] + '_src.jar'
         if not path.exists(s):
           s = None
       classpathentry('lib', j, s)
 
   classpathentry('con', JRE)
-  classpathentry('output', 'buck-out/eclipse/classes')
+  classpathentry('output', 'eclipse-out/classes')
 
   p = path.join(ROOT, '.classpath')
   with open(p, 'w') as fd:
@@ -143,11 +143,12 @@
     except CalledProcessError as err:
       exit(1)
 
-  gen_project()
+  name = args.name if args.name else path.basename(ROOT)
+  gen_project(name)
   gen_classpath()
 
   try:
-    targets = ['//bucklets/tools:buck.properties'] + MAIN
+    targets = ['//bucklets/tools:buck'] + MAIN
     check_call(['buck', 'build', '--deep'] + targets)
   except CalledProcessError as err:
     exit(1)
diff --git a/tools/pack_war.py b/tools/pack_war.py
index cfd7963..c4ffacc 100755
--- a/tools/pack_war.py
+++ b/tools/pack_war.py
@@ -18,7 +18,6 @@
 from os import getcwd, chdir, makedirs, path, symlink
 from subprocess import check_call
 import sys
-from util import check_output
 
 opts = OptionParser()
 opts.add_option('-o', help='path to write WAR to')
@@ -31,12 +30,14 @@
 root = war[:war.index('buck-out')]
 jars = set()
 
+def prune(l):
+ return [j[j.find('buck-out'):] for e in l for j in e.split(':')]
+
 def link_jars(libs, directory):
   makedirs(directory)
   while not path.isfile('.buckconfig'):
     chdir('..')
-  cp = check_output(['buck', 'audit', 'classpath'] + libs)
-  for j in cp.strip().splitlines():
+  for j in libs:
     if j not in jars:
       jars.add(j)
       n = path.basename(j)
@@ -45,9 +46,9 @@
       symlink(path.join(root, j), path.join(directory, n))
 
 if args.lib:
-  link_jars(args.lib, path.join(war, 'WEB-INF', 'lib'))
+  link_jars(prune(args.lib), path.join(war, 'WEB-INF', 'lib'))
 if args.pgmlib:
-  link_jars(args.pgmlib, path.join(war, 'WEB-INF', 'pgm-lib'))
+  link_jars(prune(args.pgmlib), path.join(war, 'WEB-INF', 'pgm-lib'))
 try:
   for s in ctx:
     check_call(['unzip', '-q', '-d', war, s])
diff --git a/war.bucklet b/war.bucklet
index 0ac346a..adc0072 100644
--- a/war.bucklet
+++ b/war.bucklet
@@ -35,20 +35,17 @@
     ):
   cmd = ['$(exe //bucklets/tools:pack_war)', '-o', '$OUT', '--tmp', '$TMP']
   for l in libs:
-    cmd.extend(['--lib', l])
+    cmd.extend(['--lib', '$(classpath %s)' % l])
   for l in pgmlibs:
-    cmd.extend(['--pgmlib', l])
+    cmd.extend(['--pgmlib', '$(classpath %s)' % l])
 
-  dep = []
   if context:
     for t in context:
-      dep.append(t)
       cmd.append('$(location %s)' % t)
 
   genrule(
     name = name,
     cmd = ' '.join(cmd),
-    deps = libs + pgmlibs + dep + ['//bucklets/tools:pack_war'],
     out = name + '.war',
     visibility = visibility,
   )