Merge "Fix possible NPEs in ReplaceRequest.cmd usage in ReceiveCommits"
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/GerritResources.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/GerritResources.java
index b5c0900..d763ff1 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/GerritResources.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/GerritResources.java
@@ -39,4 +39,7 @@
 
   @Source("redNot.png")
   public ImageResource redNot();
+
+  @Source("downloadIcon.png")
+  public ImageResource downloadIcon();
 }
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/downloadIcon.png b/gerrit-gwtui/src/main/java/com/google/gerrit/client/downloadIcon.png
new file mode 100644
index 0000000..22ff495
--- /dev/null
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/downloadIcon.png
Binary files differ
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/PatchConstants.properties b/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/PatchConstants.properties
index 694ccb4..9612d05 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/PatchConstants.properties
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/PatchConstants.properties
@@ -45,7 +45,7 @@
 
 reviewedAnd = Reviewed &
 next = next
-download = (Download)
+download = Download
 
 fileTypeSymlink = Type: Symbolic Link
 fileTypeGitlink = Type: Git Commit in Subproject
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/PatchSetSelectBox.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/PatchSetSelectBox.java
index 5dd4e1f..484db7c 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/PatchSetSelectBox.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/PatchSetSelectBox.java
@@ -21,16 +21,18 @@
 import com.google.gerrit.reviewdb.client.Patch;
 import com.google.gerrit.reviewdb.client.PatchSet;
 import com.google.gwt.core.client.GWT;
-import com.google.gwt.dom.client.SpanElement;
+import com.google.gwt.dom.client.DivElement;
+import com.google.gwt.dom.client.Style.Display;
 import com.google.gwt.event.dom.client.ClickEvent;
 import com.google.gwt.event.dom.client.ClickHandler;
 import com.google.gwt.resources.client.CssResource;
 import com.google.gwt.uibinder.client.UiBinder;
 import com.google.gwt.uibinder.client.UiField;
+import com.google.gwt.user.client.DOM;
 import com.google.gwt.user.client.ui.Anchor;
 import com.google.gwt.user.client.ui.Composite;
 import com.google.gwt.user.client.ui.HTMLPanel;
-import com.google.gwt.user.client.ui.Label;
+import com.google.gwt.user.client.ui.Image;
 import com.google.gwtorm.client.KeyUtil;
 
 import java.util.LinkedList;
@@ -46,6 +48,8 @@
     String selected();
 
     String hidden();
