From bdcb9cff23c30e45669882e19869908ecd42c97f Mon Sep 17 00:00:00 2001 From: David Ostrovsky Date: Thu, 21 Nov 2013 08:10:40 +0100 Subject: [PATCH] ChangeScreen2: Add 'Diff against' to select base revision Add dropdown on the Files header section to select reference version for loading the revision. Change-Id: I5c40a52b0018fea7e11ac67696ee6fb7b4674349 (cherry picked from commit 2d2a3c405e5472f27b96484b068f51c34ee5e6cb) --- .../gerrit/client/change/ChangeScreen2.java | 66 +++++++++++++++---- .../gerrit/client/change/ChangeScreen2.ui.xml | 20 ++++++ .../google/gerrit/client/diff/DiffApi.java | 10 +-- 3 files changed, 81 insertions(+), 15 deletions(-) diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/ChangeScreen2.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/ChangeScreen2.java index 3b67d157d0..c67d21f716 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/ChangeScreen2.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/ChangeScreen2.java @@ -58,6 +58,8 @@ import com.google.gwt.core.client.JsArrayString; import com.google.gwt.dom.client.AnchorElement; import com.google.gwt.dom.client.Element; import com.google.gwt.dom.client.NativeEvent; +import com.google.gwt.dom.client.SelectElement; +import com.google.gwt.event.dom.client.ChangeEvent; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.dom.client.KeyPressEvent; @@ -73,6 +75,7 @@ import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.HTMLPanel; import com.google.gwt.user.client.ui.Image; +import com.google.gwt.user.client.ui.ListBox; import com.google.gwt.user.client.ui.ToggleButton; import com.google.gwtexpui.clippy.client.CopyableLabel; import com.google.gwtexpui.globalkey.client.GlobalKey; @@ -124,6 +127,7 @@ public class ChangeScreen2 extends Screen { private Timestamp lastDisplayedUpdate; private UpdateAvailableBar updateAvailable; private boolean openReplyBox; + private boolean loaded; @UiField HTMLPanel headerLine; @UiField Style style; @@ -151,6 +155,7 @@ public class ChangeScreen2 extends Screen { @UiField CommitBox commit; @UiField RelatedChanges related; @UiField FileTable files; + @UiField ListBox diffBase; @UiField History history; @UiField Button includedIn; @@ -185,7 +190,7 @@ public class ChangeScreen2 extends Screen { @Override public void onSuccess(ChangeInfo info) { info.init(); - loadConfigInfo(info); + loadConfigInfo(info, null); } }); } @@ -194,9 +199,7 @@ public class ChangeScreen2 extends Screen { RestApi call = ChangeApi.detail(changeId.get()); ChangeList.addOptions(call, EnumSet.of( ListChangesOption.CURRENT_ACTIONS, - fg && revision != null - ? ListChangesOption.ALL_REVISIONS - : ListChangesOption.CURRENT_REVISION)); + ListChangesOption.ALL_REVISIONS)); if (!fg) { call.background(); } @@ -444,25 +447,40 @@ public class ChangeScreen2 extends Screen { collapseAll.setVisible(false); } - private void loadConfigInfo(final ChangeInfo info) { + @UiHandler("diffBase") + void onChangeRevision(ChangeEvent e) { + int idx = diffBase.getSelectedIndex(); + if (0 <= idx) { + String n = diffBase.getValue(idx); + loadConfigInfo(changeInfo, !n.isEmpty() ? n : null); + } + } + + private void loadConfigInfo(final ChangeInfo info, final String base) { info.revisions().copyKeysIntoChildren("name"); final RevisionInfo rev = resolveRevisionToDisplay(info); CallbackGroup group = new CallbackGroup(); - loadDiff(rev, myLastReply(info), group); + loadDiff(info.revisions().get(base), rev, myLastReply(info), group); loadCommit(rev, group); + + if (loaded) { + group.done(); + return; + } + RevisionInfoCache.add(changeId, rev); ConfigInfoCache.add(info); ConfigInfoCache.get(info.project_name_key(), - group.add(new ScreenLoadCallback(this) { + group.addFinal(new ScreenLoadCallback(this) { @Override protected void preDisplay(Entry result) { + loaded = true; commentLinkProcessor = result.getCommentLinkProcessor(); setTheme(result.getTheme()); renderChangeInfo(info); } })); - group.done(); } private static Timestamp myLastReply(ChangeInfo info) { @@ -478,16 +496,19 @@ public class ChangeScreen2 extends Screen { return null; } - private void loadDiff(final RevisionInfo rev, final Timestamp myLastReply, - CallbackGroup group) { + private void loadDiff(final RevisionInfo base, final RevisionInfo rev, + final Timestamp myLastReply, CallbackGroup group) { final List>> comments = loadComments(rev, group); final List>> drafts = loadDrafts(rev, group); DiffApi.list(changeId.get(), + base != null ? base.name() : null, rev.name(), group.add(new AsyncCallback>() { @Override public void onSuccess(NativeMap m) { - files.setRevisions(null, new PatchSet.Id(changeId, rev._number())); + files.setRevisions( + base != null ? new PatchSet.Id(changeId, base._number()) : null, + new PatchSet.Id(changeId, rev._number())); files.setValue(m, myLastReply, comments.get(0), drafts.get(0)); } @@ -653,6 +674,7 @@ public class ChangeScreen2 extends Screen { renderOwner(info); renderActionTextDate(info); + renderDiffBaseListBox(info); initIncludedInAction(info); initRevisionsAction(info, revision); initDownloadAction(info, revision); @@ -728,6 +750,28 @@ public class ChangeScreen2 extends Screen { actionDate.setInnerText(FormatUtil.relativeFormat(info.updated())); } + private void renderDiffBaseListBox(ChangeInfo info) { + JsArray list = info.revisions().values(); + RevisionInfo.sortRevisionInfoByNumber(list); + for (int i = list.length() - 1; i >= 0; i--) { + RevisionInfo r = list.get(i); + diffBase.addItem( + r._number() + ": " + r.name().substring(0, 6), + r.name()); + if (r.name().equals(revision)) { + SelectElement.as(diffBase.getElement()).getOptions() + .getItem(diffBase.getItemCount() - 1).setDisabled(true); + } + } + + RevisionInfo rev = info.revisions().get(revision); + JsArray parents = rev.commit().parents(); + diffBase.addItem( + parents.length() > 1 ? Util.C.autoMerge() : Util.C.baseDiffItem(), + ""); + diffBase.setSelectedIndex(diffBase.getItemCount() - 1); + } + void showUpdates(ChangeInfo newInfo) { if (!isAttached() || newInfo.updated().equals(lastDisplayedUpdate)) { return; diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/ChangeScreen2.ui.xml b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/ChangeScreen2.ui.xml index 63787e2a32..675a362ae0 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/ChangeScreen2.ui.xml +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/ChangeScreen2.ui.xml @@ -251,12 +251,27 @@ limitations under the License. .sectionHeader .headerButtons { top: 2px; height: 18px; + line-height: 18px; border-left: 1px inset #fff; padding-top: 3px; padding-bottom: 3px; } .sectionHeader button { margin-top: 0; } + .diffBase { + display: inline-block; + height: 18px; + line-height: 18px; + font-size: smaller; + font-weight: normal; + vertical-align: top; + } + .diffBase select { + margin: 0; + border: 1px solid #bbb; + font-size: smaller; + } + .replyBox { background-color: trimColor; } @@ -390,6 +405,11 @@ limitations under the License.
Files +
+
+ Diff against: +
+
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DiffApi.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DiffApi.java index 826d4772e5..89f1de19f8 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DiffApi.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DiffApi.java @@ -26,11 +26,13 @@ public class DiffApi { NONE, TRAILING, CHANGED, ALL; }; - public static void list(int id, String revision, + public static void list(int id, String base, String revision, AsyncCallback> cb) { - ChangeApi.revision(id, revision) - .view("files") - .get(NativeMap.copyKeysIntoChildren("path", cb)); + RestApi api = ChangeApi.revision(id, revision).view("files"); + if (base != null) { + api.addParameter("base", base); + } + api.get(NativeMap.copyKeysIntoChildren("path", cb)); } public static DiffApi diff(PatchSet.Id id, String path) {