Merge "Optionally, initialize site from WebAppInitializer."
diff --git a/Documentation/prolog-cookbook.txt b/Documentation/prolog-cookbook.txt
index 80f92a3..b1710a2 100644
--- a/Documentation/prolog-cookbook.txt
+++ b/Documentation/prolog-cookbook.txt
@@ -303,11 +303,11 @@
 The prolog environment running the `submit_rule` is loaded with state describing the
 change that is being evaluated. The easiest way to load this state is to test your
 `submit_rule` against a real change on a running gerrit instance. The command
-link:cmd-test-submit-rule.html[test-submit-rule] loads a specific change and executes
+link:cmd-test-submit-rule.html[test-submit rule] loads a specific change and executes
 the `submit_rule`. It optionally reads the rule from from `stdin` to facilitate easy testing.
 
 ====
-  cat rules.pl | ssh gerrit_srv gerrit test-submit-rule I45e080b105a50a625cc8e1fb5b357c0bfabe6d68 -s
+  cat rules.pl | ssh gerrit_srv gerrit test-submit rule I45e080b105a50a625cc8e1fb5b357c0bfabe6d68 -s
 ====
 
 Prolog vs Gerrit plugin for project specific submit rules
diff --git a/Documentation/rest-api-changes.txt b/Documentation/rest-api-changes.txt
index 0e0a355..65dd3a4 100644
--- a/Documentation/rest-api-changes.txt
+++ b/Documentation/rest-api-changes.txt
@@ -956,8 +956,6 @@
 ~~~~~~~~~~~~~~~~~~~
 [verse]
 'DELETE /changes/link:#change-id[\{change-id\}]'
-or
-'POST /changes/link:#change-id[\{change-id\}]/delete'
 
 Deletes a draft change.
 
@@ -1568,8 +1566,6 @@
 ~~~~~~~~~~~~~~~~~~~~~
 [verse]
 'DELETE /changes/link:#change-id[\{change-id\}]/revisions/link:#revision-id[\{revision-id\}]'
-or
-'POST /changes/link:#change-id[\{change-id\}]/revisions/link:#revision-id[\{revision-id\}]/delete'
 
 Deletes a draft revision.
 
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AdminConstants.properties b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AdminConstants.properties
index c767f84..4459bac 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AdminConstants.properties
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AdminConstants.properties
@@ -22,8 +22,8 @@
 projectRepoBrowser = Repository Browser
 useContentMerge = Automatically resolve conflicts
 useContributorAgreements = Require a valid contributor agreement to upload