+
+    String downloadLink();
   }
 
   public enum Side {
@@ -68,7 +72,7 @@
   BoxStyle style;
 
   @UiField
-  SpanElement sideMarker;
+  DivElement sideMarker;
 
   public PatchSetSelectBox(Side side, final PatchScreen.Type type) {
     this.side = side;
@@ -88,12 +92,20 @@
 
     if (screenType == PatchScreen.Type.UNIFIED) {
       sideMarker.setInnerText((side == Side.A) ? "(-)" : "(+)");
+    } else {
+      sideMarker.getStyle().setDisplay(Display.NONE);
     }
 
+    Anchor baseLink = null;
     if (detail.getInfo().getParents().size() > 1) {
-      addLink(PatchUtil.C.patchBaseAutoMerge(), null);
+      baseLink = createLink(PatchUtil.C.patchBaseAutoMerge(), null);
     } else {
-      addLink(PatchUtil.C.patchBase(), null);
+      baseLink = createLink(PatchUtil.C.patchBase(), null);
+    }
+
+    links.add(baseLink);
+    if (screenType == PatchScreen.Type.UNIFIED || side == Side.A) {
+      linkPanel.add(baseLink);
     }
 
     if (side == Side.B) {
@@ -102,7 +114,9 @@
 
     for (Patch patch : script.getHistory()) {
       PatchSet.Id psId = patch.getKey().getParentKey();
-      addLink(Integer.toString(psId.get()), psId);
+      Anchor anchor = createLink(Integer.toString(psId.get()), psId);
+      links.add(anchor);
+      linkPanel.add(anchor);
     }
 
     if (idActive == null && side == Side.A) {
@@ -111,14 +125,13 @@
       links.get(idActive.get()).setStyleName(style.selected());
     }
 
-    Anchor downloadLink = getDownloadLink();
+    Anchor downloadLink = createDownloadLink();
     if (downloadLink != null) {
-      linkPanel.add(new Label(" - "));
       linkPanel.add(downloadLink);
     }
   }
 
-  private void addLink(String label, final PatchSet.Id id) {
+  private Anchor createLink(String label, final PatchSet.Id id) {
     final Anchor anchor = new Anchor(label);
     anchor.addClickHandler(new ClickHandler() {
       @Override
@@ -143,11 +156,10 @@
 
     });
 
-    links.add(anchor);
-    linkPanel.add(anchor);
+    return anchor;
   }
 
-  private Anchor getDownloadLink() {
+  private Anchor createDownloadLink() {
     boolean isCommitMessage = Patch.COMMIT_MSG.equals(script.getNewName());
 
     if (isCommitMessage || (side == Side.A && 0 >= script.getA().size())
@@ -161,8 +173,14 @@
     String sideURL = (side == Side.A) ? "1" : "0";
     final String base = GWT.getHostPageBaseURL() + "cat/";
 
-    final Anchor anchor = new Anchor(PatchUtil.C.download());
+    Image image = new Image(Gerrit.RESOURCES.downloadIcon());
+
+    final Anchor anchor = new Anchor();
     anchor.setHref(base + KeyUtil.encode(key.toString()) + "^" + sideURL);
+    anchor.setTitle(PatchUtil.C.download());
+    anchor.setStyleName(style.downloadLink());
+    DOM.insertBefore(anchor.getElement(), image.getElement(),
+        DOM.getFirstChild(anchor.getElement()));
 
     return anchor;
   }
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/PatchSetSelectBox.ui.xml b/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/PatchSetSelectBox.ui.xml
index 2c4bd5d..2fd183c 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/PatchSetSelectBox.ui.xml
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/PatchSetSelectBox.ui.xml
@@ -28,18 +28,21 @@
 
     .wrapper {
       width: 100%;
+      text-align: center;
+      font-size: 0; /* inline-block spacing fix */
     }
 
-    .patchSetLabel {
-      font-weight: bold;
+    .linkPanel {
+      display: inline-block;
     }
 
     .linkPanel > div {
       display: inline-block;
-      padding: 3px;
+      float: left;
     }
 
     .linkPanel {
+      overflow: hidden; /* div clear fix */
       font-size: 12px;
     }
 
@@ -47,6 +50,27 @@
       padding: 3px;
       display: inline-block;
       text-decoration: none;
+      float: left;
+    }
+
+    .patchSetLabel {
+      font-weight: bold;
+      float: left;
+      padding: 3px;
+    }
+
+    .sideMarker {
+      padding: 3px;
+    }
+
+    .downloadLink {
+      float: left;
+      padding: 1px !important;
+      margin-left: 3px;
+    }
+
+    .downloadLink > a {
+      text-size: 0;
     }
 
     .selected {
@@ -56,6 +80,7 @@
 
     .sideMarker {
       font-family: monospace;
+      float: left;
     }
 
     .hidden {
@@ -64,7 +89,10 @@
   </ui:style>
 
   <g:HTMLPanel styleName='wrapper'>
-    <g:HTMLPanel styleName='{style.linkPanel}' ui:field='linkPanel'><span class='{style.patchSetLabel}'><ui:text from="{cons.patchSet}" /></span> <span class='{style.sideMarker}' ui:field='sideMarker'></span>: </g:HTMLPanel>
+    <g:HTMLPanel styleName='{style.linkPanel}' ui:field='linkPanel'>
+      <div class='{style.patchSetLabel}'><ui:text from="{cons.patchSet}" /></div>
+      <div class='{style.sideMarker}' ui:field='sideMarker'></div>
+    </g:HTMLPanel>
   </g:HTMLPanel>
 </ui:UiBinder>
 
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/PatchTableHeaderSideBySide.ui.xml b/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/PatchTableHeaderSideBySide.ui.xml
index 424e6e5..d6fd717 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/PatchTableHeaderSideBySide.ui.xml
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/PatchTableHeaderSideBySide.ui.xml
@@ -26,6 +26,7 @@
       width: 100%;
       background-color: trimColor;
       overflow: hidden;
+      font-size: 0; /* inline-block spacing fix */
     }
 
     .wrapper .box {
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/PatchTableHeaderUnified.ui.xml b/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/PatchTableHeaderUnified.ui.xml
index e26e96a..24acfa3 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/PatchTableHeaderUnified.ui.xml
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/PatchTableHeaderUnified.ui.xml
@@ -24,6 +24,7 @@
     .wrapper {
       width: 100%;
       background-color: trimColor;
+      font-size: 0; /* inline-block spacing fix */
     }
 
     .wrapper .box {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceiveCommits.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceiveCommits.java
index 7562fee..4d80193 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceiveCommits.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceiveCommits.java
@@ -856,7 +856,7 @@
       } else {
         errors.put(Error.UPDATE, ctl.getRefName());
       }
-      reject(cmd, "can not update the reference as a fast forward");
+      reject(cmd);
     }
   }