diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/PageLinks.java b/gerrit-common/src/main/java/com/google/gerrit/common/PageLinks.java index 9e64aaebd9..bd5816abbc 100644 --- a/gerrit-common/src/main/java/com/google/gerrit/common/PageLinks.java +++ b/gerrit-common/src/main/java/com/google/gerrit/common/PageLinks.java @@ -70,6 +70,10 @@ public class PageLinks { return "/admin/projects/" + p.get() + ",access"; } + public static String toProjectBranches(Project.NameKey p) { + return "/admin/projects/" + p.get() + ",branches"; + } + public static String toAccountQuery(String fullname, Status status) { return toChangeQuery(op("owner", fullname) + " " + status(status), TOP); } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/GerritCss.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/GerritCss.java index 9842049410..5bc15d349b 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/GerritCss.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/GerritCss.java @@ -106,6 +106,7 @@ public interface GerritCss extends CssResource { String downloadLinkListCell(); String downloadLink_Active(); String drafts(); + String editHeadButton(); String emptySection(); String errorDialog(); String errorDialogButtons(); diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AdminConstants.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AdminConstants.java index 7affd1ce45..2f26ad9d90 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AdminConstants.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AdminConstants.java @@ -92,6 +92,8 @@ public interface AdminConstants extends Constants { String initialRevision(); String buttonAddBranch(); String buttonDeleteBranch(); + String saveHeadButton(); + String cancelHeadButton(); String groupItemHelp(); 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 fa1dc87367..f06d657508 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 @@ -71,6 +71,8 @@ columnBranchRevision = Revision initialRevision = Initial Revision buttonAddBranch = Create Branch buttonDeleteBranch = Delete +saveHeadButton = Save +cancelHeadButton = Cancel groupItemHelp = group diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ProjectBranchesScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ProjectBranchesScreen.java index 04d407ec34..b7c82fbc3a 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ProjectBranchesScreen.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ProjectBranchesScreen.java @@ -25,10 +25,13 @@ import com.google.gerrit.client.access.ProjectAccessInfo; import com.google.gerrit.client.projects.BranchInfo; import com.google.gerrit.client.projects.ProjectApi; import com.google.gerrit.client.rpc.GerritCallback; +import com.google.gerrit.client.rpc.NativeString; import com.google.gerrit.client.rpc.Natives; import com.google.gerrit.client.rpc.ScreenLoadCallback; import com.google.gerrit.client.ui.FancyFlexTable; import com.google.gerrit.client.ui.HintTextBox; +import com.google.gerrit.client.ui.OnEditEnabler; +import com.google.gerrit.common.PageLinks; import com.google.gerrit.reviewdb.client.Branch; import com.google.gerrit.reviewdb.client.Project; import com.google.gwt.core.client.JsArray; @@ -47,8 +50,11 @@ import com.google.gwt.user.client.ui.CheckBox; import com.google.gwt.user.client.ui.FlexTable.FlexCellFormatter; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.Grid; +import com.google.gwt.user.client.ui.Image; +import com.google.gwt.user.client.ui.InlineLabel; import com.google.gwt.user.client.ui.TextBox; import com.google.gwt.user.client.ui.Widget; +import com.google.gwtexpui.globalkey.client.NpTextBox; import com.google.gwtexpui.safehtml.client.SafeHtmlBuilder; import java.util.Comparator; @@ -371,7 +377,11 @@ public class ProjectBranchesScreen extends ProjectScreen { table.setText(row, 2, k.getShortName()); if (k.revision() != null) { - table.setText(row, 3, k.revision()); + if ("HEAD".equals(k.getShortName())) { + setHeadRevision(row, 3, k.revision()); + } else { + table.setText(row, 3, k.revision()); + } } else { table.setText(row, 3, ""); } @@ -400,6 +410,92 @@ public class ProjectBranchesScreen extends ProjectScreen { setRowItem(row, k); } + private void setHeadRevision(final int row, final int column, + final String rev) { + AccessMap.get(getProjectKey(), + new GerritCallback() { + @Override + public void onSuccess(ProjectAccessInfo result) { + if (result.isOwner()) { + table.setWidget(row, column, getHeadRevisionWidget(rev)); + } else { + table.setText(row, 3, rev); + } + } + }); + } + + private Widget getHeadRevisionWidget(final String headRevision) { + FlowPanel p = new FlowPanel(); + final InlineLabel l = new InlineLabel(headRevision); + final Image edit = new Image(Gerrit.RESOURCES.edit()); + edit.addStyleName(Gerrit.RESOURCES.css().editHeadButton()); + + final NpTextBox input = new NpTextBox(); + input.setVisibleLength(35); + input.setValue(headRevision); + input.setVisible(false); + final Button save = new Button(); + save.setText(Util.C.saveHeadButton()); + save.setVisible(false); + save.setEnabled(false); + final Button cancel = new Button(); + cancel.setText(Util.C.cancelHeadButton()); + cancel.setVisible(false); + + OnEditEnabler e = new OnEditEnabler(save); + e.listenTo(input); + + edit.addClickHandler(new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + l.setVisible(false); + edit.setVisible(false); + input.setVisible(true); + save.setVisible(true); + cancel.setVisible(true); + } + }); + save.addClickHandler(new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + save.setEnabled(false); + ProjectApi.setHead(getProjectKey(), input.getValue().trim(), + new GerritCallback() { + @Override + public void onSuccess(NativeString result) { + Gerrit.display(PageLinks.toProjectBranches(getProjectKey())); + } + + @Override + public void onFailure(Throwable caught) { + super.onFailure(caught); + save.setEnabled(true); + } + }); + } + }); + cancel.addClickHandler(new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + l.setVisible(true); + edit.setVisible(true); + input.setVisible(false); + input.setValue(headRevision); + save.setVisible(false); + save.setEnabled(false); + cancel.setVisible(false); + } + }); + + p.add(l); + p.add(edit); + p.add(input); + p.add(save); + p.add(cancel); + return p; + } + boolean hasBranchCanDelete() { return canDelete; } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/gerrit.css b/gerrit-gwtui/src/main/java/com/google/gerrit/client/gerrit.css index 48cabe7af9..21dcbd1828 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/gerrit.css +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/gerrit.css @@ -1571,6 +1571,11 @@ a:hover.downloadLink { padding: 2px 6px 1px; } +.editHeadButton { + float: right; + cursor: pointer; +} + /** PluginListScreen **/ .pluginsTable { } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/projects/ProjectApi.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/projects/ProjectApi.java index ebae86aa5e..adc2a64dc3 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/projects/ProjectApi.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/projects/ProjectApi.java @@ -136,6 +136,14 @@ public class ProjectApi { } } + public static void setHead(Project.NameKey name, String ref, + AsyncCallback cb) { + RestApi call = project(name).view("HEAD"); + HeadInput input = HeadInput.create(); + input.setRef(ref); + call.put(input, cb); + } + public static RestApi project(Project.NameKey name) { return new RestApi("/projects/").id(name.get()); } @@ -229,4 +237,15 @@ public class ProjectApi { final native void setDescription(String d) /*-{ if(d)this.description=d; }-*/; } + + private static class HeadInput extends JavaScriptObject { + static HeadInput create() { + return createObject().cast(); + } + + protected HeadInput() { + } + + final native void setRef(String r) /*-{ if(r)this.ref=r; }-*/; + } }