Implement Bazel build

TEST PLAN:
  $ bazel test gitiles-servlet/...

Run debug version:
  $ sh {path/to/src}/tools/run_bazel_dev.sh

TODO:

 * publishing maven artifacts.
 * check out Bazel's generate_workspace.
 * intellij/eclipse project generation

Change-Id: I288011ce622536ce72c59a1961f962db9fe9e761
diff --git a/gitiles-servlet/BUILD b/gitiles-servlet/BUILD
new file mode 100644
index 0000000..ff33933
--- /dev/null
+++ b/gitiles-servlet/BUILD
@@ -0,0 +1,84 @@
+java_library(
+    name = "servlet-api",
+    neverlink = 1,
+    exports = ["//lib:servlet-api_2_5"],
+)
+
+java_library(
+    name = "servlet",
+    srcs = glob(["src/main/java/**/*.java"]),
+    resources = glob(["src/main/resources/**/*"]),
+    visibility = ["//visibility:public"],
+    deps = [
+        ":servlet-api",
+        "//blame-cache:lib",
+        "//lib:autolink",
+        "//lib:cm-autolink",
+        "//lib:commonmark",
+        "//lib:commons-lang",
+        "//lib:gfm-strikethrough",
+        "//lib:gfm-tables",
+        "//lib:gson",
+        "//lib:guava",
+        "//lib:joda-time",
+        "//lib:jsr305",
+        "//lib:prettify",
+        "//lib/guice",
+        "//lib/jgit",
+        "//lib/jgit:jgit-archive",
+        "//lib/jgit:jgit-servlet",
+        "//lib/slf4j:slf4j-api",
+        "//lib/soy",
+    ],
+)
+
+java_library(
+    name = "testutil",
+    srcs = glob(
+        ["src/test/java/**/*.java"],
+        exclude = ["src/test/java/**/*Test.java"],
+    ) + glob(["**/ServletTest.java"]),
+    deps = [
+        ":servlet",
+        "//lib:gson",
+        "//lib:guava",
+        "//lib:servlet-api_2_5",
+        "//lib:truth",
+        "//lib/jgit",
+        "//lib/jgit:jgit-servlet",
+        "//lib/jgit:junit",
+        "//lib/junit",
+    ],
+)
+
+load("//gitiles-servlet:junit.bzl", "junit_tests")
+
+junit_tests(
+    name = "ServletTests",
+    srcs = glob(
+        [
+            "src/test/java/**/*Test.java",
+        ],
+        exclude = ["**/ServletTest.java"],
+    ),
+    runtime_deps = ["//lib/junit:hamcrest-core"],
+    deps = [
+        ":servlet",
+        ":testutil",
+        "//lib:autolink",
+        "//lib:cm-autolink",
+        "//lib:commonmark",
+        "//lib:gfm-strikethrough",
+        "//lib:gfm-tables",
+        "//lib:gson",
+        "//lib:guava",
+        "//lib:joda-time",
+        "//lib:servlet-api_2_5",
+        "//lib:truth",
+        "//lib/jgit",
+        "//lib/jgit:jgit-servlet",
+        "//lib/jgit:junit",
+        "//lib/junit",
+        "//lib/soy",
+    ],
+)
diff --git a/gitiles-servlet/junit.bzl b/gitiles-servlet/junit.bzl
new file mode 100644
index 0000000..ee79637
--- /dev/null
+++ b/gitiles-servlet/junit.bzl
@@ -0,0 +1,60 @@
+# skylark rule to generate a Junit4 TestSuite
+# Assumes srcs are all .java Test files
+# Assumes junit4 is already added to deps by the user.
+
+# See https://github.com/bazelbuild/bazel/issues/1017 for background.
+
+_OUTPUT = """import org.junit.runners.Suite;
+import org.junit.runner.RunWith;
+
+@RunWith(Suite.class)
[email protected]({%s})
+public class %s {}
+"""
+
+_PREFIXES = ("org", "com", "edu")
+
+def _SafeIndex(l, val):
+    for i, v in enumerate(l):
+        if val == v:
+            return i
+    return -1
+
+def _AsClassName(fname):
+    fname = [x.path for x in fname.files][0]
+    toks = fname[:-5].split("/")
+    findex = -1
+    for s in _PREFIXES:
+        findex = _SafeIndex(toks, s)
+        if findex != -1:
+            break
+    if findex == -1:
+        fail("%s does not contain any of %s",
+                         fname, _PREFIXES)
+    return ".".join(toks[findex:]) + ".class"
+
+def _impl(ctx):
+    classes = ",".join(
+        [_AsClassName(x) for x in ctx.attr.srcs])
+    ctx.file_action(output=ctx.outputs.out, content=_OUTPUT % (
+            classes, ctx.attr.outname))
+
+_GenSuite = rule(
+    attrs = {
+        "srcs": attr.label_list(allow_files = True),
+        "outname": attr.string(),
+    },
+    outputs = {"out": "%{name}.java"},
+    implementation = _impl,
+)
+
+def junit_tests(name, srcs, **kwargs):
+    s_name = name + "TestSuite"
+    j_name = s_name + ".java",
+    _GenSuite(name=s_name,
+              srcs=srcs,
+              outname=s_name)
+    native.java_test(name=name,
+                     test_class=s_name,
+                     srcs = srcs + [":"+s_name],
+                     **kwargs)