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.
Change-Id: I7f74760fde96469a60556f657923a3936d6516c7
This commit is contained in:
David Ostrovsky
2013-11-23 23:57:50 +01:00
committed by Shawn Pearce
parent b572c146b2
commit eaeb9ad104
5 changed files with 68 additions and 21 deletions

View File

@@ -58,6 +58,15 @@ public class PageLinks {
return "/c/" + c + "/" + p;
}
public static String toChange(Change.Id c, String b, String p) {
String u = "/c/" + c + "/";
if (b != null) {
u += b + "..";
}
u += p;
return u;
}
public static String toChange(final PatchSet.Id ps) {
return "/c/" + ps.getParentKey() + "/" + ps.get();
}

View File

@@ -491,7 +491,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;
@@ -524,7 +524,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;
@@ -170,9 +171,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));
}
@@ -188,7 +190,7 @@ public class ChangeScreen2 extends Screen {
@Override
public void onSuccess(ChangeInfo info) {
info.init();
loadConfigInfo(info, null);
loadConfigInfo(info, base);
}
});
}
@@ -509,9 +511,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) {
@@ -677,20 +680,10 @@ public class ChangeScreen2 extends Screen {
}
private RevisionInfo resolveRevisionToDisplay(ChangeInfo info) {
if (revision == null) {
revision = info.current_revision();
} else if (!info.revisions().containsKey(revision)) {
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();
break;
}
}
}
RevisionInfo rev = revision != null ? info.revision(revision) : null;
RevisionInfo rev = resolveRevisionOrPatchSetId(info, revision,
info.current_revision());
if (rev != null) {
revision = rev.name();
return rev;
}
@@ -710,6 +703,36 @@ public class ChangeScreen2 extends Screen {
}
}
/**
*
* 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 (revOrId.equals(String.valueOf(r._number()))) {
revOrId = r.name();
break;
}
}
}
return revOrId != null ? info.revision(revOrId) : null;
}
private void renderChangeInfo(ChangeInfo info) {
changeInfo = info;
lastDisplayedUpdate = info.updated();
@@ -811,6 +834,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(
@@ -820,6 +844,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);
@@ -827,7 +854,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) {
@@ -872,4 +900,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

@@ -81,6 +81,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

@@ -1057,10 +1057,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));
}
};
}