-useSignedOffBy = Require <a href="http://gerrit-documentation.googlecode.com/svn/Documentation/2.5/user-signedoffby.html#Signed-off-by" target="_blank"><code>Signed-off-by</code></a> in commit message
-requireChangeID = Require <a href="http://gerrit-documentation.googlecode.com/svn/Documentation/2.5/user-changeid.html" target="_blank"><code>Change-Id</code></a> in commit message
+useSignedOffBy = Require <code>Signed-off-by</code> in commit message
+requireChangeID = Require <code>Change-Id</code> in commit message
 headingMaxObjectSizeLimit = Maximum Git object size limit
 headingGroupOptions = Group Options
 isVisibleToAll = Make group visible to all registered users.
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/RestApiServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/RestApiServlet.java
index d8a2648..6e8c6f6 100644
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/RestApiServlet.java
+++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/RestApiServlet.java
@@ -788,8 +788,12 @@
 
     List<String> p = splitProjection(projection);
     if (p.size() == 2) {
+      String viewname = p.get(1);
+      if (Strings.isNullOrEmpty(viewname)) {
+        viewname = "/";
+      }
       RestView<RestResource> view =
-          views.get(p.get(0), method + "." + p.get(1));
+          views.get(p.get(0), method + "." + viewname);
       if (view != null) {
         return new ViewData(p.get(0), view);
       }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteDraftChange.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteDraftChange.java
index f47c278..7d3a012 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteDraftChange.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteDraftChange.java
@@ -34,7 +34,8 @@
 
 import java.io.IOException;
 
-public class DeleteDraftChange implements RestModifyView<ChangeResource, Input> {
+public class DeleteDraftChange implements
+    RestModifyView<ChangeResource, Input>, UiAction<ChangeResource> {
   public static class Input {
   }
 
@@ -74,26 +75,16 @@
     return Response.none();
   }
 
-  static class Action extends DeleteDraftChange implements UiAction<ChangeResource> {
-    @Inject
-    public Action(Provider<ReviewDb> dbProvider,
-        GitRepositoryManager gitManager,
-        GitReferenceUpdated gitRefUpdated,
-        PatchSetInfoFactory patchSetInfoFactory) {
-      super(dbProvider, gitManager, gitRefUpdated, patchSetInfoFactory);
-    }
-
-    @Override
-    public UiAction.Description getDescription(ChangeResource rsrc) {
-      try {
-        return new UiAction.Description()
-          .setTitle(String.format("Delete Draft Change %d",
-              rsrc.getChange().getChangeId()))
-          .setVisible(rsrc.getChange().getStatus() == Status.DRAFT
-              && rsrc.getControl().canDeleteDraft(dbProvider.get()));
-      } catch (OrmException e) {
-        throw new IllegalStateException(e);
-      }
+  @Override
+  public UiAction.Description getDescription(ChangeResource rsrc) {
+    try {
+      return new UiAction.Description()
+        .setTitle(String.format("Delete Draft Change %d",
+            rsrc.getChange().getChangeId()))
+        .setVisible(rsrc.getChange().getStatus() == Status.DRAFT
+            && rsrc.getControl().canDeleteDraft(dbProvider.get()));
+    } catch (OrmException e) {
+      throw new IllegalStateException(e);
     }
   }
 }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteDraftPatchSet.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteDraftPatchSet.java
index dd20a38..d4e17d6 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteDraftPatchSet.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteDraftPatchSet.java
@@ -38,7 +38,8 @@
 
 import java.io.IOException;
 
-public class DeleteDraftPatchSet implements RestModifyView<RevisionResource, Input> {
+public class DeleteDraftPatchSet implements RestModifyView<RevisionResource, Input>,
+    UiAction<RevisionResource> {
   public static class Input {
   }
 
@@ -80,6 +81,24 @@
     return Response.none();
   }
 
+  @Override
+  public UiAction.Description getDescription(RevisionResource rsrc) {
+    PatchSet.Id current = rsrc.getChange().currentPatchSetId();
+    try {
+      int psCount = dbProvider.get().patchSets()
+          .byChange(rsrc.getChange().getId()).toList().size();
+      return new UiAction.Description()
+        .setTitle(String.format("Delete Draft Revision %d",
+            rsrc.getPatchSet().getPatchSetId()))
+        .setVisible(rsrc.getPatchSet().isDraft()
+            && rsrc.getPatchSet().getId().equals(current)
+            && rsrc.getControl().canDeleteDraft(dbProvider.get())
+            && psCount > 1);
+    } catch (OrmException e) {
+      throw new IllegalStateException(e);
+    }
+  }
+
   private void deleteDraftPatchSet(PatchSet patchSet, Change change)
       throws ResourceNotFoundException, OrmException, IOException {
     try {
@@ -139,32 +158,4 @@
       }
     });
   }
-
-  static class Action extends DeleteDraftPatchSet implements UiAction<RevisionResource> {
-    @Inject
-    public Action(Provider<ReviewDb> dbProvider,
-        GitRepositoryManager gitManager,
-        GitReferenceUpdated gitRefUpdated,
-        PatchSetInfoFactory patchSetInfoFactory) {
-      super(dbProvider, gitManager, gitRefUpdated, patchSetInfoFactory);
-    }
-
-    @Override
-    public UiAction.Description getDescription(RevisionResource rsrc) {
-      PatchSet.Id current = rsrc.getChange().currentPatchSetId();
-      try {
-        int psCount = dbProvider.get().patchSets()
-            .byChange(rsrc.getChange().getId()).toList().size();
-        return new UiAction.Description()
-          .setTitle(String.format("Delete Draft Revision %d",
-              rsrc.getPatchSet().getPatchSetId()))
-          .setVisible(rsrc.getPatchSet().isDraft()
-              && rsrc.getPatchSet().getId().equals(current)
-              && rsrc.getControl().canDeleteDraft(dbProvider.get())
-              && psCount > 1);
-      } catch (OrmException e) {
-        throw new IllegalStateException(e);
-      }
-    }
-  }
 }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/Module.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/Module.java
index d292880..25bd80f 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/Module.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/Module.java
@@ -50,7 +50,6 @@
     put(CHANGE_KIND, "topic").to(PutTopic.class);
     delete(CHANGE_KIND, "topic").to(PutTopic.class);
     delete(CHANGE_KIND).to(DeleteDraftChange.class);
-    post(CHANGE_KIND, "delete").to(DeleteDraftChange.Action.class);
     post(CHANGE_KIND, "abandon").to(Abandon.class);
     post(CHANGE_KIND, "publish").to(Publish.CurrentRevision.class);
     post(CHANGE_KIND, "restore").to(Restore.class);
@@ -68,7 +67,6 @@
     post(REVISION_KIND, "cherrypick").to(CherryPick.class);
     get(REVISION_KIND, "commit").to(GetCommit.class);
     delete(REVISION_KIND).to(DeleteDraftPatchSet.class);
-    post(REVISION_KIND, "delete").to(DeleteDraftPatchSet.Action.class);
     get(REVISION_KIND, "mergeable").to(Mergeable.class);
     post(REVISION_KIND, "publish").to(Publish.class);
     get(REVISION_KIND, "related").to(GetRelated.class);
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeOp.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeOp.java
index f09015b..c4d06d2 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeOp.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeOp.java
@@ -509,7 +509,7 @@
           if (rw.isMergedInto(commit, branchTip)) {
             commit.statusCode = CommitMergeStatus.ALREADY_MERGED;
             try {
-              setMergedPatchSet(chg.getId(), ps.getId());
+              setMerged(chg, null);
             } catch (OrmException e) {
               log.error("Cannot mark change " + chg.getId() + " merged", e);
             }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/CommentSender.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/CommentSender.java
index 5b3f59a..cd6409e 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/CommentSender.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/mail/CommentSender.java
@@ -170,7 +170,6 @@
     CommentRange range = comment.getRange();
     if (range != null) {
       String prefix = String.format("Line %d: ", range.getStartLine());
-      out.append(prefix);
       for (int n = range.getStartLine(); n <= range.getEndLine(); n++) {
         out.append(n == range.getStartLine()
             ? prefix
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/DispatchCommandProvider.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/DispatchCommandProvider.java
index c7594bc..ce1da95 100644
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/DispatchCommandProvider.java
+++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/DispatchCommandProvider.java
@@ -60,10 +60,7 @@
     return new RegistrationHandle() {
       @Override
       public void remove() {
-        if (!m.remove(name.value(), commandProvider)) {
-          throw new IllegalStateException(String.format(
-              "can not unregister command: %s", name.value()));
-        }
+        m.remove(name.value(), commandProvider);
       }
     };
   }
@@ -71,11 +68,12 @@
   public RegistrationHandle replace(final CommandName name,
       final Provider<Command> cmd) {
     final ConcurrentMap<String, CommandProvider> m = getMap();
-    m.put(name.value(), new CommandProvider(cmd, null));
+    final CommandProvider commandProvider = new CommandProvider(cmd, null);
+    m.put(name.value(), commandProvider);
     return new RegistrationHandle() {
       @Override
       public void remove() {
-        m.remove(name.value(), cmd);
+        m.remove(name.value(), commandProvider);
       }
     };
   }
diff --git a/plugins/commit-message-length-validator b/plugins/commit-message-length-validator
index 9f988c6..45f347d 160000
--- a/plugins/commit-message-length-validator
+++ b/plugins/commit-message-length-validator
@@ -1 +1 @@
-Subproject commit 9f988c6e5b1e07f66479f0d4d08537281fa4694f
+Subproject commit 45f347d0e258ef7b871b046bfa96b9f902063b10
diff --git a/plugins/replication b/plugins/replication
index 3fffd16..d4871d5 160000
--- a/plugins/replication
+++ b/plugins/replication
@@ -1 +1 @@
-Subproject commit 3fffd16403c1d3a4d6f0b13e9f33f4f78df1f6b4
+Subproject commit d4871d5df64d6968f2b256766dc8fa9a8133fdac
diff --git a/plugins/reviewnotes b/plugins/reviewnotes
index 1fac69b..d470050 160000
--- a/plugins/reviewnotes
+++ b/plugins/reviewnotes
@@ -1 +1 @@
-Subproject commit 1fac69b085cf67706a3a124df366d55e1976cd21
+Subproject commit d47005095fcf3bc918a1dda62d21988cc6e470e6