ChangeScreen2: Make diff against revision persistent

2d2a3c405e added diff against to the change
screen2. However base revision is lost when side by side view is closed.

This change fixes that.

Conflicts:
	gerrit-gwtui/src/main/java/com/google/gerrit/client/change/ChangeScreen2.java

Change-Id: I7f74760fde96469a60556f657923a3936d6516c7
This commit is contained in:
David Ostrovsky
2013-11-23 23:57:50 +01:00
committed by Michael Zhou
parent bdcb9cff23
commit e786675f23
5 changed files with 79 additions and 14 deletions

View File

@@ -482,7 +482,7 @@ public class Dispatcher {
if (rest.isEmpty()) {
Gerrit.display(token, panel== null
? (isChangeScreen2()
? new ChangeScreen2(id, null, false)
? new ChangeScreen2(id, null, null, false)
: new ChangeScreen(id))
: new NotFoundScreen());
return;
@@ -515,7 +515,11 @@ public class Dispatcher {
} else {
if (panel == null) {
Gerrit.display(token, isChangeScreen2()
? new ChangeScreen2(id, String.valueOf(ps.get()), false)
? new ChangeScreen2(id,
base != null
? String.valueOf(base.get())
: null,
String.valueOf(ps.get()), false)
: new ChangeScreen(id));
} else if ("publish".equals(panel)) {
publish(ps);

View File

@@ -116,6 +116,7 @@ public class ChangeScreen2 extends Screen {
}
private final Change.Id changeId;
private String base;
private String revision;
private ChangeInfo changeInfo;
private CommentLinkProcessor commentLinkProcessor;
@@ -172,9 +173,10 @@ public class ChangeScreen2 extends Screen {
private RevisionsAction revisionsAction;
private DownloadAction downloadAction;
public ChangeScreen2(Change.Id changeId, String revision, boolean openReplyBox) {
public ChangeScreen2(Change.Id changeId, String base, String revision, boolean openReplyBox) {
this.changeId = changeId;
this.revision = revision != null && !revision.isEmpty() ? revision : null;
this.base = normalize(base);
this.revision = normalize(revision);
this.openReplyBox = openReplyBox;
add(uiBinder.createAndBindUi(this));
}
@@ -190,7 +192,7 @@ public class ChangeScreen2 extends Screen {
@Override
public void onSuccess(ChangeInfo info) {
info.init();
loadConfigInfo(info, null);
loadConfigInfo(info, base);
}
});
}
@@ -459,9 +461,10 @@ public class ChangeScreen2 extends Screen {
private void loadConfigInfo(final ChangeInfo info, final String base) {
info.revisions().copyKeysIntoChildren("name");
final RevisionInfo rev = resolveRevisionToDisplay(info);
final RevisionInfo b = resolveRevisionOrPatchSetId(info, base, null);
CallbackGroup group = new CallbackGroup();
loadDiff(info.revisions().get(base), rev, myLastReply(info), group);
loadDiff(b, rev, myLastReply(info), group);
loadCommit(rev, group);
if (loaded) {
@@ -644,19 +647,57 @@ public class ChangeScreen2 extends Screen {
}
private RevisionInfo resolveRevisionToDisplay(ChangeInfo info) {
if (revision == null) {
revision = info.current_revision();
} else if (!info.revisions().containsKey(revision)) {
RevisionInfo rev = resolveRevisionOrPatchSetId(info, revision,
info.current_revision());
if (rev != null) {
revision = rev.name();
return rev;
}
// the revision is not visible to the calling user (maybe it is a draft?)
// or the change is corrupt, take the last revision that was returned,
// if no revision was returned display an error
JsArray<RevisionInfo> revisions = info.revisions().values();
if (revisions.length() > 0) {
RevisionInfo.sortRevisionInfoByNumber(revisions);
rev = revisions.get(revisions.length() - 1);
revision = rev.name();
return rev;
} else {
new ErrorDialog(
Resources.M.changeWithNoRevisions(info.legacy_id().get())).center();
throw new IllegalStateException("no revision, cannot proceed");
}
}
/**
*
* Resolve a revision or patch set id string to RevisionInfo.
* When this view is created from the changes table, revision
* is passed as a real revision.
* When this view is created from side by side (by closing it with 'u')
* patch set id is passed.
*
* @param info change info
* @param revOrId revision or patch set id
* @param defaultValue value returned when rev is null
* @return resolved revision or default value
*/
private RevisionInfo resolveRevisionOrPatchSetId(ChangeInfo info,
String revOrId, String defaultValue) {
if (revOrId == null) {
revOrId = defaultValue;
} else if (!info.revisions().containsKey(revOrId)) {
JsArray<RevisionInfo> list = info.revisions().values();
for (int i = 0; i < list.length(); i++) {
RevisionInfo r = list.get(i);
if (revision.equals(String.valueOf(r._number()))) {
revision = r.name();
if (revOrId.equals(String.valueOf(r._number()))) {
revOrId = r.name();
break;
}
}
}
return info.revision(revision);
return revOrId != null ? info.revision(revOrId) : null;
}
private void renderChangeInfo(ChangeInfo info) {
@@ -753,6 +794,7 @@ public class ChangeScreen2 extends Screen {
private void renderDiffBaseListBox(ChangeInfo info) {
JsArray<RevisionInfo> list = info.revisions().values();
RevisionInfo.sortRevisionInfoByNumber(list);
int selectedIdx = list.length();
for (int i = list.length() - 1; i >= 0; i--) {
RevisionInfo r = list.get(i);
diffBase.addItem(
@@ -762,6 +804,9 @@ public class ChangeScreen2 extends Screen {
SelectElement.as(diffBase.getElement()).getOptions()
.getItem(diffBase.getItemCount() - 1).setDisabled(true);
}
if (base != null && base.equals(String.valueOf(r._number()))) {
selectedIdx = diffBase.getItemCount() - 1;
}
}
RevisionInfo rev = info.revisions().get(revision);
@@ -769,7 +814,8 @@ public class ChangeScreen2 extends Screen {
diffBase.addItem(
parents.length() > 1 ? Util.C.autoMerge() : Util.C.baseDiffItem(),
"");
diffBase.setSelectedIndex(diffBase.getItemCount() - 1);
diffBase.setSelectedIndex(selectedIdx);
}
void showUpdates(ChangeInfo newInfo) {
@@ -814,4 +860,8 @@ public class ChangeScreen2 extends Screen {
handlers.add(UserActivityMonitor.addValueChangeHandler(updateCheck));
}
}
private static String normalize(String r) {
return r != null && !r.isEmpty() ? r : null;
}
}

View File

@@ -80,6 +80,7 @@ class Header extends Composite {
SafeHtml.setInnerHTML(filePath, formatPath(path));
up.setTargetHistoryToken(PageLinks.toChange(
patchSetId.getParentKey(),
base != null ? String.valueOf(base.get()) : null,
String.valueOf(patchSetId.get())));
}

View File

@@ -1054,10 +1054,11 @@ public class SideBySide2 extends Screen {
private Runnable upToChange(final boolean openReplyBox) {
return new Runnable() {
public void run() {
String b = base != null ? String.valueOf(base.get()) : null;
String rev = String.valueOf(revision.get());
Gerrit.display(
PageLinks.toChange(changeId, rev),
new ChangeScreen2(changeId, rev, openReplyBox));
new ChangeScreen2(changeId, b, rev, openReplyBox));
}
};
}