Revision: Allow @-sign in ref names

git-check-ref-format(1) explains:

 Git imposes the following rules on how references are named:

   8. They cannot contain a sequence @{.
   9. They cannot be the single character @.

An @-sign in the middle of a ref name is fine and unambiguous,
so allow it.

Noticed in the chromium/chromium/src repo:

 https://chromium.googlesource.com/chromium/src/+/refs/experimental/aarontag@chromium.org/cookie_dev_test

produces

 Cannot parse URL as a Gitiles URL

instead of showing that ref.

Bug: https://crbug.com/979850
Change-Id: Ie88daf76550e47f2da4e97acaa8081ef15e11831
diff --git a/java/com/google/gitiles/RevisionParser.java b/java/com/google/gitiles/RevisionParser.java
index d530cdd..b736f7f 100644
--- a/java/com/google/gitiles/RevisionParser.java
+++ b/java/com/google/gitiles/RevisionParser.java
@@ -212,7 +212,10 @@
   private static boolean isValidRevision(String revision) {
     // Disallow some uncommon but valid revision expressions that either we
     // don't support or we represent differently in our URLs.
-    return !revision.contains(":") && !revision.contains("^{") && !revision.contains("@");
+    return !revision.contains(":")
+        && !revision.contains("^{")
+        && !revision.contains("@{")
+        && !revision.equals("@");
   }
 
   private boolean isVisible(RevWalk walk, Result result) throws IOException {
diff --git a/javatests/com/google/gitiles/RevisionParserTest.java b/javatests/com/google/gitiles/RevisionParserTest.java
index a204b61..80781aa 100644
--- a/javatests/com/google/gitiles/RevisionParserTest.java
+++ b/javatests/com/google/gitiles/RevisionParserTest.java
@@ -256,6 +256,14 @@
   }
 
   @Test
+  public void parseEmailInRevision() throws Exception {
+    RevCommit c = repo.commit().create();
+    RevCommit experimental = repo.update("refs/experimental/author@example.com/foo", c);
+    assertThat(parser.parse("refs/experimental/author@example.com/foo"))
+        .isEqualTo(new Result(Revision.peeled("refs/experimental/author@example.com/foo", c)));
+  }
+
+  @Test
   public void parseMissingSha() throws Exception {
     assertThat(parser.parse("deadbeef")).isNull();
     assertThat(parser.parse("deadbeefdeadbeefdeadbeefdeadbeefdeadbeef")).isNull();