gitiles-dev: inject source path through a System property.

This makes gitiles-dev independent of the build system. It assumes
that nobody relies on .buckconfig being shipped into the gitiles jar.

Change-Id: Id3c5313061516aba835f0bc62160133913c7772e
diff --git a/gitiles-dev/src/main/java/com/google/gitiles/dev/DevServer.java b/gitiles-dev/src/main/java/com/google/gitiles/dev/DevServer.java
index faa6ee5..ccdbd6c 100644
--- a/gitiles-dev/src/main/java/com/google/gitiles/dev/DevServer.java
+++ b/gitiles-dev/src/main/java/com/google/gitiles/dev/DevServer.java
@@ -96,45 +96,13 @@
   }
 
   private static Path findSourceRoot() throws IOException {
-    URI u;
-    try {
-      u = DevServer.class.getResource(DevServer.class.getSimpleName() + ".class").toURI();
-    } catch (URISyntaxException e) {
-      u = null;
+    String prop = "com.google.gitiles.sourcePath";
+    String sourceRoot = System.getProperty(prop);
+    if (sourceRoot == null) {
+      throw new NoSuchFileException(
+        String.format("Must set system property %s to top of source directory", prop));
     }
-    if (u == null) {
-      throw new NoSuchFileException("Cannot find Gitiles source directory");
-    }
-    if ("jar".equals(u.getScheme())) {
-      String path = u.getSchemeSpecificPart();
-      int jarEntry = path.indexOf("!/");
-      if (jarEntry < 0) {
-        throw badSourceRoot(u);
-      }
-      try {
-        return findSourceRoot(new URI(path.substring(0, jarEntry)));
-      } catch (URISyntaxException e) {
-        throw badSourceRoot(u, e);
-      }
-    } else {
-      return findSourceRoot(u);
-    }
-  }
-
-  private static Path findSourceRoot(URI targetUri) throws IOException {
-    if (!"file".equals(targetUri.getScheme())) {
-      throw badSourceRoot(targetUri);
-    }
-
-    Path dir = Paths.get(targetUri.getPath());
-    while (!Files.isRegularFile(dir.resolve(".buckconfig"))) {
-      Path parent = dir.getParent();
-      if (parent == null) {
-        throw badSourceRoot(targetUri);
-      }
-      dir = parent;
-    }
-    return dir;
+    return Paths.get(sourceRoot);
   }
 
   private final Path sourceRoot;
@@ -142,7 +110,8 @@
   private final Server httpd;
 
   DevServer(File cfgFile) throws IOException, ConfigInvalidException {
-    sourceRoot = findSourceRoot();
+    // Jetty doesn't doesn't allow symlinks, so canonicalize.
+    sourceRoot = findSourceRoot().toRealPath();
 
     Config cfg = defaultConfig();
     if (cfgFile.exists() && cfgFile.isFile()) {
diff --git a/tools/run_dev.sh b/tools/run_dev.sh
index 14620d1..58493a6 100755
--- a/tools/run_dev.sh
+++ b/tools/run_dev.sh
@@ -16,12 +16,14 @@
 
 set -e
 
-ROOT="$(dirname "$0")/.."
+ROOT="$(cd $(dirname "$0")/..; pwd)"
 PROPERTIES=
 if [ "x$1" != "x" ]; then
   PROPERTIES="-Dcom.google.gitiles.configPath=$1"
 fi
 
+PROPERTIES="$PROPERTIES -Dcom.google.gitiles.sourcePath=$ROOT"
+
 (
   cd "$ROOT"
   buck build gitiles-dev:dev